首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重载C++赋值操作符

重载C++赋值操作符
EN

Stack Overflow用户
提问于 2013-04-08 18:47:37
回答 7查看 1K关注 0票数 1

我想用一些功能来扩展std::string,所以我从它派生出我的String。为了让像String str = stdStr;这样的代码工作,我试图重载赋值操作符,但由于某种原因,我的代码没有被调用。我怎么才能修复它?

代码语言:javascript
复制
#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;

}
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-04-08 18:51:15

代码语言:javascript
复制
String bar = foo;

它是复制初始化(等同于

代码语言:javascript
复制
String bar(String(foo));

),而不是赋值。你应该为这个工程实现复制构造函数(或者在默认情况下初始化变量,然后将foo赋给bar)。

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

票数 10
EN

Stack Overflow用户

发布于 2013-04-08 18:51:28

String bar = foo it不是一个赋值,它实际上等同于String bar(foo)。如果你写

代码语言:javascript
复制
String bar;
bar = foo;

您的赋值操作符将被调用,正如预期的那样。

票数 9
EN

Stack Overflow用户

发布于 2013-04-08 18:53:48

这里的问题是你的线路

代码语言:javascript
复制
String bar = foo;

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

如果你真的想使用你的运算符,你必须写:

代码语言:javascript
复制
String bar;
bar = foo; // Now bar exists and you can assign to it

顺便说一句,从std::string继承并不是一个好主意,因为这个类和标准库中的大多数其他类一样,并不是被设计为从继承的。具体地说,它缺少虚拟析构函数,如果您以多态方式使用它,这将带来麻烦,例如:

代码语言:javascript
复制
std::string* str = new String();
delete str; // Oops; the wrong destructor will be called
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15877196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档