首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用C++中的运算符"=“初始化具有值的对象

使用C++中的运算符"=“初始化具有值的对象
EN

Stack Overflow用户
提问于 2018-10-06 23:46:13
回答 2查看 677关注 0票数 0

我有一个只有一个字段的类。我想重载=操作符,以便可以将字符串直接分配给类的成员str。这是我的例子,但是编译器说cannot convert from const char[10] to strtype,我想问为什么会这样呢?

代码语言:javascript
运行
复制
#include <iostream>
#include <string>

using namespace std;

class strtype {
    string str;
public:
    strtype()
    {
        str = "Test";
    }

    strtype(string ss)
    {
        str = ss;
    }

    strtype operator= (strtype &st)
    {
        strtype tmp;
        tmp.str = st.str;
        return tmp;
    }
};

int main()
{
    strtype d = "NEWSPAPER";

}
EN

回答 2

Stack Overflow用户

发布于 2018-10-06 23:56:00

strtype d=“报纸”;

要工作,您必须提供一个以char const*作为参数的构造函数。

另外,使用构造函数的初始化列表来初始化成员变量,而不是在构造函数主体中进行赋值:

代码语言:javascript
运行
复制
class strtype {
    string str;
public:
    strtype()
    : str{ "Test" }
    {}

    strtype(string ss)
    : str{ ss }
    {}

    strtype(char const *ss)
    : str{ ss }
    {}

    strtype& operator=(strtype const &st)  // *)
    {
        str = st.str;
        return *this;
    }
};

*)赋值操作符通常应该接受对const的引用,也应该返回对对象的引用。

票数 3
EN

Stack Overflow用户

发布于 2018-10-07 00:00:43

首先,您的运算符应该将const-reference作为参数:

代码语言:javascript
运行
复制
strtype operator= (const strtype &st)

其次,赋值运算符需要的是strtype而不是const char*。因此,只需为此重载另一个运算符:

代码语言:javascript
运行
复制
strtype& operator= (const char* c) {
    str = c;
    return *this;
}

您还希望更改第一个运算符的内容,如下所示:

代码语言:javascript
运行
复制
strtype& operator= (const strtype &st) {
        str = st.str;
        return *this;
    }

这一点很重要,因此当使用赋值运算符将新值赋给strtype对象时,您希望它更改这些值,而不是创建新的值。这不会有什么效果。返回值就在那里,以防您链接多个赋值,因此它可以使用一个赋值的结果放入下一个赋值中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52680748

复制
相关文章

相似问题

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