C++学习(六):类和对象(三):拷贝构造函数 运算符重载

一:拷贝构造函数

这个函数用于创建一个与已存在对象相同的对象。

拷贝构造函数只有单个形参必须是类类型对象的引用,该形参是对本类型对象的引用(一般常用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& ,返回引用可以提高效率,有返回值是为了支持连续赋值
返回 *this
date& 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是临时对象 出了作用域不在了,不能引用做返回值
	}

感谢你看到这,大家共同进步!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值