C和C ++的" const"有何不同?[英] How does "const" differ in C and C++?

本文是小编为大家收集整理的关于C和C ++的" const"有何不同?的处理方法,想解了C和C ++的" const"有何不同?的问题怎么解决?C和C ++的" const"有何不同?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

变量的const资格在C和C ++上有何不同?

来自:含义仅阅读或更多内容?

"促使这个问题的原因是: https://stackover.com/questions/4024318#4024417 他指出,const" Just"的意思是仅在C中读书.我认为这是const的意思,无论是C ++.他是什么意思?"

推荐答案

const C中的C无法用于构建常数表达式.

例如:

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

      default : printf("World");
   }
}

在C中不起作用,因为案例标签不会降低到整数常数.

其他推荐答案

const表示 you 承诺不突变变量.它仍然可以更改.

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 A a2上调用了非const方法.一个人可以抛弃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 - 别无其他.但是,这仍然不是理想的.相反,应该在类中添加一种新方法.

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

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

现在有一个const方法,所以a2.getValue()很好.但是,尾随const表示该方法是const A *this指针,而不是像通常这样的指针,使this->cachedComputation a const int &无法突变.

const_cast可以在方法中应用,但最好是更改该成员的声明.

class A {
  private:
    mutable int cachedComputation;
};

现在,即使使用const A *this,this->cachedComputation也可以突变而不施放.

本文地址:https://www.itbaoku.cn/post/358990.html