2014-10-03 85 views
2

我明白const指針。但是,我並不完全瞭解const正常變量。什麼是const變量?

const int a 

上面的說明我明白,因爲它是一個原始的。所以它只能意味着一件事:a的價值不能改變。

但是關於這個呢?

const Car car 

這可能意味着兩兩件事之一:

A-變量car的值不能改變。也就是說,我不能把它放在一個不同的Car

B-該變量所保存的對象本身無法更改。也就是說,我們不能改變這個變量內部的對象的狀態。

其中哪一個是正確的?

回答

1

兩者都是如此。指定新的Carcar通過調用Car::operator=(Car const& other)完成,無論是明確實現的還是編譯器生成的。然後,這又分配other的所有car的成員。所以分配狀態改變。

從困惑中,我想知道你是否習慣於像C#或Java這樣的語言,它具有引用類型的對象變量而不是對象類型的變量。在那裏(就像使用C++中的指針一樣),分配給一個變量與改變它的狀態是不同的,因爲存儲在car中的原始Car仍然會在某處保持不變。但是對於值類型的對象變量,您並不是真的在其中「放入一個不同的Car」 - 您正在更改原始的Car,因此它看起來與新的Car相同。

+1

當然你的意思是'Car :: operator =(...' – 2014-10-03 08:47:55

+0

@BartvanNierop我不知道你在說什麼。:-D(謝謝) – Sneftel 2014-10-03 08:49:23

2

兩者。

由於The value of variable carthe state of the object that's inside this variable是一樣的東西。

對象只不過是其成員的聚集。

2

這不是一個完全直截了當的問題。具體而言,使car爲const使編譯器將所有的car的非可變成員視爲const。它也阻止你在car上調用非const成員函數。

將const作爲const的意思是什麼?那麼,這取決於它的類型。如果它是一個指針,它就是指針,而不是指向對象,它被視爲const。假設我們有下面的類:

class C 
{ 
public: 
    Foo foo; 
    Bar *bar; 
    mutable Baz baz; 

    void nc() 
    { 
    foo = ...; // fine 
    bar = ...; // fine 
    *bar = ...; // fine 
    baz = ...; // fine 
    } 

    void c() const 
    { 
    foo = ...; // not fine 
    bar = ...; // not fine 
    *bar = ...; // fine 
    baz = ...; // fine 
    } 
}; 

const C c; 
c.foo = ...; // not fine 
c.bar = ...; // not fine 
*c.bar = ...; // fine 
c.baz = ...; // fine 
c.nc();  // not fine 
c.c();  // fine 

如果你有中C一個const實例,你將能夠在其上調用const成員函數。你(取決於訪問)或那些const成員函數也將能夠改變的東西指向bar和實際的對象baz,但不foobar,因爲編譯器會像對待foo如爲是const Foo類型,bar的類型爲Bar *constbaz,其類型爲Baz

爲了直接解決您的問題,A和B都對發生的事情大致正確地看法,但都沒有足夠好地捕捉到真實情況以回答問題。因爲可能(可能不明智,但可能)編寫只賦值給可變成員或pointees的賦值運算符,所以A(基本上說你不能賦值給const對象)是一種簡化,因爲它可能(也許不明智,但可能)。

B是一種簡化,因爲它沒有考慮到類中可能存在的可變成員。取決於'state'的含義,它更接近真相,因爲可變成員經常被用作私有實現的一部分,並不代表類的一部分邏輯狀態,但它仍然不是很準確。

2

兩者都是正確的:

A-變量汽車的價值不能被改變。也就是說,我不能在裏面放一輛不同的車。

您將無法將任何其他Car類實例分配給汽車。如果您使用的是java,那麼這與分配對新變量的引用不同,在這種情況下,C++中的整個對象被複制。

B-該變量所保存的對象本身無法更改。也就是說,我們不能改變這個變量內部的對象的狀態。

它的正確性,因爲您只能調用const方法,這些方法也不允許修改字段,除非它們被標記爲可變。