类中默认的函数
我们自己定义的类,或者C++标准里默认提供的类,我们都可以看成是区别于基本数据类型(char,int,double等)的新类型,比如我们使用int类型时,一般会有如下的一些操作,如:
(1)int a;//定义一个变量
(2)int a = 10;//定义一个变量并进行初始化操作
(3)
int a(10);
int b = a;//定义一个变量,并对其进行初始化操作
(4)
void fun(int i){}
int a = 10;
fun(a);//定义一个变量并将其作为函数参数进行传递,函数参数的给值也是初始化操作
既然都是数据类型,那么其操作也是大同小异的。在一个没有任何成员函数的类,会有以下的默认函数(对于这些默认的函数,只要自己手动编写了这些函数,那么默认的就会被覆盖):
class Test { public: Test() {}//默认构造函数 Test(const Test &t) {}//默认拷贝构造函数 Test &operator=(const Test &t) {}//默认“=”运算符重载函数 ~Test() {}//默认析构函数 };
(a)默认无参构造函数(只要是构造函数,都没有返回值的)
作用是让这个新的数据类型可以定义变量(对象),就像int a;
此时,我们不能完成成员变量的初始化,要想完成成员变量的初始化,我们可以自己写一个构造函数,然后再初始化列表中进行成员变量的初始化
(b)默认拷贝构造函数
参数是当前类的一个常量引用
默认的拷贝构造是浅拷贝,当有成员变量时,浅拷贝时这样的:
class Test { public: int m_a; public: Test() {} Test(const Test &t) { this->m_a = t.m_a; } Test &operator=(const Test &t) {} ~Test() {} };
对于这种类型的变量时没问题的,但是当成员变量是其他类的指针变量时,那么就会让两个指针变量指向同一块空间,当我们用delete 指针变量时,就会删除同一块空间删除两次,这样就会导致程序奔溃,所以这种情况,我们需要自己手动编写拷贝构造函数,将那块空间也拷贝一份,这样程序就能正常运行了。
class Test{}; void fun(Test t); Test fun2(); Test t1; Test t2(t1);//调用默认的拷贝构造 Test t3 = t1;//调用默认的拷贝构造 这个和上面是一样的,只是写法不同 Test t4; fun(t1);//调用默认的拷贝构造 t4 = fun2();//调用默认的拷贝构造
(c)默认“=”运算符重载函数
class Test{}; Test t1; Test t2; t2 = t1;//调用默认“=”操作符重载函数
注意:默认拷贝构造函数和默认“=”操作符重载函数都会检查对象是否初始化,比如:
class Test { public: int m_a; }; int main() { Test t1; Test t2; t2 = t1;//编译失败,使用了未初始化的局部变量"t1" Test t3 = t1;//编译失败,使用了未初始化的局部变量"t1" return 0; }
(d)析构函数