C/C++ 函数中的引用、指针或值语义
Reference, pointer or value semantics in C/C++ functions
>我有简单的代码来修剪字符串
std::string TrimEnd(const std::string& str, const std::string& chars)
{
std::string trimmed = str;
int index = 0;
if((index = trimmed.find_last_not_of(chars)) < trimmed.length() - 1)
trimmed.erase(index + 1);
return trimmed;
}
我使用引用作为参数,使用值作为函数返回。是否有使用指针的偏好?在我的情况下,返回修剪字符串的副本。在某些函数中,返回常量引用。
不,不是一般意义上的。 如果需要能够传入 NULL 化的指针,或者需要对参数执行一些指针算术,请传递指针。 否则,默认情况下传递引用。
对于C++样式,按值返回。 按引用/常量引用传递。( POD 的值 ) 永远不要通过引用返回,除非它引用静态存储,或者如果你想公开对它们的访问权限(通常是 const 并会用于此)的成员变量。是的,按值返回会生成另一个副本,但是较旧的C ++标准允许编译器对其进行优化。新的 c++ 11 标准允许移动构造函数,这甚至更棒。
如果您返回一个新字符串,则没有理由通过引用传递,并且您当然不想返回对trimmed
的引用,因为它的作用域是TrimEnd
方法。
除非你试图优化你的代码,否则我会按值传递。如果您正在编写自己的字符串类(或类似的东西),并且性能是您的首要任务,那么我会通过引用来做所有事情。
在这里,由于您无论如何都要复制第一个参数,因此您不妨按值传递它:
std::string TrimEnd(std::string str, const std::string& chars)
{
int index = 0;
if((index = str.find_last_not_of(chars)) < str.length() - 1)
str.erase(index + 1);
return str;
}
通常:
通过
const
引用传递对象类型。按值传递基元(例如,
int
),以及需要可变副本时的对象类型。当指针可能为 null 时,通过指针传递参数。
按值或智能指针返回(例如,
unique_ptr
);原始指针的所有权不明确。
相关文章:
- 何时在引用或唯一指针上使用移动语义
- 如何从具有移动语义的类对象中生成共享指针
- c++在使用指针时移动语义
- 是否可以/希望创建不可复制的共享指针模拟(以启用weak_ptr跟踪/借用类型语义)?
- 如何包装多级原始指针以赋予其容器语义
- 智能指针移动语义我不清楚
- 如何使用不同的指针算术语义
- 基于指针容器循环的范围内的值语义
- 为什么我们应该使用带有唯一指针的 std::move 语义?
- 在封装指针的类中,移动语义无意中被复制构造函数取代
- 移动语义是否只是一个浅层副本并将其他人的指针设置为 null?
- 明智的指针所有权语义和平等
- C++ 中不同指针语法之间的语义差异
- C/C++ 函数中的引用、指针或值语义
- 传递指向常量指针的指针到字节数组的语义冲突
- 文件输入和指针所有权语义
- 唯一指针xvalue语义?为什么lambda f2的行为与lambda f1不同
- C++11 智能指针语义
- 传递函数指针 - 语义
- "值语义"和"指针语义"是什么意思