1.运算符重载补充
重载++运算符时,有前置和后置++,后置++重载时,需要一个int形参以便区分
operator++(int i)
{
Data temp = *this;
this->_a++;
return temp;
}
};
注意,.* :: ?: sizeof . 这五个操作符无法被重载
2.拷贝构造函数
如果一个构造函数的第一个参数是自身类类型的引用,且任何额外的参数都有默认值,则此构造函数被叫做拷贝构造函数,用于将一个对象拷贝初始化给另一个要创建的对象,如果不直接定义拷贝构造函数的话,编译器也会生成一个默认的拷贝构造,对内置成员变量完成浅拷贝
struct Data
{
int _a;
Data(int n = 0)
{
_a = n;
}
//拷贝构造函数
Data(Data& data1)
{
_a = data1._a;
}
};
int main()
{
Data d1(4);
//调用拷贝构造
Data d2 = d1;
return 0;
}
那么,为什么拷贝构造传入的是对自身类型的引用而不是自身类型呢?
C++规定,函数传值传参会调用类的拷贝构造,如果拷贝构造函数是直接传的自身类类型,那么它就又会去调用自身的拷贝构造,就这样形成了无限递归问题,但如果我们传的是引用的话,就不会调用拷贝构造,问题就迎刃而解了
这里需要和赋值运算符的重载做区分
3.赋值运算符重载
赋值运算符重载是一个默认成员函数,用于两个已存在对象的直接拷贝符值,而拷贝构造是将一个已存在对象拷贝给一个将要创建的对象,如果未显示实现赋值运算符重载,编译器也会自动生成一个对内置成员变量完成浅拷贝的赋值运算符重载,注:赋值运算符只能作为类的成员函数重载
struct Data
{
int _a;
Data(int n = 0)
{
_a = n;
}
//拷贝构造函数
Data(Data& data1)
{
_a = data1._a;
}
//赋值运算符重载
Data& operator=(const Data& d1)
{
this->_a = d1._a;
return *this;
}
};
int main()
{
Data d1(4);
Data d2(3);
//对d1赋值
d1 = d2;
return 0;
}