• C++中:默认构造函数、析构函数、拷贝构造函数和赋值函数——转


    对于一个空类,编译器默认产生4个成员函数:默认构造函数、析构函数、拷贝构造函数和赋值函数。
    1、构造函数:
    构造函数是一种特殊的类成员,是当创建一个类的时候,它被调用来对类的数据成员进行初始化和分配内存。构造函数的命名必须和类名完全相同,构造函数可以被重载,可以多个,可以带参数。
      eg:

      class A
      {
      public:
      A(){cout<<"无参构造函数";}
      A(int i){cout<<"带参构造函数";}
      };
      A();//调用默认构造函数
      A(1);//调用有参构造函数
      创建一个对象就会调用无参构造函数,也就是默认构造函数,有参的构造函数需要自己调用。
    2、析构函数
    构造函数可以重载,析构函数不能重载,析构函数永远只有一个,如果没写析构函数,c++会自动帮我们写一个析构函数。
    构造函数和析构函数是一对,构造函数用来创建对象,而析构函数是用来撤销对象。
    eg:

    #include <iostream>
    using namespace std;
    
    class A
    {
    public:
    A()
    {
    cout<<"构造函数被调用了!"<<endl;
    }
    ~A(){cout<<"析构函数被调用了"<<endl;}
    };
    
    int main()
    {
    A a;//调用构造函数和析构函数
    A *p=new A;//调用构造函数
    delete p;//调用析构函数
    return 0;
    }

    3、拷贝构造函数

    c++拷贝构造函数(深拷贝、浅拷贝)
    4、赋值函数
    当一个类的对象向该类的另一个对象赋值的时候,就会用到该函数。
    当没有重载赋值函数,通过默认的赋值函数进行赋值操作。
    eg:

    #include <iostream>
    using namespace std;
    class A
    {
    public:
    A(){cout<<"调用构造函数"<<endl;}
    A(char s){cout<<s<<"调用构造函数"<<endl;}
    ~A(){cout<<"调用析构函数"<<endl;}
    };
    
    int main()
    {
    A a('a');
    A b('b');
    b=a;//a,b实际存在,再调用赋值函数,将a赋值给b
    A c(a);//拷贝构造函数
    return 0;
    }

    拷贝函数和赋值函数的差别:
    1、拷贝构造函数是一个对象初始化一块内存区域,这块内存就是新对象的内存区,而赋值函数是对于一个已经被初始化的对象进行赋值操作。
    2、一般来说在数据成员包含指针对象的时候,需要考虑两种不同的处理需求:一种是复制指针对象,另一种是引用指针对象。拷贝构造函数大多数情况下是复制,而赋值函数是引用函数。
    3、实现不一样。拷贝构造函数首先是一个构造函数,它调用的时候是通过参数的对象初始化产生一个对象。赋值函数则是把一个新的对象赋值给一个原有的对象,所以如果原来的对象中有内存分配要先把内存释放掉,而且还要检查一下两个对象是不是同一个对象,如果是,不做任何操作,直接返回。

    #include <iostream>
    
    using namespace std;
    class A
    {
    public:
    A(){cout<<"调用构造函数"<<endl;}
    A(char s){cout<<s<<"调用构造函数"<<endl;}
    A(const A &other);
    A & operator = (const A &a);//重载拷贝函数
    ~A(){cout<<"调用析构函数"<<endl;}
    };
    A& A::operator =(const A &a)
    {
    A example;
    cout<<"调用拷贝函数"<<endl;
    return example;
    }
    
    int main()
    {
    A a('a');
    A b('b');
    b=a;//a,b实际存在,再调用赋值函数,将a赋值给b
    return 0;
    }

    总结:

    对象不存在,且用别的对象来初始化,就是调用了构造函数
    对象不存在,且用别的对象来初始化,就是拷贝构造函数
    对象存在,用别的对象来给它赋值,就是赋值函数
    程序结束,每个对象都会调用析构函数

    参考地址:https://blog.csdn.net/zcyzsy/article/details/52132936

  • 相关阅读:
    concurrent.futures
    HTTP协议
    Web框架原理
    Docker从入门到实战应用
    Mac Homebrew超坑爹的地方
    第6章-7.找出总分最高的学生 (15分)
    第6章-6.求指定层的元素个数 (40分)
    第6章-5.列表元素个数的加权和(1) (40分)
    第6章-4.列表数字元素加权和(1) (40分)
    第6章-3.列表或元组的数字元素求和 (20分)
  • 原文地址:https://www.cnblogs.com/ybf-yyj/p/9320745.html
Copyright © 2020-2023  润新知