在C++的函數定義中,處處都是const
關鍵字的使用ios
好比下面這段代碼將const的各類應用場景都揉到一塊兒了:函數
#include<iostream> #include<stdio.h> using namespace std; /* * const修飾函數參數 * * const int i1:參數是常量,不容許在函數中修改這個參數 * const int* i2:參數指針所指的內容爲常量不可變 * int* const i3:參數指針自己是常量,不可變 * const int& i4:參數爲引用,增長效率(不用拷貝參數)同時防止修改 * * 其實和const修飾變量是同樣的效果 */ void func_param( const int i1, const int* i2, int* const i3, const int& i4 ){ cout << "func_param_i1: " << i1 << endl; //compile error: assignment of read-only parameter 'i1' //i1 = 10; cout << "func_param_i2: " << *i2 << endl; //compile error: assignment of read-only location '* i2' //*i2 = 10; i2 = NULL; cout << "func_param_i3: " << *i3 << endl; *i3 = 10; //compile error: assignment of read-only parameter 'i3' //i3 = NULL; cout << "func_param_i4: " << i4 << endl; //compile error: assignment of read-only reference 'i4' //i4 = 10; } /* * const修飾函數返回值 * const int func_ret_1(),沒啥意義,由於返回值自己就是賦值 * const int* func_ret_2(),把func_ret_2()當作一個變量,指針內容不可變 * int const* func_ret_3(),把func_ret_3()看做成一個變量,即指針自己不可變 */ const int func_ret_1(){ return 1; } const int* func_ret_2(){ int *i = (int*)malloc(sizeof(int)); *i = 100; return i; } int* const func_ret_3(){ int *i = (int*)malloc(sizeof(int)); *i = 100; return i; } /* * const在類中的應用 */ class TestConst{ /* * const修飾類成員「變量」 */ private: /* * 成員變量不能修改 * 只能在初始化列表中賦值 */ const int iConst; public: /* * 在初始化列表中對const成員賦值 */ TestConst(int x): iConst(x) { cout << "TestConst Create" << endl; } ~TestConst() { cout << "TestConst Destroy" << endl; } /* * const修飾類成員函數 */ private: //普通變量 int iVar; //非const成員函數 int testFunc() { return 1; } public: /* * 常成員函數,它不能改變對象的成員變量 * 也不能調用類中任何非const成員函數 */ void testConstFunc() const { //compile error: assignment of member 'TestConst::iVar' in read-only object //iVar = 10; //compile error: passing 'const TestConst' as 'this' argument discards qualifiers [-fpermissive] //testFunc(); } }; int main() { cout << "main begin" << endl; /* * const定義一個常量,其值不可變 */ cout << "define a const variable" << endl; const int constInt = 10; //等價於這樣的定義:int const constInt = 10; //compile error: assignment of read-only variable 'constInt' //constInt = 100; /* * const修飾一個指針會怎麼樣呢 * 若const位於*左側,則const用於修飾指針所指向的內容,即指針指向一個常量 * 若const位於*右側,則const用於修飾指針自己,即指針自己是一個常量 */ cout << "define a variable" << endl; int varInt = 10; /* * const位於*右側,指針自己是常量 */ int* const p1 = &varInt; *p1 = 100; //compile error: assignment of read-only variable 'p1' //p1 = NULL; /* * const位於*左側,指針指向一個常量 */ const int* p2 = &varInt; //compile error: assignment of read-only location '* p2' //*p2 = 100; p2 = NULL; /* * const位於*左側和右側,指針自己、指向的內都是常量 */ const int* const p3 = &varInt; //compile error: assignment of read-only location '*(const int*)p3' //*p3 = 100; //compile error: assignment of read-only variable 'p3' //p3 = NULL; /* * 測試const修飾函數參數 */ int param = 100; func_param(param, ¶m, ¶m, param); /* * 測試const修飾函數返回值 */ int ret1 = func_ret_1(); //compile error: invalid conversion from 'const int*' to 'int*' [-fpermissive] //int *ret2 = func_ret_2(); //*ret2 = 100; //ret2 = NULL; int *ret3 = func_ret_3(); *ret3 = 100; ret3 = NULL; /* * 測試類中的const */ TestConst *t = new TestConst(10); delete t; cout << "main end" << endl; return 0; }
編譯運行效果以下測試
上面經過註釋、運行結果已經將const關鍵字的各類應用場景進行了描述。徹底能夠認爲是講解C++中const用法的一份簡單參考手冊!this
另外結合這篇《C++函數傳值返回和引用返回》一塊兒閱讀效果會更好spa