有没有一种方法可以防止编译器定义拷贝构造函数,对C++类运算符=重载。防止编译器为C++类定义拷贝构造函数和运算符=重载
回答
您可以将这些函数声明为私有的,以防止人们在使用类时使用它们,同时阻止编译器生成它们。
定义?嗯,是。它们总是宣称为(明确由你自己或由编译器默认),但它们只是由编译器定义的当/如果你真的使用它们。不要使用它们 - 编译器不会定义它们。当然,如果通过“阻止编译器定义......”,你的意思是“阻止编译器从成功地定义 ...”,即如果你想在编译时使隐式定义尝试失败,那么您可以通过向类中添加非复制可构建和/或不可分配的子对象(例如,使用私有复制构造函数和专用赋值运算符的基础或成员)来实现此目的。
@Matthieu M .:首先,什么是“不一定”? 'const'成员是一个不可分配的子对象。其次,你所说的不完全正确。复制分配*总是被声明为*。正如我在我的回答中所说的那样,在“const”成员的情况下,将会失败的* definition *尝试。 – AnT 2010-06-21 08:03:17
是的。从boost :: noncopyable派生。 (也有NIH的方法,通过声明operator =和private构造函数的私有的未定义方法,但是,请喜欢boost)。
自己声明这些函数并将它们设为私有。你也可以不写这个函数的定义,所以每个试图使用这些函数的人都会得到一个链接器错误。
继承自私人范围内声明这些函数的类型,例如boost :: noncopyable。
还是......有一个参考成员变量:P
FWIW如果你避开使用Qt,那么你可以使用Q_DISABLE_COPY
宏:
class Foo
{
public:
Foo();
private:
Q_DISABLE_COPY(Foo)
};
在C++ 0x中,你马上就能写出
class NonCopyable {
NonCopyable & operator=(NonCopyable const&) = delete;
NonCopyable(NonCopyable const&) = delete;
};
注意,编译器将不会产生任何情况下转换NonCopyable::operator=(Other const&)
重载。
这样你就会得到更好的错误信息,至少在我看来。 – 2010-06-21 13:26:57
- 1. 拷贝构造函数和assignemnt运算符重载在C++
- 2. C++编译器如何合成默认拷贝构造函数
- 3. C++编程拷贝构造函数
- 4. 禁止在继承类中定义拷贝构造函数
- 5. 隐式拷贝构造函数/赋值运算符的行为
- 6. 拷贝构造函数和赋值运算符
- 7. 基类的拷贝构造函数(C++)
- 8. c#拷贝构造函数生成器
- 9. 指针和拷贝构造函数C++
- 10. 拷贝构造函数和operator =在C++
- 11. C++中的隐式定义的拷贝构造函数是否也为成员调用拷贝构造函数?
- 12. 为什么隐式拷贝构造函数调用基类拷贝构造函数并且定义的拷贝构造函数没有?
- 13. C++拷贝构造函数/赋值运算错误
- 14. 拷贝构造函数/赋值运算符
- 15. 何种条件下,编译器不会定义implicits(构造函数,析构函数,拷贝构造函数,拷贝赋值)
- 16. 这是为什么发生?运算符=和拷贝构造函数
- 17. 拷贝构造函数knowlege
- 18. 的拷贝构造函数
- 19. 拷贝构造函数++
- 20. C++中的拷贝构造函数
- 21. 拷贝构造函数在C++
- 22. 通用C#拷贝构造函数
- 23. C#泛型拷贝构造函数
- 24. C++默认拷贝构造函数
- 25. C++拷贝构造函数语法
- 26. C++ std :: auto_ptr拷贝构造函数
- 27. (C++)赋值运算符VS拷贝构造函数:当每个隐含使用
- 28. C++隐含的拷贝构造函数和赋值操作符
- 29. 拷贝赋值为未实现的拷贝构造函数
- 30. RVO/NRVO和公开的未定义拷贝构造函数
请注意,这不会阻止这些函数的*声明,因为您刚刚自己声明了它们,编译器在适当的时候可能仍会考虑它们。 – 2013-06-21 15:31:23