關於const用法的總結

2021-09-09 07:07:28 字數 3571 閱讀 8447

#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...