美文网首页
构造函数/析构函数

构造函数/析构函数

作者: Sheik | 来源:发表于2021-07-29 22:18 被阅读0次

    环境:ide:Mac+clion

    视频链接:
    https://www.bilibili.com/video/BV1Hb411Y7E5?p=5

    构造函数和析构函数,编译器自动调用。

    构造函数,不需要返回值,无需void和类名相同,可以写参数。可以发生重载; 编译器自动调用,只调用一次。
    析构函数,名称与类名相同,析构函数不可以有参数。不能发生重载。在函数名前面加~.对象销毁前编译器自动调用。只调用一次。

    //构造函数.析构函数,拷贝构造函数
    class Person {
    public:
        Person() {
            cout << "默认构造函数执行" << endl;
        }
    
        Person(int a) {
            cout << "有参构造函数执行" << endl;
        }
    
        ~Person() {
            cout << "析构函数执行" << endl;
        }
    
        //拷贝构造函数,必须是const 以及引用的方式传递。
        Person(const Person &p) {
            //将传入的人的属性,copy到当前对象的身上。
            cout << "拷贝构造函数!" << endl;
        }
    
    
    };
    
    int main() {
        /**
         * 括号法初始化对象。
        */
        //Person p();//这个不是调用默认构造函数,作为函数声明来使用。不能用括号法来创建对象。
        Person person;//执行默认构造函数。然后执行析构函数。
        Person person1(1);//执行有参构造函数,析构函数。
        Person p2(person1);//copy 构造函数
    
        /**
        * 显示初始化方法。
        */
        Person p1 =Person();
        Person p3 = Person(10);//有参构造函数。右边的叫做匿名对象,当前行执行结束后,系统会立即回收掉对象。
        Person p4 = Person(p3);//copy 构造函数
    
        /**
        * 隐示转换
        */
        Person p5 = 10; //又参构造
        Person p6 = p4;//这是拷贝构造函数。
    
    
        return 0;
    };
    

    1.值传递其实就是copy 了一个副本,所以必然会调用copy 构造函数。
    2.利用一个已有的数据,来初始化新的对象。
    3.值方式传递局部对象。

    //这里是值传递。就会执行copy 构造函数
    void doWork(Person1 p) { 
    }
        Person1 person1;
        doWork(person1);//这里会产生一个copy 副本。
    
        Person1 person2(10);
        Person1 person3(person2); //这里直接用person2 来给person3进行copy 赋值。
    

    只要写一个类,那么就会默认添加:如果写了默认构造函数,就不会调用默认的构造函数。析构函数和默认copy 构造函数也一样。
    1.默认构造函数(空实现)
    2.默认析构函数 (空实现)
    3.默认copy 函数。对属性进行一个赋值。值copy。
    如果提供了自定义的copy 构造函数,那么编译器就不会提供默认构造函数。

    因为提供了copy 构造函数,所以会忽略掉默认构造函数。

    class Person{
    public:
        Person(const Person &p){
            this->m_Age = p.m_Age;
            cout << "copy 构造函数执行!"<<endl;
        }
    private:
        int m_Age;
    };
    
    void test() {
        Person p;//这里编译不通过。因为Person 类只提供了copy 构造函数,就会忽略掉默认构造函数。
    }
    

    相关文章

      网友评论

          本文标题:构造函数/析构函数

          本文链接:https://www.haomeiwen.com/subject/zjcnmltx.html