• C++构造和析构!


    一般而言,所有的对象都需要一个确定的初始状态!

    C++中的类可以定义与类名相同的特殊成员函数,这种类名相同的成员函数叫做构造函数,构造函数在定义时可以有参数,但是没有任何返回类型的声明(和返回void是两个概念)

    构造函数的调用:一般情况下C++编译器自动调用构造函数

    #include <iostream>
    
    using namespace std;
    
    class Test
    {
    private:
        int i,j,k;
    public:
        Test(int v)
        {
            i = j = k = v;
        }
        void print()
        {
            printf("i = %d,j = %d,k = %d
    ",i,j,k);
        }
    };
    int main()
    {
        Test t1(4);//自动调用构造函数
        Test t2 = 5;//自动调用构造函数
        Test t3 = Test(6);//主动调用构造函数
    
        t1.print();
        t2.print();
        t3.print();
    
        Test tA[3] = {Test(1),Test(2),Test(3)};//主动调用构造函数
        for(int i=0;i<3;i++)
        {
            tA[i].print();
        }
        return 0;
    }
    View Code

    两个特殊的构造函数:拷贝构造函数和默认构造函数

    无参构造函数:当类中没有定义任何一个构造函数,C++编译器会为我们提供无参构造函数和拷贝构造函数。默认构造函数为空什么都不做

    拷贝构造函数:当类中定义了任意的非拷贝构造函数是,C++编译器就不会提供无参构造函数了,会为我们提供拷贝构造函数。默认拷贝构造函数会对成员变量一 一复制。

    #include <iostream>
    
    using namespace std;
    
    class Test
    {
    private:
    
    public:
        Test(const Test& v)//拷贝构造函数
        {
            printf("Test(const Test& v)
    ");
        }
        Test()//默认构造函数
        {
            printf("Test()
    ");
        }
    };
    int main()
    {
        Test t1;
        Test t2 = t1;
        return 0;
    }
    View Code

     C++中提供了初始化列表对成员变量进行初始化

    语法规则:

    Constructot::Constructot():m1(v1),m2(v1,v2),m3(v3)
    {
        //some other assignment operation
    }

    注意:1.成员变量的初始化顺序与声明的顺序相关,与在初始化列表中的顺序无关 2初始化列表先于构造函数的函数体执行

    (初始化与赋值的不同:初始化是用已存在的对象或值对正在创建的对象进行初值设置,赋值是用已存在的对象或值对已经存在的对象进行值设置。)。

    #include <iostream>
    
    using namespace std;
    
    class M
    {
    private:
        int mI;
    public:
        M(int i)
        {
            printf("M(int i),i = %d
    ",i);
            mI = i;
        }
        int getI()
        {
            return mI;
        }
    };
    class Test
    {
    private:
        const int c;
        M m1;
        M m2;
    public:
        Test():c(1),m1(2),m2(3)
        {
            printf("Test()
    ");
        }
        void print()
        {
            printf("c = %d,m1.mI = %d,m2.mI = %d
    ",c,m1.getI(),m2.getI());
        }
    };
    void run()
    {
        Test t1;
        t1.print();
    }
    int main()
    {
        run();
        return 0;
    }
    View Code

    懒惰不会让你一下子跌到 但会在不知不觉中减少你的收获; 勤奋也不会让你一夜成功 但会在不知不觉中积累你的成果 越努力,越幸运。
  • 相关阅读:
    python第八课
    python第七课
    python第六课
    python第五课
    Python基础30类-内置函数实现迭代器协议
    Python基础29类-内置函数(__format__,__slots__,__doc__,__module__,__del__,__call__)
    Python基础28类-内置函数(__getattribute__,__getitem__,__setitem__.__delittem__)
    Python基础27类-包装、组合方式授权、判断对象类型的方法
    Python基础26类-内置函数__setattr__,__getattr__,__delattr__
    Python基础25类-反射
  • 原文地址:https://www.cnblogs.com/Rainingday/p/7569522.html
Copyright © 2020-2023  润新知