C++类与对象(中下)

目录

拷贝构造函数

特性

编译器默认生成的拷贝构造

赋值运算符重载

特性

编译器默认生成的赋值重载

const成员

取地址及const取地址操作符重载


拷贝构造函数

拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。

特性

1. 拷贝构造函数是构造函数的一个重载形式
2. 拷贝构造函数的参数只有一个必须使用引用传参,使用传值方式会引发无穷递归调用
3.若未显示定义,系统生成默认的拷贝构造函数
如下代码中想把d1对象拷贝给d2对象,代码貌似没有什么问题,但是却编译失败了,为什么呢?

 因为函数传参得过程中要发生一次值拷贝,在语句 Date d2(d1); 执行时,d1要把值传递给d,在这个过程中又去调用了拷贝构造,从而造成了无穷递归调用。正确的写法如下:

 引用传参,就很好的就解决了这一问题。

编译器默认生成的拷贝构造

 默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝我们叫做浅拷贝,或者值拷贝。
以下日期类中并没有显示定义出拷贝构造,但是代码执行后,完成了d1到d2的拷贝。

 为什么说编译器自动生成的拷贝构造是浅拷贝呢?如下代码就给出了解释:

以上 代码中,使用了编译器默认生成的拷贝构造,此时会出现如下图情况:

 s1中的arr和s2中的arr的值一样,指向了同一块申请出来的空间,而像Stack这种类必须要在析构函数中进行释放空间,那么当s1和s2分别析构时,同一块空间被释放了两次,这是不允许的。所以说,默认生成的拷贝构造是一种浅拷贝,也叫值拷贝。

那么默认生成的拷贝构造会对自定义类型做什么呢?请看如下代码:A类中拷贝构造函数被执行了,可以得出这样的结论:默认生成的拷贝构造函数,对于基本类型进行浅拷贝,对于自定义类型,会去调用自定义类型对象的拷贝构造。

赋值运算符重载

C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类 型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。

函数名字为:关键字operator后面接需要重载的运算符符号。

函数原型:返回值类型 operator操作符(参数列表)

以下主要以赋值运算符的重载进行讲解。

特性

1. 返回*this
2.一个类如果没有显式定义赋值运算符重载,编译器也会生成一个,完成对象按字节序的值拷贝。
如下代码进行了赋值运算符的重载:

 在传参过程中,尽量以引用传参,这样就能避免传值传参时调用拷贝构造了。接下来进行连续赋值:

以上代码编译报错了,因为语句:d3=d2=d1;执行是从右往左的,那么在执行完d2=d1后,返回值为void,此时相当于把void赋值给d3,显然这是错的。想解决这一问题,就要更改返回值类型,代码如下:

*this就是对this指针解引用,拿到的是d2对象,直接将其返回。 

此时d2=d1, 执行完成后,拿到了返回值,就可以用d2对d3赋值了。

编译器默认生成的赋值重载

以下代码中并没有给出赋值重载,但是依旧可以使用,这时使用的就是编译器默认生成的了:

 对于自定义类型,默认生成的赋值重载会怎么做呢?来看如下代码:

A类中的赋值重载被执行了,总结一下:默认生成的赋值重载,对于基本类型进行浅拷贝,对于自定义类型,会去调用自定义类型对象的赋值重载。

const成员

const 修饰的类成员函数称之为 const 成员函数 const 修饰类成员函数,实际修饰该成员函数 隐含的 this 指针 ,表明在该成员函数中 不能对类的任何成员进行修改。
什么意思呢?来看如下运算符重载的代码:

 以上对"=="运算符进行了重载,比较两个类对象中的值是否相等,但是这样的比较有缺陷。万一把"=="写成了"=",那么编译不报错,但是执行代码就发生了错误。所以并不希望去改变两个要进行比较的对象的值,所以代码中可以加上const,如下:

在以上代码中,括号中的const保证d2对象不能直接改变,而括号外的const,保证*this不改变,也就是d1对象不能直接改变。

取地址及const取地址操作符重载

这两个默认成员函数一般不用重新定义 ,编译器默认会生成。

 不经常使用,了解一下就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值