#include
#if 0 //測試const 變數
int main()
#endif
#if 0 //測試指標常量 const int *a;二級指標修改 一級指標的值
void test(const int *a)
void test02(int **a) //二級指標,把實參的位址,扔過來.... void test02(const int **a)錯誤,
int main()
#endif
//測試const引用,一般用引用就是想改變傳遞過來的值,如果不想改變傳遞過來的值,
//直接傳值就好了(具體為何,自己腦補:傳值傳遞的是乙份copy,對copy的操作,跟實參沒有半毛線關係)
//引用主要用在 自定義資料型別,做函式引數,值傳遞影響效率,而引用傳遞又擔心更改實參的值
//,故:class a; a const &;,解決了效率,又限制了修改 如:將函式 void test(a a) 改為-> void test(const a &a)
#if 0
void test(const int &a) //若形參為const a& a,則不能改變函式傳遞進來的引用物件,從而保護了原物件的屬性。
//對於自定義的資料型別,用引用傳遞速度較快,如果不想改變原值,就可以用const來保護引數
int main()
#endif
#if 0
//const 用於修飾函式返回值
//用法1:用const 修飾返回值為物件本身(非引用,非指標),多用於二目操作符過載函式 並 產生新物件的時候
//不建議const ratioan ,以上用法,也建議返回 const ratioan & ,因為不僅不支援鏈式操作 ,而且,生產出來的是
//const 物件,const 物件,不允許賦值,只能訪問類中的const成員函式和公有成員:::這種情況很少用到
class rational
//過載二目運算子,做成員函式,只需要乙個引數,因為還有this指標作祟....
friend const rational operator* (const rational& lhs, const rational& rhs) //
friend const rational & operator+ (const rational& lhs, const rational& rhs) //
void sety(int a,int b)
public:
int a;
int b;
};int main()
#endif
#if 0 //const 指標只能賦值 給 const 指標,反過來,cosnt指標,可以接受非const 指標
const char *getstring(void)
int main()
#endif
//函式返回值採用"引用傳遞"的不多,這種方式一般就出現的類的 賦值函式 中,目的是為了實現鏈式表達
#if 1
class a
a & operator = (const a &other)
public:
int a;
int b;
};int main()
#endif
//4.在類成員函式的函式體後加關鍵字const
////在類成員函式的函式體後加關鍵字const,形如:void fun() const;
//在函式過程中不會修改資料成員。如果在編寫const成員函式時,不慎修改了資料成員,
//或者呼叫了其他非const成員函式,編譯器將報錯,這大大提高了程式的健壯性。
//如果不是在類的成員函式,沒有任何效果,void fun() const; 和void func(); 是一樣的。
//5.在另一連線檔案檔案中引用常量
////方法:在型別前新增關鍵字extern const,表示引用的是常量,因此該常量不允許被再次賦值,舉例如下:
////extern const int i; // 正確
//extern const int j = 10; // 錯誤,常量不可以被再次賦值
//const常量 和 #define巨集
//巨集只是進行簡單的字元替換,沒有型別檢查,並且在字元替換時,可能產生各種意料之外的錯誤
//#define i 10;
//char h = i; //資料截斷了也不會報錯
但是//const long &i = 20; // 這種寫法也可以....
//char cc = i;//編譯警告;可能由於數的截斷帶來錯誤賦值
////2.使用const可以避免不必要的記憶體分配
////從彙編的角度來看,const定義常量只是給出了對應的記憶體位址, 而不是象#define一樣給出的是立即數
//,所以,const定義的常量在程式執行過程中只有乙份拷貝,而#define定義的常量在記憶體中有若干個拷貝。例子如下:
////#define k "hello world!"
//const char pk = "hello world!";
//printf(k); // 為k分配了第一次記憶體
//printf(pk); // 為pk一次分配了記憶體,以後不再分配
//printf(k); // 為k分配了第二次記憶體
//printf(pk); //不再分配記憶體了
#if 0
#include
using namespace std;
int main(int argc, char const* ar**)
#endif
//2.建構函式不能被宣告為const
//資料成員的初始化只能在類的建構函式的初始化表中進行
//class a
////};
//4.在引數中使用const應該使用引用或指標,而不是一般的物件例項
////合理利用const在成員函式中的三種用法(引數、返回值、函式),一般來說,不要輕易的將函式的返回值型別定為const;
//另外,除了過載操作符外一般不要將返回值型別定為對某個物件的const引用。
//class stu
////
//protected:
//private:
//};
#if 0
class a
const a& test1()const //成員函式如果有返回值,盡量不要設定為const成員函式
//因為const成員函式,返回值也是const型別
/*a& test3()const //會報錯,因為返回的是乙個const物件
*/a& test2(const int a,const int b) //替代方法:利用把引數設定為 const型別,替代const成員函式
};int main()
#endif
#if 0
//mutable 破除const不能修改的魔咒
class a
};int main()
#endif
關於const的用法
在生活或工作中,對於一些檔案 程式或資料,需要設定對它們的讀寫許可權。在必要的時候,如果限定一些資料只具有 讀 的許可權,而不能對它們進行賦值或修改,這時,我們需要使用 const 對資料進行修飾。在對const進行解釋之前,先引入兩個名詞 左值 右值 左值 放在 賦值 符號左邊的就是左值。其他情況...
關於const的用法
1.const int p hello 這個意思就是這個指標變數p指向的內容不能改變,但是可以改變讓p指向其他的位址。const char p hello p ok printf s p 所以這個的執行結果就是ok,如果稍加修改 const char p hello p 0 o printf s p...
總結const的用法
1.const的用法 1 定義常量 2 修飾函式的引數 3 修飾函式的返回值 4 修飾函式的定義體 2.用const 修飾函式的引數 1 const 只能修飾輸入引數 如果輸入引數採用 指標傳遞 那麼加const 修飾可以防止意外地改動該指標。例如 void stringcopy char strd...