2016-04-08 143 views
1

我目前正在嘗試學習一些C++,並遇到以下不直觀的行爲。由於t是指向const int的指針,我希望*t保持不變,只要我們不改變t即可。爲什麼常量整數指針指向一個非常量整數?

#include <iostream> 
using namespace std; 
int main(int argc, char *argv[]) 
{ 
    int a = 3; 
    const int* t = &a; //Why is this allowed? a is NOT const int 
    a = 4; 
    cout << *t << endl; //This does then print 4 
    //*t = 4; //Throws error. 

    return 0; 
} 

任何人都可以解釋爲什麼這是編譯?

+0

爲了澄清我會建議沒有指針的混亂。 'int a = 1; const int b = a;'就好了,現在'b'是const,而'a'不是,即使保持相同的值 – user463035818

+0

@ tobi303是的,但是在你的例子中'b'接收* copy * of 'a'的值。 – flawr

+1

那麼,那麼'int a = 1; const int&b = a;'now'b'是'b'的一個引用,但是即使'a'不是const也不能通過'b'改變這個值 – user463035818

回答

3

由於t是一個指向const int我希望*t將保持不變,只要我們不改變t

你不能做這樣的假設在一般情況下,因爲t可能指向非const對象,比如在你的榜樣。

const int* t = &a; //Why is this allowed? a is NOT const int 

誰能解釋這是爲什麼呢編譯?

C++的規則允許將T*隱式轉換爲const T*。這是允許的,因爲對非const對象有一個指向const(或引用)的指針是非常有用的。指向const的指針僅僅意味着對象不能被「通過」指針修改。對象本身可以是const,也可以是非const。

作爲一個爲什麼它很有用的示例,您可以將某些可修改狀態作爲對象的私有成員,並返回const視圖,以便其他人可以觀察,但不能修改。這樣一個實際的例子是std::string::c_str()。即使std::string的內部緩衝區是非常量,它也會返回const char*

+0

謝謝你的解釋!現在通過*精確的變量來思考你可以做什麼的類型時,它就很有意義。 – flawr

4

const int* t只是表示您不能更改指向t的值t,僅此而已。原來的價值可能會改變,但它與t的責任無關。

如果要保證價值不會改變,你應該讓t指向一個常量,比如

const int a = 3; 
const int* t = &a; 

而對於這種情況下,你不能讓一個int*指針指向它。

int* t = &a; // error 
+0

中移除。這很有道理。我預計'const int *'只能接受'const int'的地址! – flawr

+0

@flawr'int *'可以被隱式地轉換爲'const int *',這只是意味着你不會通過它改變它的值。例如,你可以傳遞一個'int *'函數,如果你不改變函數內部的值,你可以讓函數把'const int *'作爲參數。 – songyuanyao

-4

const int* t = &a; // int* or const int* can assgin to const int*

0

作爲t是一個指向const int我希望*t將保持不變,只要我們不改變t

答案很簡單:指針類型聲明中的const關鍵字並不意味着「它是常量」,而是「您不允許修改它」。

這當您創建一個變量,然後調用另一個函數,用它做的東西,但你要禁止是有用的,例如修改:

extern int countZerosInArray(const int *array, int arrayLen); 

    int myVariableArray[ 100 ]; 
    // ... fill the array - i.e. modify it! 
    int noOfZeros = countZerosInArray(myVariableArray, 100); 

countZerosInArray功能被告知已只讀訪問到陣列,雖然陣列本身當然不是恆定的。

相關問題