赋值函数剖析

深入探索 JavaScript 中的解构赋值:对象、数组与函数传参案例剖析 本文深入细致地探索 JavaScript 中的解构赋值,针对对象、数组以及函数传参的解构赋值展开了全面且深入的案例剖析。旨在助力读者深度掌握 ES6 中的这一关键知识点。 阅读详情

作者:冯利美,华清远见嵌入式学院讲师。

构造函数,拷贝构造函数,赋值函数和析构函数是C++类中最基本的四大函数。当设计一个类时,要首先考虑这四大函数的写法。若没有提供显式的实现,编译器会产生默认的函数。若类中有指针成员,必须提供这四大函数的实现,否则容易出现内存错误。本文针对赋值函数进行了分析,包括其原型,调用场合,存在的必要性等方面。

1. 赋值函数原型

A& operator =( const A& other) { … … }

2. 调用场合

A a1(10);        // 为a1调用构造函数
        A a2;         // 为a2调用默认构造函数
        a2 = a1;        // 为a2调用赋值函数。
        A & operator =(const A &a){
                if (&a == this)
                        return *this;
                //... 具体赋值操作
                return *this;}

3.考察:

1) 为何首先检查同一性?

答:为了防止自赋值

2) (a=b)=c或者a=(b=c)是否合法

答:合法

3) 若定义为void operator =(const A &a) 有何局限?

答:没有了返回值,就不能实现a=b=c 这样的链式复值。用法不够灵活。

4) 赋值函数存在的必要性

答:以类String的两个对象a,b为例,假设a.m_data的内容为“hello”,b.m_data的内容为“world”。现将a赋给b,缺省赋值函数的“位拷贝”意味着执行b.m_data = a.m_data。这将造成三个错误:一是b.m_data原有的内存没被释放,造成内存泄露;二是b.m_data和a.m_data指向同一块内存,a或b任何一方变动都会影响另一方;三是在对象被析构时,m_data被释放了两次。

5) 若定义为A operator =(const A &a){...return *this;},有何局限?

答:若返回值改成了不是引用类型,则有两个局限。

第一:对于a=(b=c), 操作仍然可以正常进行,但效率降低了。

因为此时的赋值函数会产生一个临时对象,类似于 A tmp=*this. 假设b=c操作产生tmp1, 然后执行a=tmp1,该过程还会产生临时对象tmp2。还会有tmp1, tmp2的析构。过程变得复杂许多。

第二:对于(a=b)=c, 操作不能以期望的方式进行。

假设a=b产生临时对象tmp1, 然后tmp1=c, 这样a不能获得c的值,与常识不符。

深入剖析C++拷贝构造函数赋值运算符重载的核心差异 本文深入解析C++中拷贝构造函数赋值运算符重载的核心差异,重点探讨它们在对象生命周期、触发时机和实现机制上的不同。通过代码示例展示深拷贝实现及资源管理最佳实践,帮助开发者避免常见内存问题,提升面向对象编程能力。 阅读详情

相关推荐

类的函数成员(四):赋值函数

在某些情况下,缺省赋值函数对类与对象的安全性和处理的正确性还不够,这时就要求类的设计者提供自定义的赋值函数。: mov %rcx,0x10(%rbp) //将对象stu1的地址压入栈中: mov %rdx,0x18(%rbp)//将对象stu的地址压入栈中: mov 0x10(%rbp),%rax//从栈中取出对象stu1的地址,传送给rax= &stu)的实现: mov 0x18(%rbp),%rax//从栈中取出对象stu的地址,传送给rax。

shijiyingjie的博客 1342

C++赋值函数|移动赋值函数|移动构造函数

C++赋值函数|移动赋值函数|移动构造函数

weixin_62773441的博客 2979

QT播放器插件内嵌浏览器配合流媒体实现国标摄像头网页端播放

基本原理在浏览器⽹页中的指定播放窗口的位置和⼤⼩,实现⼀个内嵌到⽹页中显⽰的播放窗⼝,前端还必须可对这个内嵌播放窗⼝进⾏控制,⽽且播放窗⼝必须跟随浏览器窗⼝的移动和缩放、⽹页滚动、标签页切换、关闭等操作进⾏⾃动联动。播放器可以通过QT实现。这个播放窗⼝同时提供Web Socket的服务端和JSON打包命令的解析执⾏模块,前端就可以通过Web Socket连接后发送JSON打包的控制命令实现控制播放窗⼝。

cameravision的博客 525

Effective C++ 总结提炼版

Effective C++

Mars1533的博客 729

C++类与对象--赋值运算符重载(Operator=)

赋值运算符重载1. 定义2. 规则 1. 定义 类名 { 类名& operator=(const 类名& 源对象) 拷贝体 } class A { A& operator=(const A& another) { //函数体 return *this; } }; 2. 规则 1.系统提供默认的赋值运算符重载,一经实现,不复存在。 2.系统提供的也是等位拷贝,也就浅拷贝,会造成内存泄漏,重析构。 3.要实现深拷贝,必须自定义。 4.自定义面临的问题有三个

qq_43414070的博客 817

C++类中的构造函数赋值函数

构造函数主要包括:默认构造函数、带参构造函数、拷贝构造函数三种,且构造函数经常与赋值函数混淆,这里放在一起讲,便于区分。 首先初始化一个简单的类作为例子讲解: class A { public: A() { v = 1; printf("默认构造\n"); } A(int t) { v = t; printf("有参构造\n"); } A(const A& a) { th

qq_36721032的博客 1万+

深入剖析 C++ 默认函数:拷贝构造与赋值运算符重载

本文深入探讨了C++类的默认函数、拷贝构造函数赋值运算符重载。编译器会自动生成默认构造函数、析构函数、拷贝构造函数赋值运算符,但当类包含指针等资源时需要手动实现深拷贝。拷贝构造函数通过对象引用创建副本,避免无限递归;赋值运算符用于已有对象间的值传递,应返回引用以支持连续赋值。文章以Date类为例,展示了如何合理使用这些特性,强调对资源管理类需手动实现拷贝控制,而对简单类则可依赖编译器默认实现。掌握这些概念是编写健壮C++程序的关键。

2501_91602899的博客 1550

【C++】【5】构造、析构、拷贝构造、赋值重载函数剖析

简单剖析C++构造、析构、拷贝构造、赋值重载

代码狗的博客 835

【C++指南】类和对象(五):类的默认成员函数——全面剖析 赋值运算符重载函数

在C++中,类可以定义自己的赋值运算符(=)来控制对象之间的赋值操作。这被称为赋值运算符的重载。通过重载赋值运算符,我们可以实现更复杂或特定的赋值逻辑,比如深拷贝、资源管理等。 赋值运算符重载是⼀个默认成员函数,用于完成两个已经存在的对象直接的拷贝赋值。 这⾥要注意跟拷贝构造区分,拷贝构造用于⼀个对象拷贝初始化给另⼀个要创建的对象。

倔强的石头的博客 3438

面试题1:赋值运算符函数深度剖析

题目:为给定的类添加yuns

shiquxinkong的专栏 871

Java编译期安全保证(构造函数final赋值原理深度剖析

深入解析Java编译期安全保证机制,聚焦构造函数的 final 赋值原理。揭示如何通过编译时检查确保final字段在对象初始化完成前被赋值,防止未初始化访问。适用于多线程安全、不可变对象构建等场景,提升程序可靠性与性能,值得收藏。

CodeVibe的博客 731

函数的返回值可以不用赋值_Part1·JavaScript 深度剖析 - 函数式编程范式

函数式编程范式1.1函数式编程概念函数式编程就是对运算过程进行抽象注意: 1. 函数式编程的函数指不是程序中的函数(方法),而是数学中的函数即映射关系 2. 相同的输入始终要有相同的输出(纯函数) 3. 函数式编程用来描述数据(函数)之间的映射// 非函数式 let num1 = 2 let num2 = 3 let sum = num1 + num2 console.log(sum) 这...

weixin_39953578的博客 184

【opencv 源码剖析】 四、 Mat的赋值构造函数 和 拷贝构造函数

1.赋值构造函数 右值引用 inline Mat& Mat::operator = (Mat&& m) { if (this == &m) return *this; release(); flags = m.flags; dims = m.dims; rows = m.rows; cols = m....

weixin_30527323的博客 238

【C++】走进 ⌈ 类和对象 ⌋ 的核心 - 感受C++的精华 _ 剖析默认成员函数 | 构造函数 | 析构函数 | 拷贝构造函数 | 赋值运算符重载

✨对于内置类型来说:编译器自动生成的构造函数(显示定义一个全缺省的构造函数)和析构函数就已经足够了编译器自动生成的拷贝构造函数赋值运算符重载会实现浅拷贝对于自定义类型来说:编译器会自动调用其默认成员函数实现相关的初始化、拷贝赋值、析构等操作若自定义类型的成员涉及深拷贝等操作,我们则需要对拷贝构造函数赋值运算符重载显示实现深拷贝若涉及到内存的释放,析构函数需要显示定义去释放空间。

Dream_Y.ocean的博客 1693

C++从入门到起飞之——拷贝构造函数&(赋值)运算符重载 全方位剖析

内置类型。

2301_80221228的博客 1515

list源码剖析

list源码剖析 文章目录list源码剖析定义模板参数成员函数特殊函数元素访问迭代器容量修改器操作非成员函数参考资料 定义 定义:支持常数时间从容器任何位置插入和移除元素的容器。不支持快速随机访问。通常实现为双向链表。 template< class T, class Allocator = std::allocator<T> > class list; 模板参数 T - 必须满足可拷贝赋值 (CopyAssignable) 和可拷贝构造 (CopyConstructi

弥川的博客 437

c语言中赋值参数和引用参数,举例剖析C++中引用的本质及引用作函数参数的使用...

引用的意义与本质1)引用作为其它变量的别名而存在,因此在一些场合可以代替指针2)引用相对于指针来说具有更好的可读性和实用性引用本质思考:思考、C++编译器背后做了什么工作?#include using namespace std;int main(){int a = 10;// 单独定义的引用时,必须初始化;说明很像一个常量int &b = a;// b是a的别名b = 11;cout &...

weixin_36034659的博客 914

构造函数、析构函数赋值函数

作者:寒小阳 时间:2013年9月。 出处:http://blog.csdn.net/han_xiaoyang/article/details/10833931。 声明:版权所有,转载请注明出处,谢谢。 类的构造函数、析构函数赋值函数       学过C++的人都说自己知道构造函数、析构函数赋值函数。它们看似太普通,以致让人容易麻痹大意,但请你

@奮 鬥@的专栏 782
上一篇: Makefile中的伪目标
下一篇: 2009-2010年中国嵌入式开发从业人员调查报告
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值