前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >EasyC++72,赋值运算符

EasyC++72,赋值运算符

作者头像
TechFlow-承志
发布2022-08-26 17:32:36
1800
发布2022-08-26 17:32:36
举报
文章被收录于专栏:TechFlow

作者 | 梁唐

大家好,我是梁唐。

这是EasyC++系列的第72篇,来聊聊赋值运算符。

赋值运算符

C++当中允许类对象赋值,这是通过默认的重载赋值运算符实现的,它的原型如下:

代码语言:javascript
复制
Class_name & Class_name::operator=(const Class_name &);

它接受并返回一个指向类对象的引用。

将已有的对象赋给另一个对象时,将会使用重载的赋值运算符:

代码语言:javascript
复制
StringBad headline1("Celery");
StringBad knot;

knot = headline1; // 调用赋值运算符

如果是对象初始化的过程,则不一定会使用赋值运算符,比如:

代码语言:javascript
复制
StringBad metoo = knot;

像是这种情况很难说,因为metoo是一个新建的对象,它可以使用拷贝构造函数。然而,也可以分成两步来处理,先使用拷贝构造函数创建一个临时对象,然后在赋值的时候使用赋值运算符复制到新对象中去也是可以的。

和拷贝构造函数类似,默认赋值运算符的实现也是对成员进行逐个复制。如果成员本身就是累对象,那么会使用这个类的赋值运算符来复制。

赋值运算符的问题在哪里呢?我们还是看下之前StringBad那个例子,我们看下下面这段代码:

代码语言:javascript
复制
StringBad sb("test");
StringBad sports("Spinach Leaves Bowl for Dollars");
StringBad knot;
knot = sports;

当我们运行的时候就会遇到这样的报错:

报错的原因日志里写得很清楚,我们尝试释放一个没有被分配的内存。

会报错的原因很简单,因为我们执行knot = sports的时候,两个对象内部的字符串指向的是同一个地址。这就导致了析构knot的时候sports对象对应的内容已经不存在了。

解决方案也很简单,就是我们自己重载赋值运算符,保证不会出现简单拷贝的问题。

代码语言:javascript
复制
StringBad & StringBad::operator= (const StringBad & st) {
    if (this == &st) return *this;
    delete []str;
    len = st.len;
    str = new char[len+1];
    std::strcpy(str, st.str);
    return *this;
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Coder梁 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 赋值运算符
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档