const对象作为函数参数

时间:2014-05-11 11:37:43

标签: c++ const

请考虑以下代码段:

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;
}

无论我是否在MyClass的实例化之前添加const修饰符,程序都会成功编译(没有任何警告)并打印10。为什么print可以接受非const参数?或者,换句话说,函数参数中const修饰符的功能是什么?为什么函数的形式和实际参数可以有不同的类型(或修饰符)?

我在Ubuntu 14.04上用-Wall -std=c++11尝试了GCC(4.8.2)和Clang(3.4),结果相同(没有错误/警告)。我也搜索过“c ++ const对象函数”,但没有得到任何看起来很有希望的东西。

3 个答案:

答案 0 :(得分:2)

这是完全正常的。该对象在您的函数中被视为const;它并不是最初被创建为不可变的。

当然,事实恰恰相反!

void foo(T& rarr);

int main()
{
   const T lolwut;
   foo(lolwut);   // oops
}

答案 1 :(得分:0)

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

您可以重载const和非const引用参数,只有在参数确实为const时才会选择const重载(或类型转换结果)在临时通过)。 (对于非参考参数,const很少有意义,甚至可能无法定义此类重载。)

答案 2 :(得分:0)

在这种情况下const所做的就是阻止修改参数变量(在类的情况下,阻止调用未标记为const的函数)。 MyClass可能会被轻视为const MyClass,因为对于const MyClass,您无法对{ - 1}}做任何事情。当然,情况恰恰相反。

(我说&#34;应该&#34;上面,因为如果你愿意的话,当然可以完全颠覆C ++下的const语义,所以函数中存在const原型实际上只是一个有希望的暗示而不是铸铁编译器强制保证。但没有明智的程序员应该破坏这样的东西!)

相关问题