c ++隐式复制构造函数和赋值运算符

时间:2011-04-08 04:21:36

标签: c++

我的课程定义如下:

#include <iostream>

using namespace std;

class Point
{
    int x, y;

public:

    Point(int a, int b) : x(a), y(b)
    { 
        std::cout << "Constructing point ( " << a << ", " << b << " ) " 
                 << std::endl;
    }

    Point(const Point& p) : x(p.x), y(p.y)
    {
        std::cout << "In copy constructor " << p.x << " " << p.y 
                 << std::endl;
    }

    Point& operator=(const Point& p)
    {
        std::cout << "In assignment operator " << p.x << " " << p.y 
                 << std::endl;
        x = p.x;
        y = p.y;
        return *this;
    }
};

int main()
{
    Point p1 = Point(1, 2); 

    return 0;
}

现在,当我执行此操作时,我看到的是Constructing point (1, 2)。我假设编译器在这里进行一些优化。从理论上讲,临时构造是否正确,然后调用赋值运算符来初始化p1?

2 个答案:

答案 0 :(得分:2)

不,在类似的声明中,=运算符实际上仍然意味着调用构造函数,并且编译器可能将任何可能的复制结构省略为优化。声明中的=永远不会导致调用赋值。因此理论上可以创建临时表并将其复制到p1

答案 1 :(得分:1)

如果要查看operator =,则必须编写如下代码:

Point p1(5, 5);
Point p2(0, 0); //You don't have a default constructor.

p2 = p1; // Now operator = is called.