二、默认成员函数
2、析构函数
析构函数是在对象生命周期结束时,编译器自动调用的函数,用于清理对象内不能自动释放的数据,比如malloc、realloc、fopen的等。
函数名是类名,类名前加~,无返回值,无参数。
一个类只能有一个析构函数,如果没有被显式定义,编译器会自动生成一个析构函数。
析构函数也不支持重载。
编译器自动生成的析构函数,对内置类型不做处理,对自定义类型,调用自定义类型自己的析构函数。
class Taaa{
public:
~Taaa(){
;
}
private:
int a;
int b;
}
3、拷贝构造函数
拷贝构造函数的一般用法如下:
int main()
{
Date d1(2, 4, 7);
//拷贝构造
Date d2(d1);
//或者
Date d2 = d1;
return 0;
}
可以看到拷贝构造其实就是把一个原有的该类的对象的数据对另一个新建的该类的对象进行初始化。
构造拷贝函数是构造函数的一个重载形式,它的参数只有一个,是对该类的一个对象的引用,如果使用传值形式给参数则会导致编译器报错。
Date(Date& d) {
_a = d._a;
_b = d._b;
_c = d._c;
}
如果没有显式定义拷贝构造函数,编译器也会自动生成一个默认的拷贝构造函数,只是默认的拷贝构造函数使用的是值拷贝,也就是浅拷贝。
所以我们平时使用拷贝构造函数时,如果要求使用深拷贝,是需要自己实现的,而不能用默认拷贝构造函数。
三、运算符重载
运算符重载是具有特殊函数名的函数,其他部分和普通函数一样,也有返回值类型,函数名,和参数列表。
class Date {
public:
//Date(int a = 0, int b = 0, int c = 0) {
// _a = a;
// _b = b;
// _c = c;
//}
//Date(const Date& d) {
// _a = d._a;
// _b = d._b;
// _c = d._c;
//}
//~Date() {
// ;
//}
//void Print() {
// cout << this->_a << '-' << this->_b << '-' << this->_c << endl;
//}
bool operator>(const Date& d) {
if (_a > d._a) {
return true;
}
else if (_a == d._a) {
if (_b > d._b) {
return true;
}
else if (_b == d._b) {
if (_c > d._c) {
return true;
}
}
}
return false;
}
private:
int _a;
int _b;
int _c;
};
int main()
{
Date d1(2, 4, 7);
Date d2(3, 5, 7);
d1.operator>(d2);
d1 > d2;
return 0;
}
另外还需要注意:
1.不能通过operator来创建新运算符,比如试图用operator@来把@定义为一个新运算符;
2.重载操作符需要至少有一个自定义类类型作为参数,只用于内置类型的操作符是不可被重载的;
3.有五种操作符不可被重载:域作用限定符、sizeof、条件操作符、结构成员访问操作符、成员指针运算符。
:: sizeof ? : . .*
】类和对象(默认成员函数、运算符重载)&spm=1001.2101.3001.5002&articleId=142263485&d=1&t=3&u=bdc4e16636064433aa80b1919aff727e)
1651

被折叠的 条评论
为什么被折叠?



