eri*_*rip 1 c++ const reference
我正在观看视频,看到了这段代码:
class Dog {
public:
Dog() : age(3), name("dummy") {}
void setAge(const int &a) { age = a; }
private:
int age;
std::string name;
};
Run Code Online (Sandbox Code Playgroud)
我对函数签名感到好奇,setAge因为我从未将其const用作函数参数.我看了几个相关的答案,但没有一个似乎回答了我的问题.
在这样一个基本的例子中,很难看到将const引用传递给函数的好处.
是否有任何理由为什么你要做出参考一个const?我能想到的唯一应用就是嵌入式编程,在制作变量副本时会浪费宝贵的空间.
是否有任何简单的例子,通过const引用很容易看到影响?
制作变量的副本会浪费宝贵的空间并浪费宝贵的时间,这就是为什么避免不必要的副本在任何类型的编程中都要担心,而不仅仅是嵌入式编程.因此,使用const T &引用传递只读参数一直是C++中的习惯用法.
但是,它通常被保留用于传递"重"对象,即复制相对昂贵的对象.将它与标量类型一起使用(如在您的示例中)几乎没有任何意义.
考虑以下三个示例:
(i) void setAge(int &a) { age = a; }
(ii) void setAge(const int &a) { age = a; }
(iii) void setAge(int a) { age = a; }
Run Code Online (Sandbox Code Playgroud)
进一步将您的类视为一个封装的对象,即外部世界通常不知道内部发生了什么。
然后,使用 case (i),调用者无法知道a之后没有更改。
int a=3;
dog.setAge(a); //case (i): what is "a" afterwards?
Run Code Online (Sandbox Code Playgroud)
人们不知道a函数调用后保存的值是什么——事实上,函数签名告诉调用者a可能会发生变化。
另一方面,通过使用变体(ii),您再次通过引用传递对象,即您不进行复制,而是告诉函数可以访问参数的内存地址。与 case 相比(i),现在您确保调用者“您的参数不会发生任何事情”。也就是说,您可以在之后安全地使用该参数,并确保它仍然具有与之前相同的值(--至少在原则上,因为const_cast函数内部也可能发生诸如 a 之类的坏事)。
最后,以防万一(iii),复制int并在函数内部使用它。对于像 那样的内置类型int,这实际上是传递函数参数的首选方式。但是,如果对象的复制成本很高,则它可能无效。
关于整个const 正确性主题,请参见此处。