一:拷贝构造函数
这个函数用于创建一个与已存在对象相同的对象。
拷贝构造函数:只有单个形参且必须是类类型对象的引用,该形参是对本类型对象的引用(一般常用const修饰),在用已存 在的对象创建新对象时由编译器自动调用。
class date { public: date(int a, int b, int c) { int _year = a; int _month = b; int _day = c; } date(const date& d1) { //拷贝构造 _year = d1._year; _month = d1._month; _day - d1._day; } private: int _year; int _month; int _day; }; int main() { date d1(2024, 8, 11); date d2(d1); return 0; }
其特征:1.参数只有一个(因为隐含了this这个参数)且必须传引用传参,否则无限递归。
2.是构造函数的重载
3.若未显式定义,编译器会生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。4.如果类涉及资源申请,拷贝构造函数一定要写,没涉及的话可以不写。因为涉及资源申请如果浅拷贝会把地址也拷贝了,到时候会自动调用析构,这样就会导致多次析构。二:运算符重载
一:运算符
C++为了类也能用运算符就有了运算符重载。
函数名字为:关键字operator后面接需要重载的运算符符号。比如
bool operator==(const date& d1) { return _year == d1._year && _month == d1._month && _day == d1._day; }
注意:1.必须有一个类类型参数
2.用于内置类型的运算不能改变其含义,+就是+
3.不能创造新符号如operator@
4. . sizeof ?: :: .*这5个不能重载
5.做类成员时看起来参数少一个,其实是有个隐含参数this
二:赋值运算符
赋值运算符重载格式参数类型 : const T& ,传递引用可以提高效率返回值类型 : T& ,返回引用可以提高效率,有返回值是为了支持连续赋值返回 *thisdate& operator=(const date& d) { _year = d._year; _month = d._month; _day = d._day; return *this; }
注意:1.赋值运算重载只能重载成类的成员,不能重载成全局函数。
2.用户没有显式实现时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝 内置类型成员变量是直接赋值的,而自定义类型成员变量需要调用对应类的赋值运算符重载完成赋值。3.如果类中涉及到资源管理,赋值运算符必须实现;没涉及就随意。
三:前置++后置++
date& operator++() { //前置++ _day += 1; return *this; } date operator++(int) { //后置++ 区别就是括号加了个int date tmp(*this); _day += 1; return tmp;//tmp是临时对象 出了作用域不在了,不能引用做返回值 }
感谢你看到这,大家共同进步!