变量的const限定如何在C和C ++中有所不同?
来自:Does "const" just mean read-only or something more?
“提出这个问题的原因是这个答案:https://stackoverflow.com/questions/4024318#4024417他指出const”just“在C语中是只读的。我认为所有const都意味着,无论是C还是C ++。他是什么意思?“
答案 0 :(得分:8)
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}}也可以在不进行投射的情况下进行变异。