通过引用传递对象时是否调用复制构造函数?
Is the copy constructor called when an object is passed by reference?
当类对象按值传递给任何函数时,将调用复制构造函数来创建本地对象,并在返回对象时调用析构函数。 但是,如果传递了对象引用,是否会调用复制构造函数?
不,它不会被调用。
引用是别名,即现有变量的另一个名称,而不是副本的另一个名称。
看看这个例子:
class Line {
public:
int getLength( void ){}
// simple constructor
Line( ){
cout<<"constructor"<<endl;
}
// copy constructor
Line( const Line &obj){
cout<<"copy ctsn";
}
};
void callR(Line& l){
cout<<"call by refn";
}
void callC(Line l){
cout<<"call by copyn";
}
int main() {
Line line;
cout<<"before call by referencen";
callR(line);
cout<<"before call by copyn";
callC(line);
}
这将产生以下输出:
constructor -> Line line;
before call by reference
call by ref
before call by copy
copy cts
call by copy
如您所见,当通过引用传递对象时,不会调用复制构造函数。将引用视为指针。
相关文章:
- 返回指向对象的指针的函数调用是否为 prvalue?
- MFC 中的窗口消息管理:添加基类调用是否是强制性的?
- 在 v8 JavaScript 中重复调用C++是否有巨大的开销?
- dynamic_cast每次调用是否比具有空检查的缓存变量更昂贵?
- 对外部函数的调用是否强制从内存加载
- clang 拒绝具有尾随 decltype 返回类型的模板调用是否正确,具体取决于其重载之一?
- 构造函数的初始值设定项列表中的函数调用是否按顺序排序?
- 从 std::d eque 线程对 emplace_back() 和运算符 []() 的并发调用是否安全?
- 函数调用是否作为另一个函数参数遵循任何定义的行为
- 汇编函数调用是否会导致所有寄存器被推送到堆栈中
- 来自另一个线程的 SendMessage() 调用是否将消息发布到消息队列
- Inotify和Select调用是否可以合并
- 函数调用是否需要表达式
- 对 std 构造函数的调用是否需要限定
- 此构造函数调用是否具有特殊名称
- 将 delete 作为运算符或函数调用是否有任何区别
- 使用 COM 跨 CRT 边界调用是否安全
- 是否有一种方法可以使用SFINAE来确定对模板化函数的调用是否会由于所提供的类型而失败
- 类方法调用是否会在for循环中进行优化
- 对运算符的调用是否'delete'同步的?