- 1. 赋值运算符
- 2. 运算符重载总结
- C++中不允许重载的运算符
- 重载运算符有以下几个限制
例1:
class CDate
{
int year;
int month;
int day;
public:
CDate(int y, int m, int d) :year{ y }, month{ m }, day{ d }//带参数的构造函数
{
}
CDate(const CDate& dt) :year(dt.year), month(dt.month), day(dt.day) {} //拷贝构造函数
~CDate() {}//析构函数——没有参数的
CDate & operator=(const CDate& dt)//引用
{
if (this != &dt)//防止自己给自己赋值-取地址
{
year = dt.year;
month = dt.month;
day = dt.day;
}
return *this;
}
};
赋值运算符如下:
例2:
lass Int
{
private:
int value;
public:
Int(int x = 0) :value( x )
{
cout << "create Int: " << this << endl;
}
Int(const Int& it) :value( it.value )
{
cout << "copy Int:" << this<< endl;
}
void Print() const
{
cout << "value:" << value << endl;
}
Int& operator=(const Int& it)
{
if (this != &it)
{
value = it.value;
}
cout << "operator=" << this<< endl;
return *this;
}
~Int()
{
cout << "destroy " << this << endl;
}
};
//任何情况下,不要将临时对象以引用返回
Int& fun() //引用返回,不会再构建对象,当函数结束,对象的生存期也会跟着结束
{
Int tmp(10);
return tmp;
}
int main()
{
Int a(0);
a = fun();
a.Print();
return 0;//想要赋值,等号左边一定要有对象,赋值是对象与对象之间进行赋值。
}
注意:
①任何情况下,不要将临时对象以引用返回,而且当函数结束,对象的生存期也会跟着结束;
②想要赋值,等号左边一定要有对象,赋值是对象与对象之间进行赋值。
①运算符重载函数的函数名必须为关键字operator加一个合法的运算符。在调用该函数时,将右操作数作为函数的实参。
②当用类的成员函数实现运算符的重载时,运算符重载函数的参数(当为双目运算符时)为一个或(当为单目运算符时)没有。运算符的左操作数一定是对象,因为重载的运算符是该对象的成员函数,而右操作数是该函数的参数。
③单目运算符“++”和“–”存在前置与后置问题:
前置“++”格式为:
返回类型 类名:: operator ++(){ }
而后置“++”格式为:
返回类型 类名::operator++(int){ }
注意:后置“++”中参数int仅用作区分,并没有什么实际意义,可以给一个变量名,也可以不给变量名。
④C++中只有极少数的运算符不允许重载。
还有#,##,//,也不能进行运算符的重载。
①不可臆造新的运算符;
②不能改变运算符原有的优先级,结合性和语法结构,不能改变运算符操作数的个数;例如,双目就是2个;
③运算符重载不宜使用过多;
④重载运算符含义必须清楚,不能有二义性。



