我正在上一堂课,
class A {
public:
A(float v)
{
A::v = v;
}
float v;
float set(float v)
{
A::v = v;
return v;
}
float get(float v)
{
return A::v;
}
};
然后我实例化2个类A的对象:
A* a = new A(1.0);
A* b = new A(*a);
当我的A类没有采用A类的构造函数时,为什么没有错误?
答案 0 :(得分:12)
编译器会为您生成一个copy constructor:
如果没有为类类型(结构,类或联合)提供用户定义的副本构造函数,则编译器将始终将副本构造函数声明为其类的非显式内联公共成员。
您可以通过将移动构造函数或赋值之一声明为已删除来使副本构造函数和赋值被删除,并使编译器不声明移动赋值和构造函数:
A(A&&) = delete; // Makes the class non-copyable and non-moveable.
答案 1 :(得分:8)
确实具有复制构造函数:编译器已为您生成了一个副本构造器。
如果要显式禁用该功能,请输入
A(const A&) = delete;
在类声明中;并使用
A(A&&) = delete;
删除全部五个函数的规则,但析构函数除外。
答案 2 :(得分:5)
如果未指定自己的隐式副本构造函数,则编译器将生成该副本构造函数。
进一步说明:
尝试
A a = 3.0f;
结论:除非您喜欢隐式转换,否则始终将采用单一基本数据类型的构造函数标记为explicit
...