在编写具有传递给它的 args 的 C++ 函数时,根据我的理解,如果您可以保证对象不会被更改,则应始终使用 const;如果指针不会更改,则应始终使用 const 指针。
什么时候建议这种做法?
什么时候使用 const 引用?例如,与仅通过指针传递它相比有什么优势?
这个 void MyObject::Somefunc(const std::string& mystring)
如果一个字符串实际上已经是一个不可变对象(immutable对象),那么拥有一个 const 字符串有什么意义?
最佳答案
询问是否添加 const 是 错误的问题,很遗憾。
将非常量引用与传递非常量指针进行比较
void modifies(T ¶m);
void modifies(T *param);
这个案例主要是关于样式:你希望调用看起来像 call(obj)
还是 call(&obj)
?但是,有两点差异很重要。如果您希望能够传递 null,则必须使用指针。如果你重载了操作符,你就不能用指针代替。
按值比较 const ref
void doesnt_modify(T const ¶m);
void doesnt_modify(T param);
这是一个有趣的案例。经验法则是“廉价复制”类型通过值传递——这些通常是小类型(但不总是)——而其他类型则通过 const ref 传递。但是,如果您无论如何都需要在您的函数中制作拷贝,您 should pass by value . (是的,这暴露了一些实现细节。C'est le C++。)
将 const 指针与非修改加重载进行比较
void optional(T const *param=0);
// vs
void optional();
void optional(T const ¶m); // or optional(T param)
这与上面的非修改情况有关,除了传递参数是可选的。这三种情况之间的区别最小,所以选择让你的生活更轻松的那个。当然,非常量指针的默认值由你决定。
常量值是一个实现细节
void f(T);
void f(T const);
这些声明实际上是完全相同的函数! 当按值传递时,const 纯粹是一个实现细节。 Try it out:
void f(int);
void f(int const) {/*implements above function, not an overload*/}
typedef void C(int const);
typedef void NC(int);
NC *nc = &f; // nc is a function pointer
C *c = nc; // C and NC are identical types
关于c++ - 何时在函数 args 中使用 const 和 const 引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3967177/