【2022/12/19】复习类的默认函数们,构造析构顺序以及const重载

c++类的默认函数

默认构造,默认析构,默认拷贝构造,默认拷贝赋值,默认取地址操作符重载,默认const修饰的取地址操作符重载,默认移动构造函数。今天重点是前四个。

首先,默认拷贝构造什么时候调用呢?假设有一个Test1类,有一个int成员变量
常见的有

Test1 t1(2);
Test1 t2 = t1;

这时候会调用拷贝构造函数,因为t2还没有定义。
但是如果这样写:

Test1 t1(2);
Test1 t2(3);
Test1 t2 = t1;

这样就会调用拷贝赋值了。

当定义一个函数,参数为Test1 t,返回值为Test1,那么也会调用两次拷贝构造函数。

test1 myTest(test1 &t) {
	return t;
}

如果类构造的时候使用的是初始化列表,也会调用t1的拷贝构造函数,如下:

class test2 {
public:
	test1 t;
	test2(test1 &t1) :t(t1) {};	
};

引用显然不会调用任何函数,只不过起个别名罢了。
但是如果这样写:

class test2 {
public:
	test1 t;
	test2(test1& t1) { t = t1; };	
};

就会调用t1的default构造以及t1的拷贝赋值函数了。effective c++推荐初始化列表的方式。

构造析构顺序

先构造的后析构,成员变量后析构。

const重载

一般分为两种情况。

1、一种是常成员函数对非常成员函数的重载:
声明:<类型标志符>函数名(参数表)const;

这种的话,常成员优先调用常成员函数,非常成员优先调用非常成员函数。

2、还有一种是针对参数的const重载,主要看会不会影响实参
比如参数是int,const int这种,传给它们不会对实参造成任何影响,这种重载就是无效的。
int * 和 int * const 也是一样的,把指针地址复制到函数里面,并不会对实参本身造成任何影响。

然而对于 int * 和 const int * 情况便有所不同了,如果把const int * 传到 int * 为参数的函数里面,那么函数可以改变指针所指向的值,这是用户不想得到的。所以这两种参数是可以重载的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值