const與非const型別賦值問題

2021-09-28 20:59:53 字數 1167 閱讀 7067

const與非const型別賦值問題

以前總有個問題想不通,就是為什麼從const char到char的賦值就會出錯,而const int到int的賦值就沒問題呢?呵呵,不知道有沒有其他新手和我有相同的疑問呢?還算我運氣好,今天不知道怎麼會觸發了靈感,終於把這個小白問題想通了。答案就是:

從const int到int的賦值操作,是一種物件的拷貝,賦值後我們在物件的副本上操作當然不會有問題。 從const char到char的賦值操作,雖然也是一種物件的拷貝,不過我們拷貝的只是指標物件,而指標指向的物件卻是同乙份,這個物件在賦值前後的型別發生了變化,編譯器自然就會報錯。 另外從char* const到char*的賦值僅僅是指標物件的拷貝,而指標指向物件的型別相同,編譯器也不會報錯。

const與非const之間,相互賦值時,如果使用不當,可能造成一些問題。

非指標型別

const int c_a = 10;

int b = 20;

b = c_a ; // 正確

c_a = b; // error!

// error

const int c_a;

c_a = 10;

const int* c_ptra  =  new int(10);

int * ptrb= new int(10);

c_ptra = ptrb; // 沒問題

ptrb = c_ptra; // 編譯報錯 不能從 const int* 轉換程 int*

// 下面這種情況不會報錯,但可能造成程式崩潰

ptrb = (int*)c_ptra;

// ....

*ptrb = 20; // 此處修改了b和a共同指向的位址的內容,程式崩潰

// 正確

const int * c_a;

// ...

c_a = someaddress;

1.因此,對於非指標型別的const,可以理解為使用"const」,就是常量了。什麼是常量?10,20,「linduo"等都是常量。 int a、char s等都是變數。

2.對於指標型別,當然有常量指標和指標常量的區別。可以理解為,使用"const」,是用來限制,指標本身或指標指向內容,可不可以修改。

const與非const型別賦值問題

非指標型別const int c a 10 int b 20 b c a 正確 c a b error!關於這個問題,網上有說 非const變數賦給const變數,是非法的 請不要陷入這種容易混亂的邏輯。上述情況,比較正確的解釋。const int 在初始化之後,是不能再改變的。且const int...

const與非const型物件

一 非const物件可以初始化const物件 int i 0 const int ci i 因為它們使用各自的儲存單元。二 非const引用與const引用 1 const引用可以用常量 表示式 const物件或非const物件初始化 int i 0 const int refi i 儘管i與ref...

const引用與非const引用

const引用可讀不可改,與繫結物件是否為const無關,注意區分const引用與對const物件的引用 非const引用可讀可改,只可與非const物件繫結 const int ival 1024 const int refval ival ok both reference and object...