zoukankan      html  css  js  c++  java
  • 类中默认的函数

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

  • 相关阅读:
    Java.util.Timer的灵活配置与使用
    js字符变量判空
    js获取当前时间格式化字符串
    Java快速获取格式化的日期字符串
    img标签显示图片方法总结
    Java获取给定日期的月初和月末两个日期
    SpringBoot学习--07配置Druid数据库连接池
    SpringBoot学习--06使用jackson返回json数据
    SpringBoot学习--05SpringBoot整合Mybatis(下)(mybatis中踩过的坑)--不定时更新
    SpringBoot学习--04SpringBoot整合Mybatis(上)(配置mybatis generator)
  • 原文地址:https://www.cnblogs.com/chen-cai/p/9579323.html
Copyright © 2011-2022 走看看