2016-04-28 107 views
-6

是否有任何區別:與陣列,其中所述大小可變名稱將進入陣列陣列[大小]C++中的「const int」和「int」是否有區別?

int size = 10000; 

const int size = 10000; 

此代碼的交易。

如何我在我的代碼已經使用這個:

int main() { 
int size = 50000; // here is where I had const before 
int * items; 
items = new int [size]; 

//random array for bubbleSort 
for (int i = 0; i < size; i++) { 
    items[i] = rand(); 
} 

clock_t start, end; 
assert((start = clock()) != -1); 
sort1(items, size); //bubbleSort 
end = clock(); 
cout << "bubbleSort(random): " << (double)(end - start)/CLOCKS_PER_SEC << " seconds" << endl; 
+1

您的文章中的代碼不足以讓讀者嘗試編譯。請管理張貼[MCVE] –

+1

我投票結束這個問題作爲離題,因爲它是非常基本的,可以通過簡單的網頁搜索「什麼是常量值」來解決。 – Yuck

回答

1

從cppreference:

一個對象,其類型爲const限定,或者const對象的不可變子對象。這樣的對象不能被修改:試圖直接這樣做是編譯時錯誤,並且試圖間接地這樣做(例如,通過修改const對象通過引用或指向非const類型的指針)會導致未定義的行爲。

http://en.cppreference.com/w/cpp/language/cv

3

的差是 「常量」 關鍵字。在你的第一個例子中,「size」不是一個常量。這允許重新定義和改變尺寸。但是因爲這不是一個常量,所以也不可能把它定義爲一個數組的大小。如果你使用你的第一個例子,它不會編譯。

你的第二個例子使用「const」關鍵字。一旦變量被聲明,該值就不能被改變。這使得您可以使用它來定義一個數組。

請參閱代碼示例。

// Will not work because not const 
int size = 10000; 
int myArray[ size ]; 

// Will work because const 
const int size = 10000; 
int myArray[ size ]; 
+0

我的程序仍然編譯併產生與使用const關鍵字相同的結果,這使我感到困惑。我會在上面添加更多的代碼。 – Teej

+0

即使它不是'const',它仍然會編譯。只有'size'沒有用特定值初始化時它纔會編譯。這是問題是許多其他問題的重複。 OP沒有做任何研究工作。 –

+0

沒有其他的帖子幫助我理解爲什麼當我使用const並且不使用const時,我的程序仍然以完全相同的方式運行。 – Teej

2

const在C++中有很多效果。

第一個也是最明顯的是,它表示一個值是隻讀的。擴展你的例子一點:

int size = 10000; 

const int size2 = 10000; 

int main() { 
    size = 1; // fine 
    size2 = 2; // won't compile 
} 

在這種情況下,這意味着size2真的是一個常數。 C++標準有一些特殊的語言,允許編譯器消除const限定的變量,只要您只以不需要地址的方式使用它,就將其視爲值。

另一個影響是const限定值有可能被用作常量表達式,所以它可以以非常量表達式不能使用的幾種方式使用,例如定義數組的大小(但是請注意,你很少想在C++中使用數組 - 通常首選的是std::vector)。

另一個效果(在C++中,但不是C)是定義一個變量作爲const還使得static,所以你的情況(其中變量出現任何功能之外定義)不合格變量是全球,因此它可以從另一個翻譯單位(源文件)中可以看到適當的extern聲明。 const變量不能。

注意,當const通過指針或引用適用,它確實意味着「只讀」,而不是'不變」。例如,給予相同的功能:

int foo(int const &bar); 

...裏面的代碼foo不能寫任何bar指的是,bar可以綁定到非const變量,所以其他代碼直接引用它可以修改它。給定多線程,甚至有可能foo內的代碼讀取兩個(或更多)與bar不同的值,即使代碼foo本身不能修改bar

注意const也可以適用於整個class,如在const -qualified成員函數:

struct foo { 
    int i; 

    int bar() const { 
     // i = 2; // won't compile 
     return 1; 
    } 
}; 

這基本上改變了thisfoo * const類型foo const * const,所以你不能在該成員函數中寫入foo的任何部分(除去丟棄const,這是你真的不應該這樣做的)。

還有一種方法來限制這種限制:在少數情況下,一個類將執行諸如緩存(也稱爲memoizing)的值。例如,如果它有一個計算起來很昂貴的值,它可能會在計算後存儲該值,所以如果再次請求它,則不需要重新計算。在這種情況下,可以將該變量標記爲mutable,即使通過指向const(或參考const)的指針訪問該變量,也可以修改該變量。

struct foo { 
    mutable int i; 

    int bar() const { 
     // i = 2; // compiles without problem 
     return 1; 
    } 
}; 

1。注意,一些編譯器,特別是海灣合作委員會,有一個擴展,它允許您定義與不是常數,雖然大小非全局陣列,所以這可能是一個有點誤導標準。雖然這是C++的擴展,但它是C的一個標準部分(從C99開始)。

相關問題