2012-10-04 38 views
1

我必须写一个新的类成员像有静态const成员时赋值运算符?

class A 
{ 
    static int i; 
    const int j; 
    char * str; 
    ... 
    ... 
}; 

现在我想写赋值运算符吧。

A& A::operator=(const A& rhs) 
{ 
    if(this != rhs) 
    { 
     delete [] str; 
     str = new char[strlen(rhs.str)+1]; 
     strcpy(str, rhs.str); 
    } 
    return * this; 
} 

是不是?我将忽略静态和常量成员(?)。

+1

'str = new char [strlen(rhs.str)+1];'*“对不对?” - 不,它不是,'std :: string '是。 –

+1

我可能会建议[复制和交换成语](http://stackoverflow.com/a/3279550/201270)为assigment运算符更好的异常安全?此外:使用'char *'而不是'std :: string'的任何紧迫原因?如果不是,我会强烈建议使用它。如果您需要'char *':与手动内存管理相比,智能指针几乎总是更好的选择。 – Grizzly

回答

8

赋值操作符将一个对象复制到另一个对象中。由于所有相同类型的对象共享相同的静态成员,所以没有理由复制静态成员。

const成员是另一回事。你不能(不应该)改变它们,但是如果两个对象对于一个const成员有不同的值,将一个对象复制到另一个对象可能不是一个好主意; const成员将没有正确的值。这就是为什么编译器不会为具有const成员的类生成复制赋值运算符。所以你首先必须确定复制这样的对象是有意义的,即使const成员的值不正确;然后问自己为什么它有const成员,如果他们不影响它的行为。

参考文献也是如此。 (是的,这里有一个回声)

+0

“这就是为什么编译器不会为具有const成员的类生成复制构造函数或复制赋值运算符。”编译器在具有const属性的成员的情况下生成复制构造函数。 #include using namespace std; class base { \t public: \t const int i; \t public:base():i(10){std :: cout << i << endl;} \t base&operator =(const base&b){return * this;} \t // base(const base&b ):i(bi){} }; int main() { \t \t base b1; \t base b2 = b1; std :: cout << b2.i << endl; } – Sandeep

+0

@Sandeep - 你是对的,谢谢。固定。 –

4

静态成员不属于单个对象,因此您不需要复制这些对象。

const成员不能改变,所以你真的不能做一个适当的副本。也参考。

相关问题