C++中逗号操作符重载的分析
1,關(guān)注逗號操作符重載后帶來的變化;
?
2,逗號操作符:
??? 1,逗號操作符(,)可以構(gòu)成都好表達(dá)式:exp1, exp2, exp3, ..., expN
?????? 1,逗號表達(dá)式用于將多個(gè)表達(dá)式連接為一個(gè)表達(dá)式;
?????????? 1,就是用來起連接不同語句作用的;
?????? 2,逗號表達(dá)式的值為最后一個(gè)子表達(dá)式的值;
?????????? 1,最后一個(gè)必須有值;
?????? 3,逗號表達(dá)式中的前 N - 1 個(gè)子表達(dá)式可以沒有返回值;
?????? 4,逗號表達(dá)式按照從左向右的順序計(jì)算每個(gè)子表達(dá)式的值;
?????????? 1,不能違反這個(gè)原生語義;
??????
3,逗號表達(dá)式的示例實(shí)例分析:
??? 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), // 用了括號,就變成逗號表達(dá)式,只有一個(gè)值 2; 15 (3, 4, 5), // 用了括號,就變成逗號表達(dá)式,只有一個(gè)值 5; 16 (6, 7, 8) // 用了括號,就變成逗號表達(dá)式,只有一個(gè)值 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), // 這里是一個(gè)逗號表達(dá)式; 32 33 i++; 34 35 /* 上條語句等價(jià)于這條 */ 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; // 左邊是一個(gè)逗號表達(dá)式 52 53 cout << "i = " << i << endl; 54 cout << "j = " << j << endl; 55 56 return 0; 57 }2,輸出結(jié)果:
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); // 返回第二個(gè)參數(shù); 4 }??? 1,在 C++ 中重載逗號操作符是合法的;
??? 2,使用全局函數(shù)對逗號操作符進(jìn)行重載;
?????? 1,推薦使用全局函數(shù)對逗號操作符進(jìn)行重載,不要使用成員函數(shù)的方式;
??? 3,重載函數(shù)的參數(shù)必須有一個(gè)是類類型;
??? 4,重載函數(shù)的返回值類型必須是引用;
???
5,重載逗號操作符編程實(shí)驗(yàn):
??? 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,否則報(bào)錯(cuò); 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,輸出結(jié)果:
? ? func() : i = 1
??? func() : i = 0
??? 1
??? 3,結(jié)論:
?????? 1,從右向左執(zhí)行逗號表達(dá)式中的表達(dá)式;
?????? 2,最終結(jié)果是逗號表達(dá)式最后一個(gè)值;
??? 4,當(dāng)不重載逗號操作符的時(shí)候:
?????? 1,輸出結(jié)果:
?????????? ??? func() : i = 0
func() : i = 1
1
?????? 2,嚴(yán)格的按照從左向右的順序執(zhí)行逗號表達(dá)式中的表達(dá)式,并返回最后一個(gè)子表達(dá)式的值;
??? 5,結(jié)論:
?????? 1,工程中,最沒必要重載的就是逗號表達(dá)式;
?
6,重載逗號操作符:
??? 1,問題的本質(zhì)分析:
?????? 1,C++ 通過函數(shù)調(diào)用擴(kuò)展操作符的功能;
?????? 2,進(jìn)入函數(shù)體前必須完成所有參數(shù)的計(jì)算;
?????? 3,函數(shù)參數(shù)的計(jì)算次序是不定的;
?????? 4,重載后無法嚴(yán)格從左向右計(jì)算表達(dá)式;
??? 2,工程中不要重載逗號操作符;
???
7,小結(jié):
??? 1,逗號表達(dá)式從左向右順序計(jì)算每個(gè)子表達(dá)式的值;
??? 2,逗號表達(dá)式的值為最后一個(gè)子表達(dá)式的值;
??? 3,操作符重載無法完全實(shí)現(xiàn)逗號操作符的原生意義;
??? 4,工程開發(fā)中不要重載逗號操作符;
轉(zhuǎn)載于:https://www.cnblogs.com/dishengAndziyu/p/10913855.html
總結(jié)
以上是生活随笔為你收集整理的C++中逗号操作符重载的分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数字图像处理及MATLAB实现实验五——
- 下一篇: RARP