C++超詳細講解逗號操作符
一、逗號操作符
逗號操符( , )可以構成逗號表達式
- 逗號表達式用于將多個子表達式連接為一個表達式
- 逗號表達式的值為最后一個子表達式的值
- 逗號表達式中的前 N-1 個子表達式可以沒有返回值
- 逗號表達式按照從左向右的順序計算每個子表達式的值

下面看一個逗號表達式的示例:
#include <iostream>
using namespace std;
void func(int i)
{
cout << "func(): i = " << i << endl;
}
int main()
{
int a[3][3] = {
(0, 1, 2),
(3, 4, 5),
(6, 7, 8)
};
int i = 0;
int j = 0;
while(i < 5)
func(i),
i++;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
cout << a[i][j] << endl;
}
}
(i, j) = 6;
cout << "i = " << i << endl;
cout << "j = " << j << endl;
return 0;
}輸出結(jié)果如下:

注意三點:
1.使用括號,就不是初始化的方式,就變成了逗號表達式。要想其變成真正的初始化語句,需要把圓括號改成花括號。即
int a[3][3] = {
{0, 1, 2},
{3, 4, 5},
{6, 7, 8}
};2.這個
while(i < 5)
func(i),
i++;等價于
while(i < 5)
{
func(i);
i++;
}3.(i, j) = 6; 按照逗號表達式的規(guī)則,就是等價于 j = 6;
二、重載逗號操作符
- 在C++ 中重載逗號操作符是合法的
- 使用全局函數(shù)對逗號操作符進行重載
- 重載函數(shù)的參數(shù)必須有一個是類類型
- 重載函數(shù)的返回值類型必須是引用

下面來嘗試一下重載逗號操作符:
#include <iostream>
using namespace std;
class Test
{
int mValue;
public:
Test(int i)
{
mValue = i;
}
int value()
{
return mValue;
}
};
Test& operator , (const Test& a, const Test& b)
{
return const_cast<Test&>(b);
}
Test func(Test& i)
{
cout << "func(): i = " << i.value() << endl;
return i;
}
int main()
{
Test t0(0);
Test t1(1);
Test tt = (func(t0), func(t1));
cout << tt.value() << endl;
return 0;
}輸出結(jié)果如下:

其中
Test tt = (func(t0), func(t1));
等價于:
Test tt = (operator , (func(t0), func(t1)));
問題的本質(zhì)分析
- C++ 通過函數(shù)調(diào)用擴展操作符的功能
- 進入函數(shù)體前必須完成所有參數(shù)的計算
- 函數(shù)參數(shù)的計算次序是不定的
- 重載后無法嚴格從左向右計算表達式
可以看一下不重載會輸出什么,把下面這段注釋掉。
Test& operator , (const Test& a, const Test& b)
{
return const_cast<Test&>(b);
}輸出如下:

可以看到不重載逗號操作符是按照從左到右執(zhí)行,重載后反而不正常了,所以逗號操作符沒有重載的必要。
注意事項:工程中不要重載逗號操作符?。?!
三、小結(jié)
- 逗號表達式從左向右順序計算每個子表達式的值
- 逗號表達式的值為最后一個子表達式的值
- 操作符重載無法完全實現(xiàn)逗號操作符的原生意義
- 工程開發(fā)中不要重載逗號操作符
到此這篇關于C++超詳細講解逗號操作符的文章就介紹到這了,更多相關C++逗號操作符內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
c++ 類函數(shù)作為模板參數(shù)實現(xiàn)方式詳解
這篇文章主要介紹了c++ 類函數(shù)作為模板參數(shù)實現(xiàn)方式,在實現(xiàn)中加入增強邏輯,這種方式對代碼侵入性過高,而且無法控制該邏輯是否需要,如果不需要的話又得重新修改代碼實現(xiàn),需要的朋友可以參考下2023-03-03

