类中默认的函数

我们自己定义的类,或者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)析构函数

原文地址:https://www.cnblogs.com/chen-cai/p/9579323.html