C++ 常量对象作为函数参数
考虑以下代码段:C++ 常量对象作为函数参数,c++,constants,C++,Constants,考虑以下代码段: class MyClass { int x; public: MyClass(int val) : x(val) {} const int& get() const {return x;} }; void print (const MyClass& arg) { cout << arg.get() << '\n'; } int main() { MyClass foo (10); print(f
class MyClass {
int x;
public:
MyClass(int val) : x(val) {}
const int& get() const {return x;}
};
void print (const MyClass& arg) {
cout << arg.get() << '\n';
}
int main() {
MyClass foo (10);
print(foo);
return 0;
}
class-MyClass{
int x;
公众:
MyClass(int val):x(val){}
const int&get()const{return x;}
};
无效打印(常量MyClass和参数){
coutconst
禁止函数体修改参数变量。两种方法都可以编译,因为您没有尝试修改它
您可以重载const
和非const
引用参数,并且只有当参数确实是const
时才会选择const
重载(或者类型转换导致传递临时参数)。(对于非参考参数,const
几乎没有意义,甚至可能没有定义此类重载。)在这种情况下,const
所做的一切就是防止修改参数变量(对于类,防止调用未标记为const
的函数).MyClass
可能被简单地转换为const MyClass
,因为对于一个const MyClass
,你不应该对一个非const
的类做任何你做不到的事情。当然,情况恰恰相反
(我说“应该”),因为如果你想,完全可以在C++中完全颠覆<代码> const 语义,所以函数原型中存在 const 实际上只是一个有希望的提示,而不是铸铁编译器强制保证。但是没有一个明智的程序员会破坏这样的事情!
这是完全正常的。对象在函数中被视为const
;它最初不是被创建为不可变的并不重要
当然,事实并非如此
void foo(T& rarr);
int main()
{
const T lolwut;
foo(lolwut); // oops
}
为什么它不应该接受非常量参数?不更改非常量对象是可以的。