C++自定义构造函数出现额外重载,如何强制仅用int参数实例化?
为什么自定义构造函数后仍会出现额外的构造函数重载?
你看到的另外两个构造函数是C++编译器自动生成的特殊成员函数:
MyClass(MyClass &):拷贝构造函数,用于通过已有的类对象拷贝创建新对象MyClass(const MyClass &&):移动构造函数,用于通过右值对象移动创建新对象
根据C++标准,只要你没有显式定义或删除这两个构造函数,编译器就会默认生成它们——哪怕你已经定义了其他自定义构造函数(比如你写的带int参数的版本)。
如果你想强制实例化MyClass必须传入int参数,完全禁止通过拷贝、移动的方式创建对象,只需要显式删除这两个自动生成的构造函数即可:
class MyClass { public: MyClass(int) { } // 显式禁用拷贝构造 MyClass(const MyClass&) = delete; // 显式禁用移动构造 MyClass(MyClass&&) = delete; }; MyClass a(1); // 正常编译 // MyClass b(a); // 编译报错,无法通过拷贝创建实例 // MyClass c(std::move(a)); // 编译报错,无法通过移动创建实例
这样修改后,编译器就不会再生成这两个构造函数,任何尝试不通过int参数创建MyClass实例的代码都会触发编译错误,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Rushkie
相关产品推荐
相关产品推荐

