【发布时间】:2022-01-02 08:08:10
【问题描述】:
我正在测试 c++ 类初始化。
class Point
{
private:
int x,y;
public:
Point() = delete;
Point(int a):x(a), y(0) { std::cout << "Conversion" << std::endl;}
Point(const Point&) { std::cout << "Copy constructor" << std::endl;}
//Point(const Point&) = delete;
Point& operator=(const Point&) = delete;
Point(Point&&) = delete;
Point& operator=(Point&&) = delete;
};
int main()
{
Point p1(5); //case1
Point p2 = 5; //case2
return 0;
}
在上面的代码中,我认为“5”首先会被case1/2的转换构造函数转换为临时对象。然后,我预计必须使用复制构造函数来初始化 p1 和 p2。但是,事实并非如此。 当我运行这段代码时,我在控制台中只看到了两条“转换”消息。没有“复制构造函数”消息。
尽管我删除了所有复制构造函数、移动构造函数、复制赋值运算符和移动赋值运算符,但这段代码运行良好。
如果您告诉我在为“5”创建临时对象后将使用什么特殊成员函数进行初始化,我将不胜感激,
我正在使用带有 std=c++17 选项的 g++ 编译器。
【问题讨论】:
-
您的复制构造函数不会复制,因为它无法复制
x和y成员,因此它是错误的。不要编写存根复制构造函数、赋值运算符等代码。如果您编写此类函数,请完成它们。 -
@Ted Lyngmo 感谢您提供适当的标签。
-
@PaulMcKenzie 是的,你是对的。此代码不完整。我只想检查构造函数的行为。但我会听从你的建议。谢谢。
标签: c++ constructor initialization c++17 copy-constructor