首先c++里的各种运算符都是用函数实现的,比如=,就等号函数。
所以当用=给一个对象赋值的时候,实际调用的是=号所对应的=号函数。
分析下面的代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
#include <iostream>
using namespace std;
class Test{
public :
explicit Test(){
data = 0;
}
explicit Test( int d):data(d){
cout << "C:" << this << ":" << this ->data << endl;
}
//拷贝构造函数
Test( const Test &t){
cout << "Copy:" << this << endl;
data = t.data;
}
//重载=号运算符
Test& operator= ( const Test &t){
cout << "assign" << this << endl;
if ( this != &t){
data = t.data;
}
return * this ;
}
~Test(){
cout << "F:" << this << ":" << this ->data << endl;
}
private :
int data;
};
int main(){
Test t1(10);
Test t2, t3;
t3 = t2 = t1;
return 0;
}
|
重点分析下面的函数
1
2
3
4
5
6
7
8
|
//重载=号运算符
Test& operator = ( const Test &t){
cout << "assign" << this << endl;
if ( this != &t){
data = t.data;
}
return * this ;
}
|
分析点:
1,operator =是什么意思
2,参数为什么是引用类型
3,参数为什么有const限制
4,为什么有if(this != &t)的判断
5,为什么有返回值
6,为什么返回值的类型是引用类型
分析点解答:
Test t2;
t2 = t1;//实际的运作方式是t2.operator=(t1),所以函数里面的this就是t2
1,重载类Test的=号函数,当对类Test的对象用=号操作的时候,就会调用这个重载后的函数
2,避免调用拷贝构造函数
3,避免不小心修改里参数t里面成员变量的值(t.data = 100;)
4,防止自己给自己赋值
5,为了能够使用 t3 = t2 = t1。如果没有返回值,则t3.operator=(t2=t1),的参数里面t2=t1就没有返回值,所以编译不过。
6,不是引用也可以,用引用类型是防止老版本的编译器,在return处调用拷贝构造函数,新版本的编译器(gcc 4.8.5-20),即使不用引用类型,就不会调用拷贝构造函数。
总结
以上所述是小编给大家介绍的c/c++赋值函数(重载=号运算符),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
原文链接:https://www.cnblogs.com/xiaoshiwang/archive/2018/08/17/9491365.html