【C++深度剖析學習總結】 39 逗號操作符分析
作者 CodeAllen ,轉載請註明出處
1.逗號操作符
逗號操作符(,)可以構成逗號表達式
- 逗號表達式用於將多個子表達式連接爲一個表達式
- 逗號表達式的值爲最後一個子表達式的值
- 逗號表達式中的前N-1個子表達式可以沒有返回值
- 逗號表達式按照從左向右的順序計算每個子表達式的值
exp1,exp2,exp3,。。。,expN //從做向進行
實驗1 逗號表達式的示例
#include <iostream>
#include <string>
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)
};
/*此處(0,1,2)爲逗號表達式,所以()最終的值爲2,之後依次是5,8,若想要此處原樣輸出,則應改爲花括號即可
{0, 1, 2},
{3, 4, 5},
{6, 7, 8}
*/
int i = 0;
int j = 0;
while( i < 5 ) //不帶花括號,while的作用範圍就是後邊一行
func(i), //注意,這裏後邊的逗號相當於還有一天語句,也就是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;
}
運行結果
func() : i = 0
func() : i = 1
func() : i = 2
func() : i = 3
func() : i = 4
2
5
8
0
0
0
0
0
0
i = 3
j = 6
2.重載逗號操作符
在C++中重載逗號操作符是合法的
使用全局函數對逗號操作符進行重載
重載函數的參數必須有一個是類類型
重載函數的返回值類型必須是引用
實驗2 重載逗號操作符
#include <iostream>
#include <string>
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)); // Test tt = func(t1); 這裏也是順序錯了,原始逗號是從做到右
cout << tt.value() << endl; // 1
return 0;
}
輸出
func() : i = 1
func() : i = 0
註釋重載函數之後輸出,逗號原本的方式
func() : i = 0
func() : i = 1
本質分析
1.C++通過函數調用擴展操作符的功能
2.進入函數體前必須完成所有參數的計算
3.函數參數的計算次序是不定的
4.重載後無法嚴格從左向右計算表達式
工程中不要重載逗號操作符!
小結
逗號表達式從左向右順序計算每個子表達式的值
逗號表達式的值爲最後一個子表達式的值
操作符重載無法完全實現逗號操作符的原生意義
工程開發中不要重載逗號操作符