标签:
重载操作符
重载操作符是一些函数, 其名字为operator后跟着其所定义的操作符符号. 如operator =, operator +, operator * 等等.
操作符函数和普通函数一样, 也是 返回值 + 函数名 + (形参表) , 形参表必须具有与该操作符操作数数目相同的形参(如果操作符是一个成员, 则包括隐式this形参).
赋值操作符
赋值 是二元运算, 所以该操作符函数有两个形参: 第一个形参对应着左操作数, 第二个形参对应右操作数.
大多数操作符可以定义为成员函数或非成员函数. 当操作符为成员函数时, 它的第一个操作数隐式绑定到this指针. 有些操作符(包括赋值操作符) 必须是定义自己的类的成员. 因为赋值必须是类的成员, 所以this绑定到指向左操作数的指针. 因此,赋值操作符接受单个形参, 且该形参是同一类类型的对象. 右操作数一般为const引用传递.
合成赋值操作符
合成赋值操作符与合成复制构造函数的操作类似, 它会执行逐个成员赋值: 右操作数对象的每个成员赋值给左操作数对象的对应成员. 除数组之外, 每个成员用所属的常规方式进行赋值. 对于数组, 则给每个数组元素赋值.
class Test
{
private:
int i;
double d;
}
该类的合成赋值操作符可能如下:
Test& Test::operator=(const Test& right)
{
i=right.i;
d=right.d;
return *this;
}
合成赋值操作符返回对左操作数对象的引用.
注: 应该把复制和赋值看作一个单元, 如果需要其中一个, 我们几乎也肯定需要另一个.
复制构造函数和赋值操作符的区别?
复制构造函数和赋值操作符都是用已有的对象A来创建另一个对象B, 区别是复制构造函数是创建一个全新的对象, 即调用复制构造函数之前B是不存在的, 而赋值操作符是处理两个已有的对象, 即赋值前B是存在的. 例如:
Test A(B) ; //复制构造函数
Test C= D; //复制构造函数
Test E;
E= A; //赋值运算符
<span style="font-size:18px;">写一个函数来验证一下:</span>
<span style="font-size:18px;"> </span><pre name="code" class="cpp"><span style="font-size:18px;">#include <iostream> using namespace std; class Exam { public: Exam(){} Exam(const Exam& other) { cout<<"This is a Exam(const Exam& other)"<<endl; } Exam& operator= (const Exam& other) { cout<<"This is a operator= "<<endl; return *this; } }; int main() { Exam A; Exam B(A); //拷贝构造函数 Exam C= A; //拷贝构造函数 Exam D; //重载赋值运算符 D= A; return 0; } </span>
ok!
标签:
原文地址:http://blog.csdn.net/nizhannizhan/article/details/46389829