2015-10-14 81 views
-2

我正在阅读复制构造函数以及它们通常将参数作为常量引用接收的方式。 Why should the copy constructor accept its parameter by reference in C++? 我写了一段代码片段来测试,当按值接收参数时,是否创建副本(如提供的链接的接受答案中所述)。 但是,当按值接收对象时,我看不到构造函数。 请解释为什么?并且不是通过值返回对象时创建的副本?再也没有构造函数在那里调用。为什么?为什么构造函数在值传递时没有被调用

class Vector 
{ 
    public: 
    Vector(){cout << "Vector constructor"<<endl;} 
    ~Vector(){cout << "Vector destructor"<<endl;} 

}; 
Vector use(Vector z) 
{ 
    cout << "At call" << endl; 
    Vector v; 
    cout << "after definition" << endl; 
    return v; 
} 
int main() 
{ 
    Vector t; 
    cout << "After irrelevant" << endl; 
use(t); 
cout << "After use"<< endl; 
} 

的输出如下:

Vector constructor 
After irrelevant 
At call 
Vector constructor 
after definition 
Vector destructor 
Vector destructor 
After use 
Vector destructor 

UPDATE1:我已经错过了最初的例子添加拷贝构造函数。一旦完成,代码将按预期行事。

+4

你没有拷贝构造函数。内置的不会打印任何东西;) –

+4

复制构造函数在通过值传递时调用,而不是正常的构造函数。 – owacoder

+0

我的不好,在同一个程序中有很多其他代码..模拟它:)将添加并再次测试 –

回答

3

当对象按值传递时,复制(或移动)构造函数是不会调用默认构造函数。

如果我们追溯拷贝构造函数是这样的:

class Vector 
{ 
    public: 
    Vector(){cout << "Vector constructor"<<endl;} 
    Vector(const Vector&) {cout << "Vector copy constructor"<<endl;} 
    ~Vector(){cout << "Vector destructor"<<endl;} 
}; 

然后,我们看到被调用构造函数:

Vector constructor 
After irrelevant 
Vector copy constructor //here 
At call 
Vector constructor 
after definition 
Vector destructor 
Vector destructor 
After use 
Vector destructor 

上有回报没有副本,因为副本是elided由编译器为了效率。如果您通过-fno-elide-constructors或与您的编译器等效,那么您将看到一个额外的副本。

+1

是的,刚刚测试过的变化,它的工作原理,但为什么不看到它在这里的价值回报调用? –

+0

@HarishKulkarni这是由于复制elision。我添加了一些解释。 – TartanLlama

0

复制被创建以传递该值,因此在那里调用复制构造函数。

#include <iostream> 
using std::cout; 
using std::endl; 
class Vector 
{ 
    public: 
    Vector(){cout << "Vector constructor"<<endl;} 
    Vector(const Vector&){cout << "Vector copy constructor"<<endl;} // add this line 
    ~Vector(){cout << "Vector destructor"<<endl;} 

}; 
Vector use(Vector z) 
{ 
    cout << "At call" << endl; 
    Vector v; 
    cout << "after definition" << endl; 
    return v; 
} 
int main() 
{ 
    Vector t; 
    cout << "After irrelevant" << endl; 
    use(t); 
    cout << "After use"<< endl; 
} 

输出:

Vector constructor 
After irrelevant 
Vector copy constructor 
At call 
Vector constructor 
after definition 
Vector destructor 
Vector destructor 
After use 
Vector destructor 
相关问题