019_构造函数的分类以及对象的三种初始化方法

版权声明:原创,可以评论,技术交流,转载请标识转载何处,尊重作者 https://blog.csdn.net/WUZHU2017/article/details/82621717
/*
    构造函数的分类
*/
#if 1

class Test
{
public:
    //1、无参数构造函数
    Test()
    {
        m_a = 0;
        m_b = 0;
        cout << "我是构造函数 被执行了" << endl;
    }
    //2、有参数构造函数
    Test(int a)
    {
        cout << "我是一个参数的构造函数" << "a = " << a << endl;
        m_a = a;
        m_b = 0;
    }

    Test(int a, int b) //有参数构造函数   //3种方法
    {
        m_a = a;
        m_b = b;
        cout << "有参数构造函数" << endl;
    }

    //3、赋值构造函数(copy构造函数)
    Test(const Test& obj)
    {
        cout << "copy构造函数也是构造函数 " << endl;
    }

    ~Test()//析构函数
    {
        cout << "我是析构函数 被调用了" << endl;
    }
public:
    void printT()
    {
        cout << "普通成员函数" << endl;
    }
private:
    int m_a;
    int m_b;
protected:
};
void test()
{
    {
        //调用无参数构造函数,
        Test t1;//不要写t1()!!!

        //Test t1();// 错误的写法 warning C4930: “Test t1(void)”: 未调用原型函数(是否是有意用变量定义的?)
        t1.printT();//使用的时候, Test t1()会出错
        cout << "hello..." << endl;
    }

    //调用 调用有参数构造函数 3种方法
    //1括号法
    Test t1(1, 2);//调用参数构造函数  c++编译器 自动的 调用构造函数

    //2 =号法   (3, 4) 是一个逗号表达式,此时需要注意类中仅有一个参数的成员函数
    Test t2 = (3, 4);       //   = c+对等号符 功能增强  c++编译器 自动的 调用构造函数
    Test t3 = (3, 4, 5);    //调试看
    Test t4 = 33;           //调试看

    cout << "匿名对象演示" << endl;
    //3 手动调用 构造函数 显示的调用  直接调用构造函数会产生匿名对象
    //只会调用1次构造函数
    //类名 对象名 = 构造函数名(11, 22)
    Test t5 = Test(11, 22);//会产生匿名对象,此时匿名对象转正,不会被析构(匿名对象的去和留问题)直接调用有参构造函数完成t5对象的初始化 

    t1 = Test(11, 22);   //会产生匿名对象,此时匿名对象被析构
    t1 = t5;//把t5 copy 给 t1 是赋值操作,默认是浅拷贝

    /*
    Test t5 = Test(11, 22)   //对象的初始化
    t1 = t5;                 //对象的赋值
    两条语句的 = 是不同的概念
    对象的初始化 和对象的赋值 是两个不同的概念
    */
}
#endif

这里写图片描述

猜你喜欢

转载自blog.csdn.net/WUZHU2017/article/details/82621717