C++构造函数分类

代码解释:

#include <iostream>
using namespace std;

class Parent{
    public:
    /*默认构造函数*/
    //Parent(){}        //该构造函数不显示地写出来

    /*普通无参构造函数*/
    Parent(){cout<<"普通无参构造函数"<<endl;}
    
    /*普通有参数构造函数*/
    Parent(int value):_value(value){cout<<"普通有参构造函数1"<<endl;}
    // Parent (int value = 0):_value(value){cout<<"普通无参构造函数2"<<endl;}// 不能与无参构造同时使用,二义性;所以为了避免与前面的普通无参构造函数冲突,此处注释掉了

    /*拷贝构造函数*/
    Parent(Parent& p){this->_value=p._value;cout<<"拷贝构造函数1"<<endl;}
    //Parent(Parent& p,string s="hello word"){this->_value=p._value;<<s<<endl;cout<<"拷贝构造函数2"<<endl;}  //与第一个拷贝构造函数有二义性,所以此处注释了
    //Parent(const Parent& p){this->_value=p._value;cout<<"拷贝构造函数3"<<endl;}   //与第一个拷贝构造函数有二义性,所以此处注释了
    
    /*移动构造函数*/
    //Parent(Parent&& p){str= nullptr;str = s.str;s.str = nullptr;cout<<"移动构造函数"<<endl;}//假设此类有一个char *str成员变量,并且p对象在内部new了空间给成员指针变量str

    /*拷贝赋值函数*//*注意,拷贝赋值函数不是构造函数,只是普通的运算符重载函数*/
    const Parent& operator=(const Parent &p)
    {
        if(&p==this)return *this;
        /*假设此类有一个char *str成员变量,并且p对象的str指针成员变量指向一个字符串或字符数组:
        delete []str;
        str=nullptr;
        str=new char[strlen(p.str)+1];
        strcpy(this->str,p.str);
        */
        this->_value=p._value;
        cout<<"拷贝赋值函数"<<endl;
        return *this;
    }
    ~Parent(){
        /*假设此类有一个char *str成员变量,并且p对象的str指针成员变量指向一个字符串或字符数组:
        if(str==nullptr)return;
        delete []str;
        */
       cout<<"析构函数"<<endl;
    }
    protected:
    int _value;
};

int main()
{
    /*默认构造函数的调用方式*/
    Parent p;
    /*普通无参构造函数的调用方式*/
    Parent p1();
    /*普通有参构造函数的调用方式*/
    Parent p2(2);
    /*拷贝构造函数的调用方式*/
    //方式1
    Parent p3=p2;
    //方式2
    Parent p4(p3);
    /*移动构造函数的调用方式*/
    //...
    /*拷贝赋值函数的调用方式*/
    p4=p3;//需要注意,赋值函数不是构造函数,不知道为什么很多文章都喜欢说“赋值构造函数”,但是重载了赋值运算符的函数绝不是构造函数,p4一定是已经存在的对象,而不是还未构造的对象。

    return 0;
}

执行结果:

[Running] cd "/home/username/code/vscode/demo/constructor/" && g++ -std=c++11 construct_demo.cpp -o construct_demo && "/home/username/code/vscode/demo/constructor/"construct_demo
普通无参构造函数
普通有参构造函数1
拷贝构造函数1
拷贝构造函数1
拷贝赋值函数
析构函数
析构函数
析构函数
析构函数

[Done] exited with code=0 in 0.238 seconds

注意:拷贝赋值函数不是构造函数

posted @ 2021-09-29 14:05  一只小菜菜鸟  阅读(261)  评论(0)    收藏  举报