什么是const变量?

时间:2014-10-03 08:42:59

标签: c++ variables const

我理解const指针。但是,我并不完全理解const正常变量。

const int a

上面的陈述我理解,因为它是一个原始的。所以它只能意味着一件事:a的价值无法改变。

但是关于这一个呢?

const Car car

这可能意味着两件事之一:

A-无法更改变量car的值。即,我不能在其中加入不同的Car

B-无法更改此变量所包含的对象本身。即,我们无法更改此变量内的对象的状态。

其中哪一个是正确的?

4 个答案:

答案 0 :(得分:2)

两个

由于The value of variable carthe 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指向的内容,但不能更改foobar ,因为编译器将foo视为类型const Foobar视为类型Bar *constbaz视为类型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}相同}}