2014-04-14 92 views
4

这是怎么MyClass定义拷贝构造函数:为什么被用来代替赋值运算符

class MyClass { 
    double x, y; 
    public: 
     MyClass (double a = 0., double b = 0.) { 
      x = a; 
      y = b; 
      cout << "Using the default constructor" << endl; 
     } 
     MyClass (const MyClass& p) { 
      x = p.x; 
      y = p.y; 
      cout << "Using the copy constructor" << endl; 
     } 
     MyClass operator =(const MyClass& p) { 
      x = p.x; 
      y = p.y; 
      cout << "Using the assignment operator" << endl; 
      return *this; 
     } 
}; 

我测试时,每个构造函数或方法被称为在我的主要程序:

int main() { 
    cout << "MyClass p" << endl; MyClass p; cout << endl; 
    cout << "MyClass r(3.4)" << endl; MyClass r(3.4); cout << endl; 
    cout << "MyClass s(r)" << endl; MyClass s(r); cout << endl; 
    cout << "MyClass u = s" << endl; MyClass u = s; cout << endl; 
    cout << "s = p" << endl; s = p; cout << endl; 
} 

为什么在第四个示例中使用的复制构造函数是MyClass u = s而不是赋值运算符?

编辑

包括输出,问道:

MyClass p 
Using the default constructor 

MyClass r(3.4) 
Using the default constructor 

MyClass s(r) 
Using the copy constructor 

MyClass u = s 
Using the copy constructor 

s = p 
Using the assignment operator 
Using the copy constructor 
+6

因为语言指定'Type var = value'调用'Type'的拷贝构造函数而不是它的赋值操作符。 –

+2

包括你的程序的输出会很好。 – MondKin

+1

请注意,复制构造函数不需要被调用。编译器可以优化它(参见[Copy elision](http://en.wikipedia.org/wiki/Copy_elision))。这是编译器优化不会改变程序的可观察行为(在您的情况下是'cout'语句)的规则的一个例外。 – jrok

回答

8

因为不是一个实际的任务,因为你在同一时间宣布ü。因此,调用构造函数而不是赋值运算符。而且这样更有效率,因为如果不是这个特性,那么首先会调用一个默认的构造函数,然后再调用赋值操作符。这会引发不需要的副本的创建,因此会显着恶化C++模型的性能。

3

因为这是变量的声明和初始化,而不是赋值给现有变量。在变量声明的上下文中,=仅仅是将参数传递给ctor的语法糖。

+0

所以赋值运算符的使用总是与先前声明的对象的存在相关联? – dabadaba

+1

@dabadaba是的。分配意味着赋予现有变量新的价值。为新变量赋值是初始化,这是ctors的工作。 – Manu343726

相关问题