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++赋值函数(重载=号运算符)
首先c++里的各种运算符都是用函数实现的,比如=,就等号函数. 所以当用=给一个对象赋值的时候,实际调用的是=号所对应的=号函数. 分析下面的代码 #include <iostream> using namespace std; class Test{ public: explicit Test(){ data = 0; } explicit Test(int d):data(d){ cout << "C:" << this << &qu
-
C++赋值运算符
C++当中允许类对象赋值,这是通过默认的重载赋值运算符实现的,它的原型如下: Class_name & Class_name::operator=(const Class_name &); 它接受并返回一个指向类对象的引用. 将已有的对象赋给另一个对象时,将会使用重载的赋值运算符: StringBad headline1("Celery"); StringBad knot; knot = headline1; // 调用赋值运算符 如果是对象初始化的过程,则不一定会使用
-
整理Python中的赋值运算符
下表列出了所有Python语言支持的赋值运算符.假设变量a持有10和变量b持有20,则: 例如: 试试下面的例子就明白了所有在Python编程语言可供选择的赋值运算符: #!/usr/bin/python a = 21 b = 10 c = 0 c = a + b print "Line 1 - Value of c is ", c c += a print "Line 2 - Value of c is ", c c *= a print "Line 3
-
深入解析Python中的变量和赋值运算符
Python 变量类型 变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数据类型,这些变量可以存储整数,小数或字符. 变量赋值 Python中的变量不需要声明,变量的赋值操作既是变量声明和定义的过程. 每个变量在内存中创建,都包括变量的标识,名称和数据这些信息. 每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建. 等号(=)用来给变量赋值. 等号(=)运算符左边是一
-
详解C++ 拷贝构造函数和赋值运算符
本文主要介绍了拷贝构造函数和赋值运算符的区别,以及在什么时候调用拷贝构造函数.什么情况下调用赋值运算符.最后,简单的分析了下深拷贝和浅拷贝的问题. 拷贝构造函数和赋值运算符 在默认情况下(用户没有定义,但是也没有显式的删除),编译器会自动的隐式生成一个拷贝构造函数和赋值运算符.但用户可以使用delete来指定不生成拷贝构造函数和赋值运算符,这样的对象就不能通过值传递,也不能进行赋值运算. class Person { public: Person(const Person& p) = dele
-
简单了解C++语言中的二元运算符和赋值运算符
二元运算符 下表显示可重载的运算符的列表. 可重新定义的二进制运算符 运算符 名称 , 逗号 != 不相等 % 取模 %= 取模/赋值 & 按位"与" && 逻辑"与" &= 按位"与"/赋值 * 乘法 *= 乘法/赋值 + 添加 += 加法/赋值 – 减法 –= 减法/赋值 < 小于 << 左移 <<= 左移/赋值 <= 小于或等于 = 赋值 == 相等 > 大于 >
-
VBS教程:运算符-赋值运算符 (=)
赋值运算符 (=)赋值给一个变量或. variable = value 参数variable 任何变量或可写的属性. value 任何数值或字符串文字.常数.或表达式. 说明等号左边的名称可以是一个简单的标量变量或数组的一个元素.等号左边的属性仅可以是那些在运行时可写的属性.
-
JS的递增/递减运算符和带操作的赋值运算符的等价式
1.递增/递减运算符等价式 a=b++; <=> a=b;b=b+1;a=++b; <=> b=b+1;b=b;a=b--; <=> a=b;b=b-1;a=--b; <=> b=b-1;b=b; 所以,a=5;b=6;var3=a++*--b,结果为25 2.带操作的赋值运算符等价式 a*=b; <=> a=a*b;a/=b; <=> a=a/b;a+=b; <=> a=a+b;a-=b; <=
-
Javascript 按位与赋值运算符 (&=)使用介绍
Javascript 按位与赋值运算符 (&=),对变量值与表达式值设置按位"与"运算的结果. 变量和表达式均被视为 32 位二进制值,而一般表达式里面都是十进制整数,此时需要先转换成对应的二进制,然后向前加0,补足32位. 复制代码 代码如下: result &= [整数2]等价于result = result & [整数2] & 对两个 32 位表达式的每一个位执行按位"与"运算. 如果两个位均为 1,则结果是 1. 否则,结果为
-
详解C++语言中的加法运算符与赋值运算符的用法
加法运算符:+ 和 - 语法 expression + expression expression – expression 备注 相加运算符为: 加 (+) 减 (–) 这些二进制运算符具有从左至右的关联性. 相加运算符采用算术或指针类型的操作数.加法 (+) 运算符的结果是操作数之和.减法 (–) 运算符的结果是操作数之差.如果一个操作数是指针或两个操作数都是指针,则它们必须是指向对象的指针,而不是指向函数的指针.如果两个操作数都是指针,则结果没有意义,除非它们是指向同一数组中的对象的指针.
-
详解C++中对构造函数和赋值运算符的复制和移动操作
复制构造函数和复制赋值运算符 从 C++ 11 中开始,该语言支持两种类型的分配:复制赋值和移动赋值. 在本文中,"赋值"意味着复制赋值,除非有其他显式声明. 赋值操作和初始化操作都会导致对象被复制. 赋值:在将一个对象的值赋给另一个对象时,第一个对象将复制到第二个对象中. 因此, Point a, b; ... a = b; 导致 b 的值被复制到 a 中. 初始化:在以下情况下将进行初始化:声明新对象.参数通过值传递给函数或值通过值从函数返回. 您可以为类类型的对象定义"
-
C++中赋值运算符与逗号运算符的用法详解
赋值运算符 赋值符号"="就是赋值运算符,它的作用是将一个数据赋给一个变量.如"a=3"的作用是执行一次赋值操作(或称赋值运算).把常量3赋给变量a.也可以将一个表达式的值赋给一个变量. 赋值过程中的类型转换 如果赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值时会自动进行类型转换. 1) 将浮点型数据(包括单.双精度)赋给整型变量时,舍弃其小数部分. 2) 将整型数据赋给浮点型变量时,数值不变,但以指数形式存储到变量中. 3) 将一个double型数
随机推荐
- AngularJS实现进度条功能示例
- Vue-router结合transition实现app前进后退动画切换效果的实例
- Logo1免疫补丁.bat
- JavaScript调用堆栈及setTimeout使用方法深入剖析
- js实现无缝滚动特效
- php根据日期或时间戳获取星座信息和生肖等信息
- FrameLayout和Fragment处理Android应用UI布局实例
- mcrypt启用 加密以及解密过程详细解析
- 微信支付开发订单查询实例
- C#事务处理(Execute Transaction)实例解析
- android界面布局之实现文本块布局效果示例
- mysql数据库互为主从配置方法分享
- 用最简单的方法判断JavaScript中this的指向(推荐)
- 个人总结的一些关于String、Function、Array的属性和用法
- 浅谈python新手中常见的疑惑及解答
- JavaScript 变量、作用域及内存
- 详解Node.js开发中的express-session
- C#拼图游戏编写代码
- PHP7扩展开发之基于函数方式使用lib库的方法详解
- pandas数据预处理之dataframe的groupby操作方法