我理解const
指针。但是,我并不完全理解const
正常变量。
const int a
上面的陈述我理解,因为它是一个原始的。所以它只能意味着一件事:a
的价值无法改变。
但是关于这一个呢?
const Car car
这可能意味着两件事之一:
A-无法更改变量car
的值。即,我不能在其中加入不同的Car
。
B-无法更改此变量所包含的对象本身。即,我们无法更改此变量内的对象的状态。
其中哪一个是正确的?
答案 0 :(得分:2)
两个
由于The value of variable car
和the state of the object that's inside this variable
是相同的。
对象只不过是其成员的聚合。
答案 1 :(得分:2)
这不是一个完全直截了当的问题。具体来说,使car
const使编译器将所有car
的非可变成员视为const。它还会阻止您在car
上调用非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都对正在发生的事情大致正确的看法,但都没有很好地捕捉到真实情况,无法回答问题。
特别是,A(基本上说你不能分配给const对象)是一种简化,因为编写一个只赋予可变成员或指定者的赋值运算符是可能的(也许是不明智的,但可能)。 / p>
B是一种简化,因为它没有考虑到您班级中可能存在的可变成员。根据你对'state'的意思,它更接近事实,因为可变成员经常被用作私有实现的一部分,并不代表类的逻辑状态的一部分,但它仍然不是很准确。
答案 2 :(得分:2)
两者都是正确的:
A-变量汽车的价值无法改变。也就是说,我不能把它放在一辆不同的车里。
您将无法将任何其他Car类实例分配给汽车。如果您使用的是java,那么这与分配对新变量的引用不同,在c ++中,在这种情况下复制整个对象。
B-无法更改此变量所包含的对象本身。即,我们无法更改此变量内的对象的状态。
正确,因为您只能调用const
方法,这些方法也不允许修改字段,除非它们被标记为可变。
答案 3 :(得分:1)
两者都是真的。通过调用Car
来完成将新car
分配给Car::operator=(Car const& other)
,无论是显式实现还是编译生成。反过来,这会将car
的所有成员分配给other
的成员。所以赋值是状态改变。
从困惑中,我想知道你是否更习惯于像C#或Java这样的语言,它具有引用类型的对象变量而不是对象类型的变量。在那里(就像C ++中的指针一样),分配给变量与改变其状态是不同的,因为存储在Car
中的原始car
仍然会在某处保持不变。但是对于有价值类型的对象变量,你并没有真正将“Car
置于其中” - 你正在更改原始Car
,使其看起来与新{{1}相同}}