关于C++构造函数的FAQ

时间:2021-03-12 09:26:37

[1] 构造函数是用来干什么的?

构造函数构建类的对象,初始化类变量,分配资源(内存、文件、信号量、套接口等等)

[2] List x; 和 List x();有什么不同?

  前一个是定义List的一个对象,后者则是一个返回值为List 的函数

[3] 是否一个类的构造函数可以调用另一个构造函数来初始化自己?

  不可以;举一个例子来看这个问题:

class Foo {
public:
Foo(char x);
Foo(char x, int y);
...
}; Foo::Foo(char x)
{
...
Foo(x, ); // this line does NOT help initialize the this object!!
...
}

  语句:

Foo(x, 0); 

 只是初始化了一个临时对象,而不是this对象,因此,该语句没有起到应有的效果。

[4] 是否Fred类的默认的函数函数就一定是Fred::Fred()?

  不一定,默认构造函数指的是不带参数的构造函数,例如:A::A(int x = 3, int y = 5)

  因此,一个类可以不存在默认构造函数,这是必须注意的!

[5] 如果要创建一个Fred 对像数组,什么样的构数函数会被调用?

    对于 Fred a[10]; 或者 Fred *a = new Fred(); 如果类Fred存在默认构造函数,则调用十次默认构造函数;如果类Fred不存在默认构造函数,则编译出错;

  对于 Fred a[10] = {Fred(5,7)}; 则调用 Fred(int, int) 构造函数;

[6] 构造函数初始化成员变量时,应该用 “初始化列表” 还是 “赋值”?

  初始化列表;

   优点:1)提高性能;2)

[7] 在构造函数中用this 指针是否有问题?

[8]什么是“名字构造函数”(Named Constructor Idiom)?

[9] “值返回”意味着额外的拷贝吗?

[10] 为什么我们不能在构造函数初始化列表中初始化一个 static 成员变量?

[11] 为什么一个有 static 成员变量的类会有链接错误?

[12] 什么是“static initialization order fiasco”?

[13] 我该如果避免 “static initialization order fiasco”?

[14] 为什么 construct-on-first-use 什么静态变量而不是指针?

[15] 怎么才能避免静态成员中的“static initialization order fiasco” ?

[16] 我是否要为内建类型的“static initialization order fiasco”而担心?

[17] 如果构造函数出错了怎么办?

[18] 什么是“命名参数惯用法”(Named Parameter Idiom)?

[19] 为什么我通过Foo x(Bar())声明一个Foo 对象会得到一个错误?