C++初阶——类和对象(Part3)(默认成员函数:拷贝+操作符重载)

文章详细介绍了C++中的拷贝构造函数,包括其作用、调用方式以及浅拷贝和深拷贝的概念。同时,讨论了显式拷贝构造函数为何必须使用引用参数。此外,文章还涵盖了操作符重载的基本概念、条件和函数书写格式,特别提到了赋值操作符重载的特殊性。
摘要由CSDN通过智能技术生成

目录

一、拷贝构造函数

1、什么是拷贝构造函数?

2、拷贝构造函数的调用

(1)调用方式

(2)调用哪个拷贝构造函数?

3、显式拷贝构造函数的格式

 (1)为什么一定要引用传参?

二、操作符重载函数

1、什么是操作符重载?

2、操作符重载的条件

3、操作符重载函数书写格式

4、赋值操作符重载


一、拷贝构造函数

1、什么是拷贝构造函数?

顾名思义,就是一个可以复制对象数据的函数,而且还是构造函数的一种。

2、拷贝构造函数的调用

(1)调用方式

/* 把 d1 的数据拷到 d2 里 */

Date d2(d1);

(2)调用哪个拷贝构造函数?

2.1 关于浅拷贝与深拷贝

浅拷贝(值拷贝):

即无脑拷贝这个类里面所有成员的值(包括地址值)。

深拷贝:

当对象的构造函数在堆上开空间时,如果是浅拷贝,那么这个堆上的空间就会被两个指针指着,那么当你要调用析构函数时,这个空间就会被释放两次,那么就会导致程序崩溃。因此深拷贝就是要连空间也要重开一个,且空间里面的内容要完全一样。

2.2调用哪个拷贝构造函数?

当没有显式定义拷贝构造函数时,程序就会自己生成一个拷贝构造函数,但要注意的是,这个拷贝函数只进行值拷贝(浅拷贝)。因此,当我们要拷贝的内容都是栈上的内容时,就不用自己写拷贝构造了。但是如果有的内容在堆上的话,那么我们就要自己写拷贝构造了。

3、显式拷贝构造函数的格式

Date(Date& d)
{
    //...
}

 (1)为什么一定要引用传参?

如果不是引用传参,那么函数就是传值函数。那它是怎么传值的呢?不也就通过拷贝构造函数实现的嘛,可是程序还没进入拷贝构造函数呢!因此就会形成无限递归。所以,我们可以用传引用,那样就不用额外开空间了,那么自然也没有拷贝构造函数啥事了。

二、操作符重载函数

1、什么是操作符重载?

操作符重载,其实就是指给一些操作符赋予特殊含义,让我们可以把自定义类型当作内置类型来操作。如 ++ 正常情况下只能让内置类型的变量 +1 ,但通过操作符重载后,++ 就可以使 Date(我们定义的自定义类型) +1 了。

2、操作符重载的条件

(1)我们一般只选取操作变量的结果是否有意义来断定要不要写操作符重载函数。就像 Date +             Date 的结果使没有意义的,因此我们就不会写 Date + Date 的操作符重载函数;但 Date +             天数就有意义(因为其得数是日期),因此我们就可以写 Date + day 的操作符重载函数。

(2)也不是所有操作符都可以给你重载,如 “ . * ” 、“ :: ”、“ ? : ”、“ sizeof ”、“ . ” ,它们都不能             重载。

3、操作符重载函数书写格式

/* 函数的定义 */
bool operator<(Date d) /* 形参表里依然有隐含的 this 指针 */
{
    //...
}

/* 函数调用 */

d1 < d2;
//二者等价
d1.operator<(d2);

4、赋值操作符重载

为什么要把它单拎出来呢?因为如果没有显式定义赋值操作符重载函数,程序会自己生成一个默认赋值重载函数。它的行为和默认拷贝构造一样,就是对内置类型进行值拷贝,对自定义类型就调用该类型的赋值重载函数。但也只有赋值操作重载有这般待遇,其他操作符重载函数是没有的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胎粉仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值