3 回答
TA貢獻1862條經驗 獲得超6個贊
首先是const的用處,它可以用來修飾一個變量或者類的成員函數, 修飾變量時表示變量是不可修改的,修飾類的成員函數時,表示調用這個函數,不會修改類的內部成員
指針和 const 指針的功能區別: const指針表示指針指向的對象是不可修改的, 而普通指針可以,
另外,普通的指針可以當做const指針的來用,如下:
假設現在有兩個指針 Tdate *p1, const Tdata *p2
第一個函數定義為 someFunc(T *) , 那么 someFunc(p1)是可以的,someFunc(p2)是不行的,因為const指針不能轉換成非const指針
第二個函數定義為someFunc(const T *) 那么someFunc(p1)和someFunc(p2)都是可以的,p1可以當做const T *來用
someFunc2的解釋
假設現有對象 Tdata t;
someFunc2(Tdata re),形參是一個對象,由于c/c++是傳值調用,所以每次調用這個someFunc2(t)時,都會構造一個新的Tdata形參re,并把t的內容復制到re中去,這樣是一種效率的浪費,解決辦法就是改成指針someFunc2(Tdata *re) 或者引用 someFunc2(Tdata &re)
不使用普通引用而是是用const引用的好處在于:
const引用使用要求比較低, 如前面所述, 普通引用和const引用都可以調用這個函數
const明確告訴使用者,該函數不會修改re的內容,也就是t的內容,而使用非const引用會誤導使用者以為該函數要修改t的內容
TA貢獻1858條經驗 獲得超8個贊
你好,首先你應當明白引用時C++區別于C的一點。但是在Lippleman的<深度探索C++的對象模型>中曾經指出,引用的實現說到底還是采用指針實現的,但是它比指針有自己的優勢。然后再Lippleman的<C++primer>中他指出現代C++程序偏向于使用引用,而不是指針,但是并不是說指針不再使用。
C++中的const關鍵字是指出對象時一個常量,是不允許變動它在內存當中的值的。但是還有很多點是需要注意的。
1.指向const對象的指針 const double *ptr表明ptr指向一個double類型的對象,你可以賦值給ptr一個常量或者不是常量。比如:
double temp = 3.0;const double *ptr = &temp; //此時你不能通過ptr來更改temp的值,也就是說下面的語句是錯誤的:*ptr = 4.0;但是temp本身并不是const變量,下面的語句就是對的:temp = 4.0; //注意const對象一定要在對象的初始化時賦值.就是說下面的語句是錯誤的:
double temp = 3.0;const double* ptr; ptr = &temp; //error
2.const指針 ,和一般的const對象一樣,說明指針本身是const,是不允許指向其他的對象的;比如下面的語句就是錯的:
double temp = 3.0;double* const ptr = &temp; double err = 4.0;ptr = &err; //注意const對象的初始化時一定需要賦值.
但是你可以使用ptr來更改temp的值,就是說下面的語句是對的:*ptr = 10.0;
對于你上面的例子中,首先你應該知道C++的標識符的命名本身就應該包含足夠的信息,而不是隨便的a,b,等沒有用的名字。函數print()就是說該函數是用來打印的,并不會更改對象的內容,所以你將函數的形參設為const,是為了當你在函數的實現中一不小心更改了對象的內容,編譯器會及時的報錯,從而能避免以后不需要的麻煩。
在標準的C中,函數形參的const說明是會被編譯器直接忽略的就是說你寫成const,但是你還是可以在函數的實現中更改對象的內容,但是你的const說明符告訴函數的使用者該專遞給函數一個const對象,但是編譯器并不負責對你的更改操作給出error提示的.在C++中,確實會給出提示的。
所以當你的函數并不會改變對象的內容時,將其定義為const對象回事很好的編程習慣的。
- 3 回答
- 0 關注
- 566 瀏覽
添加回答
舉報
