我明白const
指針。但是,我並不完全瞭解const
正常變量。什麼是const變量?
const int a
上面的說明我明白,因爲它是一個原始的。所以它只能意味着一件事:a
的價值不能改變。
但是關於這個呢?
const Car car
這可能意味着兩兩件事之一:
A-變量car
的值不能改變。也就是說,我不能把它放在一個不同的Car
。
B-該變量所保存的對象本身無法更改。也就是說,我們不能改變這個變量內部的對象的狀態。
其中哪一個是正確的?
我明白const
指針。但是,我並不完全瞭解const
正常變量。什麼是const變量?
const int a
上面的說明我明白,因爲它是一個原始的。所以它只能意味着一件事:a
的價值不能改變。
但是關於這個呢?
const Car car
這可能意味着兩兩件事之一:
A-變量car
的值不能改變。也就是說,我不能把它放在一個不同的Car
。
B-該變量所保存的對象本身無法更改。也就是說,我們不能改變這個變量內部的對象的狀態。
其中哪一個是正確的?
兩者都是如此。指定新的Car
至car
通過調用Car::operator=(Car const& other)
完成,無論是明確實現的還是編譯器生成的。然後,這又分配other
的所有car
的成員。所以分配是狀態改變。
從困惑中,我想知道你是否習慣於像C#或Java這樣的語言,它具有引用類型的對象變量而不是對象類型的變量。在那裏(就像使用C++中的指針一樣),分配給一個變量與改變它的狀態是不同的,因爲存儲在car
中的原始Car
仍然會在某處保持不變。但是對於值類型的對象變量,您並不是真的在其中「放入一個不同的Car
」 - 您正在更改原始的Car
,因此它看起來與新的Car
相同。
兩者。
由於The value of variable car
和the state of the object that's inside this variable
是一樣的東西。
對象只不過是其成員的聚集。
這不是一個完全直截了當的問題。具體而言,使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
,但不foo
或bar
,因爲編譯器會像對待foo
如爲是const Foo
類型,bar
的類型爲Bar *const
和baz
,其類型爲Baz
。
爲了直接解決您的問題,A和B都對發生的事情大致正確地看法,但都沒有足夠好地捕捉到真實情況以回答問題。因爲可能(可能不明智,但可能)編寫只賦值給可變成員或pointees的賦值運算符,所以A(基本上說你不能賦值給const對象)是一種簡化,因爲它可能(也許不明智,但可能)。
B是一種簡化,因爲它沒有考慮到類中可能存在的可變成員。取決於'state'的含義,它更接近真相,因爲可變成員經常被用作私有實現的一部分,並不代表類的一部分邏輯狀態,但它仍然不是很準確。
兩者都是正確的:
A-變量汽車的價值不能被改變。也就是說,我不能在裏面放一輛不同的車。
您將無法將任何其他Car類實例分配給汽車。如果您使用的是java,那麼這與分配對新變量的引用不同,在這種情況下,C++中的整個對象被複制。
B-該變量所保存的對象本身無法更改。也就是說,我們不能改變這個變量內部的對象的狀態。
它的正確性,因爲您只能調用const
方法,這些方法也不允許修改字段,除非它們被標記爲可變。
當然你的意思是'Car :: operator =(...' – 2014-10-03 08:47:55
@BartvanNierop我不知道你在說什麼。:-D(謝謝) – Sneftel 2014-10-03 08:49:23