现在的位置: 首页 > 综合 > 正文

构造函数的点点滴滴

2013年05月22日 ⁄ 综合 ⁄ 共 1369字 ⁄ 字号 评论关闭

■□□

1.构造函数有特定的名字并且不能指定返回值;

2.构造函数用于初始化对象的非静态数据成员,构造函数不能声明为const,因为无论是const对象还是非const对象都有同样的构造过程;

3.只要试图创建一个对象,都会自动调用一个构造函数;

4.构造函数的初始化列表只在构造函数的定义中指定而不是声明中指定,从概念上讲,可认为构造函数分两个阶段执行,初始化阶段和普通计算阶段,前者由初始化列表指定,后者由构造函数体内的所有语句构成;

5.不管成员是否在构造函数初始化列表中显示初始化,类对象成员总是在初始化阶段初始化;

6.在构造函数初始化列表中没有显示提及的每个成员都执行默认的初始化规则:类类型执行自己的默认构造函数,全局内置内型初始化为0,局部内置内型不初始化,注意类的数据成员属于局部作用域;

7.有些数据成员必须在构造函数初始化列表中初始化,而不能用函数体内的赋值来替代,这样的成员是:没有默认构造函数的类对象成员,引用类型成员和const类型成员;

8.也许令人惊讶的是,构造函数的初始化列表仅指定用于初始化成员的值,并不指定这些初始化执行的次序,成员初始化的次序是定义成员的次序;

9.按照与成员声明一致的次序编写构造函数初始化列表是个好主意;

10.我们应该更喜欢使用默认实参的构造函数,因为它减少代码重复,另外,默认参数只出现在类体内,不能出现在类体外的定义中,那会报一个默认参数重复定义的错误;

11.系统只有在类不定义构造函数时才会提供一个合成的默认构造函数,此函数以隐式的默认初始化规则对成员进行初始化;

12.编译器不可能为一个具有没有默认构造函数的类对象成员的类合成一个可用的默认构造函数;

13.无默认构造函数的类对象不能用作动态数组的元素类型,因为在动态分配的时候,都要自动调用类对象的默认构造函数;

14.无默认构造函数的类对象的静态数组必须为每一个元素提供一个显示的初始化式;

15.保存无默认构造函数的类对象的容器如vector,定义时就不能使用接受容器大小而没有同时提供一个元素初始化式的构造函数,如vector<Foo> vecFoo(3, Foo(0,0));

16.因此,实际上如果定义了其它构造函数,则提供一个默认构造函数几乎总是对的,通常,在默认构造函数中给成员提供的初始化值代表该对象是“空”的;

17.隐式类型转换:可以用单个实参定义的构造函数定义了一个从形参类型到该类类型的隐式转换,如Foo(const string&);定义了一个string类型到Foo类型的隐式转换,在期待一个Foo类型对象的地方都可以使用一个string,系统会自动调用Foo的构造函数将string转换为Foo;

18.这个行为是否想要取决于我们认为用户将如何使用这个转换,如果认为用户在不之情的下使用这种转换而可能导致错误,我们应该使用explicit关键字来阻止这种隐式转换;

19.通常,除非有明显的理由想要保留隐式转换,我们都将单形参构造函数声明为explicit,但复制构造函数如Foo(const Foo&);一般不声明为explicit;

20.类中的非static数据成员都通过构造函数而构造,通过析构函数而析构,而static数据成员则不然,它必须在类体外初始化,它是类的一部分,它伴随着类的存在而存在,不受制于对象的析构函数。

抱歉!评论已关闭.