“const”在C和C ++中有何不同?

时间:2010-12-20 02:28:49

标签: c++ c const

变量的const限定如何在C和C ++中有所不同?

来自:Does "const" just mean read-only or something more?

“提出这个问题的原因是这个答案:https://stackoverflow.com/questions/4024318#4024417他指出const”just“在C语中是只读的。我认为所有const都意味着,无论是C还是C ++。他是什么意思?“

2 个答案:

答案 0 :(得分:8)

C中的

const不能用于构建常量表达式。

例如:

#include <stdio.h>
int main()
{
   int i = 2;
   const int C = 2;
   switch(i)
   {
      case C  : printf("Hello") ;
      break;

      default : printf("World");
   }
}

在C中不起作用,因为案例标签不会减少为整数常量。

答案 1 :(得分:7)

const表示承诺不会改变变量。它仍然可以改变。

class A {
  public:
    A(const int& a);
    int getValue() const;
    void setValue(int b);
  private:
    const int& a;
};
A::A(a) : a(a) {}
int A::getValue() const {
    return a;
}
void A::setValue(int b) {
    a = b;  // error
}

int main() {
    int my_a = 0;
    A a(my_a);
    std::cout << a.getValue() << std::endl;  // prints 0
    my_a = 42;
    std::cout << a.getValue() << std::endl;  // prints 42
}

没有方法A::*可能会更改a,但main可以。 C和C ++之间的差异很大。


C ++所拥有的是绕过const的几种(有限的)方法,这些方法可能会阻止程序员不恰当地丢弃const

参加这样的课程。

class A {
  public:
    A();
    int getValue();
  private:
    static int expensiveComputation();
    int cachedComputation;
};

A::A() : cachedComputation(0) {}

A::getValue() {
    if (cachedComputation == 0)
        cachedComputation = expensiveComputation();
    return cachedComputation;
}

cachedComputation隐含地表示this->cachedComputation。记住这一点。

int main() {
    A a1;
    const A a2;
    std::cout << a1.getValue() << std::endl;
    std::cout << a2.getValue() << std::endl;  // error
}

a2.getValue()是非法的,因为在const上调用了非const A a2方法。人们可以抛弃const - ness ...

    std::cout << ((A&)a2).getValue() << std::endl;            // C-style cast
    std::cout << const_cast<A&>(a2).getValue() << std::endl;  // C++-style cast

第二个是首选,因为编译器将检查只有const - ness正在被投射,没有别的。但是,这仍然不理想。相反,应该在课程中添加一个新方法。

class A {
  public:
    int getValue() const;
};

A::getValue() const {
    if (cachedComputation == 0)
        cachedComputation = expensiveComputation();  // error
    return cachedComputation;
}

现在有一个const方法,所以a2.getValue()很好。但是,尾随const表示该方法被赋予const A *this指针,而不是通常的A *this指针,使this->cachedComputation成为const int &无法变异的const_cast

class A { private: mutable int cachedComputation; }; 可以在方法中应用,但更好的方法是更改​​此成员的声明。

const A *this

现在,即使使用this->cachedComputation,{{1}}也可以在不进行投射的情况下进行变异。