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和参数){

cout
const
禁止函数体修改参数变量。两种方法都可以编译,因为您没有尝试修改它


您可以重载
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
}

为什么它不应该接受非常量参数?不更改非常量对象是可以的。