2012-11-28 114 views
3

可能重复:
What are copy elision and return value optimization?为什么我的拷贝构造函数不被调用?

我有以下程序:

#include <iostream> 

using namespace std; 

class Pointt { 
public: 
    int x; 
    int y; 

    Pointt() { 
     x = 0; 
     y = 0; 
     cout << "def constructor called" << endl; 
    } 

    Pointt(int x, int y) { 
     this->x = x; 
     this->y = y; 
     cout << "constructor called" << endl; 
    } 

    Pointt(const Pointt& p) { 
     this->x = p.x; 
     this->y = p.y; 
     cout << "copy const called" << endl; 
    } 

    Pointt& operator=(const Pointt& p) { 
     this->x = p.x; 
     this->y = p.y; 
     cout << "op= called" << endl; 
     return *this; 
    } 
}; 

Pointt func() { 
    cout << "func: 1" << endl; 
    Pointt p(1,2); 
    cout << "func: 2" << endl; 
    return p; 
} 


int main() { 
    cout << "main:1" << endl; 
    Pointt k = func(); 
    cout << "main:2" << endl; 
    cout << k.x << " " << k.y << endl; 
    return 0; 
} 

我期望的输出如下:

main:1 
func: 1 
constructor called 
func: 2 
copy const called 
op= called 
main:2 
1 2 

但我得到以下几点:

main:1 
func: 1 
constructor called 
func: 2 
main:2 
1 2 

的问题是:为什么不从FUNC返回一个对象,以主打电话给我拷贝构造函数?

+2

我明白你为什么期望复制构造函数被调用,但你不应该期望赋值操作符被调用。当在初始化中使用“'='”时,实际上不是赋值运算符,而是复制初始化(在这种情况下优化了)。如果没有优化,将会有2次调用拷贝构造函数。 –

回答

相关问题