moc 发表于 2018-8-31 23:14:45

028-C++之构造函数进阶

本帖最后由 moc 于 2018-8-31 23:12 编辑

1、C++编译器提供构造函数规则
1. 当一个类中没有定义任何的构造函数时,C++编译器会自动为我们提供无参和拷贝构造函数;
2.当类中定义了有参或是拷贝构造函数,C++编译器便不会再提供无参构造函数
3.C++编译器提供的拷贝构造函数,是浅拷贝的方式。

2、构造函数初始化列表
C++中提供了初始化列表对类成员变量进行初始化
        使用初始化列表出现原因:
                1.必须这样做:
                        如果我们有一个类成员,它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数,
                        而没有默认构造函数,这时要对这个类成员进行初始化,就必须调用这个类成员的带参数的构造函数,
                        如果没有初始化列表,那么他将无法完成第一步,就会报错。

                2.类成员中若有const修饰,必须在对象初始化的时候,给const int m 赋值
                        当类成员中含有一个const对象时,或者是一个引用时,他们也必须要通过成员初始化列表进行初始化,
                        因为这两种对象要在声明后马上初始化,而在构造函数中,做的是对他们的赋值,这样是不被允许的。
注意:类里变量的初始化顺序根据变量的定义顺序,而不是初始化列表的顺序。
拷贝构造函数也可以带初始化列表。
class DD
{
public:
        DD(int d) //DD中定义了有参构造函数
        {
                cout<<d<<endl;
                m_d = d;
        }
private:
        int m_d;
};

class EE
{
public:
        //构造函数的初始化列表, d1(),d2()里的参数可以通过EE()中传过来
        EE(int _a):d2(1),d1(_a)
        {
                a = _a;
                cout<<_a<<endl;
        }

protected:
private:
        int a;
        DD d1;   //按照变量定义的顺序
        DD d2;
};
void main()
{
        EE e1(3);    // 先调用EE的构造函数,初始化属性a,在去调用DD的构造函数初始化d1,最后初始化d2
        system("pause");   
}
上面未为变量搭建舞台,正常退出时,先析构d2,在析构d1,最后析构e1,先创建的后析构
3、临时匿名对象
        可以在程序中直接调用构造函数,这是会创建一个临时匿名对象。
ABCD(400, 500, 600);   //直接调用类的构造函数,会创建一个临时匿名对象,先调用它的有参构造函数,然后发现没人接受他,他马上又会执行析构函数。
ABCD abcd = ABCD(100, 200, 300);// 这回有人接这个,直接把这个临时匿名对象给abcd, abcd也不用从新申请内存空间啦,也就是有参构造的第三种方式
ABCD abc;
abc =ABCD(1, 2, 4);   //这样也是可以的,创建临时对象,临时对象给别的对象赋值,然后临时对象再析构
注意:在构造函数中调用构造函数
构造函数中是不能调用构造函数的,它只会创建临时对象,而且马上又会被析构。



页: [1]
查看完整版本: 028-C++之构造函数进阶