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 * 为参数的函数里面,那么函数可以改变指针所指向的值,这是用户不想得到的。所以这两种参数是可以重载的。