当您按值传递给方法时,参数会生成一个副本。复制使用复制构造函数,因此您会遇到对复制构造函数进行无限递归调用的鸡和蛋的情况。
回复评论:
通过引用传递不会使对象的副本开始传递。它只是传递对象的地址(隐藏在引用语法后面),因此复制构造函数内的对象(或通过引用传递对象的任何方法)与外部的对象是相同的对象。
除了在这里解决鸡和蛋的问题外,通过引用传递通常(对于更大的对象 - 大于一个点的大小)更快。
对进一步评论的回应:
您可以编写一种通过指针传递的复制构造函数,它的工作方式与通过引用传递的方式相同。但是显式调用会很麻烦,而隐式调用是不可能的。
宣言:
class X
{
public:
X();
X(const X* const pOther);
};
Run Code Online (Sandbox Code Playgroud)
显式副本:
X x1;
X x2(&x1); // Have to take address
Run Code Online (Sandbox Code Playgroud)
隐式副本:
void foo (X copyOfX); // Pass by value, copy made
...
X x1;
foo (x1); // Copy constructor called implicitly if correctly declared
// But not matched if declared with pointer
foo (&x1); // Copy construcxtor with pointer might (?) be matched
// But function call to foo isn't
Run Code Online (Sandbox Code Playgroud)
最终,这样的东西不会被视为 C++ 复制构造函数。
小智 5
这段代码:
class MyClass {
public:
MyClass();
MyClass(MyClass c);
};
Run Code Online (Sandbox Code Playgroud)
不编译。也就是说,因为这里的第二行:
MyClass a;
MyClass b(a);
Run Code Online (Sandbox Code Playgroud)
理论上应该导致您正在谈论的无限循环 - 它应该a在调用构造函数之前构造 to的副本for b。但是,如果复制构造函数如下所示:
MyClass(const MyClass& c);
Run Code Online (Sandbox Code Playgroud)
然后在调用复制构造函数之前不需要进行复制。
| 归档时间: |
|
| 查看次数: |
242 次 |
| 最近记录: |