重载C ++赋值运算符

时间:2013-04-08 10:47:37

标签: c++ operator-overloading variable-assignment assignment-operator overloading

我希望使用某些功能扩展std::string,因此我从中派生了String。为了使像String str = stdStr;这样的代码工作,我试图重载赋值运算符,但我的代码由于某种原因没有被调用。我该如何解决?

#include <string>

class String
    :
        public std::string
{

    public:
        /*
        I do know that this constructor will solve the problem, but is it possible to use the operator?

        String ( const std::string& stdString )
        {

            ...

        }
        */

        String& operator= ( const std::string& stdString )
        {
            ...
            return *this;
        }

};

int main()
{

    std::string foo = "foo";
    String bar = foo;

    return 1;

}

7 个答案:

答案 0 :(得分:10)

String bar = foo;

这是复制初始化(等同于

String bar(String(foo));

),不是作业。您应该为此工作实现复制构造函数(或默认情况下初始化变量,然后将foo分配给bar)。

无论如何,从标准C ++类型派生是个坏主意,因为这些类型没有虚拟析构函数。并且组合甚至比继承更好,在你的例子中,你应该使用组合。

答案 1 :(得分:9)

String bar = foo不是作业,它实际上等同于String bar(foo)。如果你写

String bar;
bar = foo;

将按预期调用您的赋值运算符。

答案 2 :(得分:6)

这里的问题是你的行

String bar = foo;

不会调用赋值运算符,因为您没有要分配的对象(尚未创建bar);它调用一个构造函数。实际上,如果它可用,它会调用你的注释掉的构造函数。

如果您真的想使用您的运营商,您必须写:

String bar;
bar = foo; // Now bar exists and you can assign to it

顺便说一句,继承自std::string并不是一个好主意,因为这个类与标准库中的大多数其他类一样,并不是为了继承而设计的。具体来说,它缺少一个虚拟析构函数,如果你以多态方式使用它会导致麻烦,例如:

std::string* str = new String();
delete str; // Oops; the wrong destructor will be called

答案 3 :(得分:1)

在你的情况下,despte = present,将创建新的String对象,因此需要

String ( const std::string& stdString )  

取消评论。 另一种选择是做类似

的事情
String bar;  
bar = foo;  

但这听起来不是一个好主意。

答案 4 :(得分:1)

这样做使用复制构造函数:

String foo("foo");
String foo="hello";//assignment operator here

但这不是:

String foo;
String foo="hello";//copy constructor used here since foo was not initialized

答案 5 :(得分:1)

其他受欢迎的答案是明智的。

为了直接回答你的问题,你正试图这样做。

    String& operator= ( const std::string& stdString )
    {
        // Call the base implementation
        return std::string::operator= ( stdString );
    }

答案 6 :(得分:1)

std :: string foo =“foo”;     字符串bar = foo;

你在main中尝试的操作不会调用copy assignment operator.它相当于调用copy构造函数。

最好避免继承std :: string,因为它没有定义虚析构函数。