C++初级主题--(6)赋值函数
来源:互联网 发布:济南seo网络公司 编辑:程序博客网 时间:2024/05/22 13:16
一.默认赋值函数的一般形式
赋值语句其实是对“=”进行重载。
Test& operator=(const Test &t) { cout<<"赋值函数:"<<this<<"="<<&t<<endl; if(this != &t) data = t.data; return *this; }
二.详解赋值函数
赋值语句的写法必须是上述形式吗,答案是否定的。
1.为什么传参方式是传引用? Test(Test &t)
Test t1(10);Test t2;//t2.operator=(t1);//下式进行改写t2 = t1;
如果采用传值方式,用t1初始化形参时,会调用拷贝构造函数,效率降低。传引用的好处是,不调动拷贝构造函数,时间、内存空间都节约
2.为什么参数前要加const? Test(const Test &t)
传引用的方式,加const代表常引用,防止更改信息,如例子中,不加const,我可以更改t1的data值
Test& operator=(Test &t) { cout<<"赋值函数:"<<this<<"="<<&t<<endl; t.data = 100; if(this != &t) data = t.data; return *this; }
这就会导致更改外部的数据,答案也会使人莫名其妙,很明显我t1.data=10,给t2赋值之后,t2.data也应该是10啊。
3.为什么返回值是类型的引用? Test& operator=(const Test &t)
(1)先解释为什么返回的是类型,而不是空类型(void)
//如果代码中出现连等t3 = t2 = t1;
根据等号自右向左结合,在t2 = t1之后,如果返回值为空,将无法给t3赋值。当然如果你能保证不会出现任何连等的情况,可以返回void,也不需要看下面的一点了。
(2)为什么要返回类型的引用
显而易见,如果单纯返回类型,会调用构造拷贝函数,造成空间时间上的浪费。
(3)返回引用永远不会出问题吗?
举个例子
Test& fun(Test t){ int value = t.GetData(); Test tmp(value); return tmp;}int main(){ Test t1(10); Test t2; t2 = fun(t1);//编译通过,但是错误,此时fun函数运行结束后,局部对象tmp被析构,那么我就是再用一块不确定的空间给对象赋值。最后t2.data是一个随机值。}
那么到底什么时候才能返回引用?
如果要返回的空间在该函数结束后空间被释放,那么不可采用引用;反之,则可。
4.为什么要检查参数
if(this != &t) data = t.data; return *this;
...// Test& operator=(Test *const this, const Test &t)//下式实际形式改写 Test& operator=(const Test &t) { cout<<"赋值函数:"<<this<<"="<<&t<<endl; if(this != &t) data = t.data; return *this; }...... //t2.operator=(t1); //实际形式改写 //operator=(&t2, t1); t2 = t1;
检测是否自身给自身赋值,自身赋值是没有意义的!
举个例子,这样一种情况
Test t1(10);Test &t2 = t1;Test &t3 = t2;t3 = t1; //自身赋值
三.总结
1.赋值函数即等号的重载,“=”此时是函数,而不是单纯的“=”;
2.赋值函数的写法可以依据情况而定,参数是否采用引用,返回值是否采用引用等等,只要确定不出错即可。
3.我认为漂亮的赋值函数的内部构造是:
检测自赋值–>释放原有的内存资源–>分配新的内存资源,并复制内容–>返回本对象的引用
这些将会牵扯到调用优化,深拷贝,浅拷贝,随后文章“函数的调用优化”“深拷贝和浅拷贝”会阐述
- C++初级主题--(6)赋值函数
- C++初级主题--(5)拷贝构造函数
- c 语言。函数赋值
- c函数赋值
- C++初级主题--(2)构造函数和析构函数
- C++初级主题--(3)构造函数的作用
- 【C++】赋值运算符函数
- c函数之【初级I/O函数】
- 【C++】拷贝构造函数和赋值函数
- 复制构造函数与赋值重载(c++)
- 实现C++string的赋值函数
- C++初级主题--(4)引用
- 【C/C++】拷贝构造函数和赋值函数
- 赋值运算符重载函数[C/C++/C#]
- c初级
- 【C/C++】C++高级主题之复制构造函数
- 【C++】拷贝构造函数和赋值符函数
- c++_7: 拷贝构造函数和赋值构造函数
- android查看kernel log
- Codeforces Round #395 (Div. 2)-D. Timofey and rectangles
- 配置
- HDU2112-HDU Today(Floyd & Dijkstra)
- TCP/IP模型 和 OSI七层模型
- C++初级主题--(6)赋值函数
- ubuntu16.04安装teamview,x11vnc,ssh,搜狗拼音
- tcp的滑动窗口
- JavaScript字符集编码与解码
- JavaScript学习总结【9】DOM Ready
- D. Timofey and rectangles
- 添加sudoer方法:https://zhidao.baidu.com/question/126156754.html
- generator对象
- 乒乓球