简介
类赋值操作符函数写法:Sale_item& Sale_item::operator=(const Sale_item &rhs){。。。。}
与类要控制对象初始化对象的方式一样,类也定义了该类型对象赋值时会发生什么
Sale_item trans,accm;
trns=accum;
与复制构造函数一样,如果没有定义自己的赋值操作符,编译器会合成一个。
合成赋值操作符和合成复制构造函数类似。会执行逐个成员赋值:右操作数对象的每个成员赋值给左操作数对象的对应成员。
//对上面声明的赋值操作符函数进行定义。可以对照着上一节合成复制构造函数一起看,有些相似,形参都是const类类型的引用。
Sale_item& Sale_item::operator=(const Sale_item &rhs){//类外定义成员函数不要忘记加上类作用域Sale_item::
isbn=rhs.isbn;//逐个进行复制
units_sold=rhs.units_sold;
revenue=rhs.revenue;
return *this;//返回被赋值的那个对象
//赋值操作符函数函数名写法:"operator ="
//返回类型:类类型的引用
//形参:const 类类型的引用
}
- 合成赋值操作符根据成员类型使用适合的内置或类定义的赋值操作符,依次给每个成员赋值,该操作符返回 *this,它是对左操作数对象的引用。
======================================================================================
- 与类要控制对象初始化对象的方式一样,类也定义了该类型对象赋值时会发生什么
Sale_item trans,accm;
trns=accum;
- 与复制构造函数一样,如果没有定义自己的赋值操作符,编译器会合成一个。
一、赋值操作符重载—-“operator =”
重载操作符是一些函数,其名字为operator后跟着所定义的操作符符号,so,我们可以定义名为 operator = 的函数,来对赋值进行定义;
操作符函数也有返回值和形参表,形参个数必须有与该操作符操作数目相同的形参。赋值操作符是二运运算,所有该操作符有两个形参:第一个形参对于左操作数,第二个对应右操作数;
大多数操作符可以定义为成员函数或非成员函数。
当操作符为成员函数时,它的第一个操作数隐式绑定到this指针。
有些操作符(包括赋值)必须是定义自己的类的成员。因为赋值必须是类的成员,所以this绑定到指向左操作数的指针。因此,赋值操作符接受单个形参,且该形参是同一类类型的对象。右操作数一般作为const引用传递。(this指针这段不懂)
赋值操作符的返回类型应该与内置类型赋值运算返回的类型相同(5.4.1)。内置类型的赋值运算返回对右操作数的引用,因此,赋值操作符也返回对同一类类型的引用。
class Sale_item{
public:
Sale_item& operator=(const Sale_item &);//声明一个赋值操作符=的函数
};
二、合成赋值操作符
- 合成赋值操作符和合成复制构造函数类似。会执行逐个成员赋值:右操作数对象的每个成员赋值给左操作数对象的对应成员。
//对上面声明的赋值操作符函数进行定义
Sale_item&
Sale_item::operator=(const Sale_item &rhs){//类外定义成员函数不要忘记加上类作用域Sale_item::
isbn=rhs.isbn;//逐个进行复制
units_sold=rhs.units_sold;
revenue=rhs.revenue;
return *this;//返回被赋值的那个对象
}
- 合成赋值操作符根据成员类型使用适合的内置或类定义的赋值操作符,依次给每个成员赋值,该操作符返回 *this,它是对左操作数对象的引用。
三、复制构造函数和赋值操作常一起使用
可以使用合成复制构造函数的类通常也可以使用合成赋值操作符。
一般而言,如果类需要复制构造函数,它也会需要赋值操作符。实际上,应该讲这两个操作符看做一个单元,如果需要其中一个,我们几乎也肯定需要