2011-07-19 22 views
2

在C++中,定义operator=的惯用方法应该是不可变的。例如,其所有成员变量都是const如何为不可变类定义赋值运算符?

typedef unsigned char byte; 

class Binary 
{ 
protected: 
    const unsigned long size; 
    const byte* bytes; 

public: 
    Binary(const unsigned long size); 
    Binary(const Binary &b); 
    ~Binary(void); 

    Binary& operator=(const Binary &b); 
}; 

其中bytes是一个指针,指向在运行时存储器malloc编块。

我是否定义了一个空的赋值运算符或让它使用自动生成的哪一个会明显失败?

我正试图实施并强制执行单指配语义在几个选择类。

回答

9

假设您不打算重新分配您的成员(使用const_cast等),我会建议您在代码中明确提及您没有使用operator =

在当前的C++标准,使其private和未实现:

class Binary 
{ 
    //... 
private: 
    Binary& operator = (const Binary&); 
}; 

在即将到来的C++ 0x标准,delete它:

class Binary 
{ 
    //... 
    Binary& operator = (const Binary&) = delete; 
}; 
+1

你也可以使用升压转换器的方法,并从派生[一个名为'noncopyable'的类(http://www.boost.org/doc/libs/1_46_1/libs/utility/utility.htm#Class_noncopyable),它为你做了肮脏的工作。以下是一些源代码:http://www.boost.org/doc/libs/1_47_0/boost/noncopyable.hpp –

+0

这种技术是否也会应用于“拷贝构造函数”? –

+1

@Jarrob,是的,它可以应用于'class'中的任何成员方法(用于C++标准) – iammilind