c++ - 何时在函数 args 中使用 const 和 const 引用?

标签 c++ arguments constants

在编写具有传递给它的 args 的 C++ 函数时,根据我的理解,如果您可以保证对象不会被更改,则应始终使用 const;如果指针不会更改,则应始终使用 const 指针。

什么时候建议这种做法?

什么时候使用 const 引用?例如,与仅通过指针传递它相比有什么优势?

这个 void MyObject::Somefunc(const std::string& mystring) 如果一个字符串实际上已经是一个不可变对象(immutable对象),那么拥有一个 const 字符串有什么意义?

最佳答案

询问是否添加 const 是 错误的问题,很遗憾。

将非常量引用与传递非常量指针进行比较

void modifies(T &param);
void modifies(T *param);

这个案例主要是关于样式:你希望调用看起来像 call(obj) 还是 call(&obj)?但是,有两点差异很重要。如果您希望能够传递 null,则必须使用指针。如果你重载了操作符,你就不能用指针代替。

按值比较 const ref

void doesnt_modify(T const &param);
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 &param); // 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/

相关文章:

c++ - 屏障是如何在消息传递系统中实现的?

android - 在android中将数据从activity传递到dialogFragment

php - 在常量中添加变量

c++ - 将一对添加到具有最少拷贝的 unordered_map 中

c++ - 为什么子类对象调用母类的成员函数?

c++ - 有没有办法用一种类型声明多个函数参数?

java - 可以在 Spring 中注入(inject)带参数的方法吗?

java - Java 中的符号引用

c# - 在 C# 中实现全局常量的最佳方法是什么?

c++ - 更改 ffmpeg 中的 mpeg ts pid 值