类中默认的函数

本文详细介绍了C++中类的基本概念及其默认构造函数、拷贝构造函数、赋值运算符重载函数和析构函数的作用及实现原理。特别强调了在含有指针成员变量时,需要自行实现深拷贝以避免程序崩溃。

我们自己定义的类,或者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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值