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)析构函数

  • 相关阅读:
    信息系统项目管理师2009年上午试题分析与解答
    信息系统项目管理师2005年上半年试题
    信息系统项目管理师2008年下半年试题
    信息系统项目管理师历年上午试题答案及试题和大纲
    信息系统项目管理师2008年上半年试题
    信息系统项目管理师2005年下半年试题
    信息系统项目管理师2006年下半年试题
    一个经典的问题(构造函数调用+抽象类+间接继承抽象类)
    重载构造函数+复用构造函数+原始构造与This引用的区别(一步步案例分析)
    GetType()与Typeof()的区别 举了2个案例
  • 原文地址:https://www.cnblogs.com/chen-cai/p/9579323.html
Copyright © 2011-2022 走看看