C++中逗号操作符重载的分析
1,關注逗號操作符重載后帶來的變化;
?
2,逗號操作符:
??? 1,逗號操作符(,)可以構成都好表達式:exp1, exp2, exp3, ..., expN
?????? 1,逗號表達式用于將多個表達式連接為一個表達式;
?????????? 1,就是用來起連接不同語句作用的;
?????? 2,逗號表達式的值為最后一個子表達式的值;
?????????? 1,最后一個必須有值;
?????? 3,逗號表達式中的前 N - 1 個子表達式可以沒有返回值;
?????? 4,逗號表達式按照從左向右的順序計算每個子表達式的值;
?????????? 1,不能違反這個原生語義;
??????
3,逗號表達式的示例實例分析:
??? 1,main.cpp 文件:
1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 void func(int i) 7 { 8 cout << "func() : i = " << i << endl; 9 } 10 11 int main() 12 { 13 int a[3][3] = { 14 (0, 1, 2), // 用了括號,就變成逗號表達式,只有一個值 2; 15 (3, 4, 5), // 用了括號,就變成逗號表達式,只有一個值 5; 16 (6, 7, 8) // 用了括號,就變成逗號表達式,只有一個值 8; 17 }; 18 /* 19 // 更改如下方可 20 int a[3][3] = { 21 {0, 1, 2}, 22 {3, 4, 5}, 23 {6, 7, 8} 24 }; 25 */ 26 27 int i = 0; 28 int j = 0; 29 30 while( i < 5 ) 31 func(i), // 這里是一個逗號表達式; 32 33 i++; 34 35 /* 上條語句等價于這條 */ 36 while( i < 5 ) 37 { 38 func(i); 39 40 i++; 41 } 42 43 for( i=0; i<3; i++) 44 { 45 for(j=0; j<3; j++) 46 { 47 cout << a[i][j] << endl; 48 } 49 } 50 51 (i, j) = 6; // 左邊是一個逗號表達式 52 53 cout << "i = " << i << endl; 54 cout << "j = " << j << endl; 55 56 return 0; 57 }2,輸出結果:
1 func() : i = 0 2 func() : i = 1 3 func() : i = 2 4 func() : i = 3 5 func() : i = 4 6 2 7 5 8 8 9 0 10 0 11 0 12 0 13 0 14 0 15 i = 3 16 j = 6???
4,重載逗號操作符:
1 Class& operator , (const Class& a, const Class& b) 2 { 3 return const_cast<Class&>(b); // 返回第二個參數; 4 }??? 1,在 C++ 中重載逗號操作符是合法的;
??? 2,使用全局函數對逗號操作符進行重載;
?????? 1,推薦使用全局函數對逗號操作符進行重載,不要使用成員函數的方式;
??? 3,重載函數的參數必須有一個是類類型;
??? 4,重載函數的返回值類型必須是引用;
???
5,重載逗號操作符編程實驗:
??? 1,main.cpp 文件:
1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 class Test 7 { 8 int mValue; 9 public: 10 Test(int i) 11 { 12 mValue = i; 13 } 14 int value() 15 { 16 return mValue; 17 } 18 }; 19 20 /* 推薦用全局重載 */ 21 Test& operator , (const Test& a, const Test& b) 22 { 23 return const_cast<Test&>(b); 24 } 25 26 Test func(Test& i) // 返回值不能為 void,否則報錯; 27 { 28 cout << "func() : i = " << i.value() << endl; 29 30 return i; 31 } 32 33 int main() 34 { 35 Test t0(0); 36 Test t1(1); 37 Test tt = (func(t0), func(t1)); // ==> Test tt = func(t1); ==> Text tt = (operator , (func(t0), func(t1))); 38 39 cout << tt.value() << endl; // 1 40 41 return 0; 42 }2,輸出結果:
? ? func() : i = 1
??? func() : i = 0
??? 1
??? 3,結論:
?????? 1,從右向左執行逗號表達式中的表達式;
?????? 2,最終結果是逗號表達式最后一個值;
??? 4,當不重載逗號操作符的時候:
?????? 1,輸出結果:
?????????? ??? func() : i = 0
func() : i = 1
1
?????? 2,嚴格的按照從左向右的順序執行逗號表達式中的表達式,并返回最后一個子表達式的值;
??? 5,結論:
?????? 1,工程中,最沒必要重載的就是逗號表達式;
?
6,重載逗號操作符:
??? 1,問題的本質分析:
?????? 1,C++ 通過函數調用擴展操作符的功能;
?????? 2,進入函數體前必須完成所有參數的計算;
?????? 3,函數參數的計算次序是不定的;
?????? 4,重載后無法嚴格從左向右計算表達式;
??? 2,工程中不要重載逗號操作符;
???
7,小結:
??? 1,逗號表達式從左向右順序計算每個子表達式的值;
??? 2,逗號表達式的值為最后一個子表達式的值;
??? 3,操作符重載無法完全實現逗號操作符的原生意義;
??? 4,工程開發中不要重載逗號操作符;
轉載于:https://www.cnblogs.com/dishengAndziyu/p/10913855.html
總結
以上是生活随笔為你收集整理的C++中逗号操作符重载的分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数字图像处理及MATLAB实现实验五——
- 下一篇: OpenCV2:应用篇 QT+OpenC