这篇文章主要介绍了C++赋值运算符,C++当中允许类对象赋值,这是通过默认的重载赋值运算符实现的,下面我们就来介绍介绍该内容吧,,需要的朋友可以参考一下
C++当中允许类对象赋值,这是通过默认的重载赋值运算符实现的,它的原型如下:
Class_name & Class_name::operator=(const Class_name &);
它接受并返回一个指向类对象的引用。
将已有的对象赋给另一个对象时,将会使用重载的赋值运算符:
StringBad headline1("Celery");
StringBad knot;
knot = headline1; // 调用赋值运算符如果是对象初始化的过程,则不一定会使用赋值运算符,比如:
StringBad metoo = knot;
像是这种情况很难说,因为metoo是一个新建的对象,它可以使用拷贝构造函数。然而,也可以分成两步来处理,先使用拷贝构造函数创建一个临时对象,然后在赋值的时候使用赋值运算符复制到新对象中去也是可以的。
和拷贝构造函数类似,默认赋值运算符的实现也是对成员进行逐个复制。如果成员本身就是累对象,那么会使用这个类的赋值运算符来复制。
赋值运算符的问题在哪里呢?我们还是看下之前StringBad那个例子,
我们看下下面这段代码:
StringBad sb("test");
StringBad sports("Spinach Leaves Bowl for Dollars");
StringBad knot;
knot = sports;当我们运行的时候就会遇到这样的报错:

报错的原因日志里写得很清楚,我们尝试释放一个没有被分配的内存。
会报错的原因很简单,因为我们执行knot = sports的时候,两个对象内部的字符串指向的是同一个地址。这就导致了析构knot的时候sports对象对应的内容已经不存在了。
解决方案也很简单,就是我们自己重载赋值运算符,保证不会出现简单拷贝的问题。
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;
}到此这篇关于C++赋值运算符的文章就介绍到这了,更多相关C++赋值运算符内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
本文标题为:C++赋值运算符
基础教程推荐
- [c语言-函数]不定量参数 2023-09-08
- C语言实现宾馆管理系统课程设计 2023-03-13
- 全面了解C语言 static 关键字 2023-03-26
- [C语言]二叉搜索树 2023-09-07
- centos 7 vscode cmake 编译c++工程 2023-09-17
- C++实现ETW进行进程变动监控详解 2023-05-15
- C语言 详解字符串基础 2023-03-27
- 带你深度走入C语言取整以及4种函数 2022-09-17
- C++实战之二进制数据处理与封装 2023-05-29
- C语言编程C++旋转字符操作串示例详解 2022-11-20
