我的课程定义如下:
#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?
答案 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.