关于C++构造函数的FAQ

[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, 0);  // 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 对象会得到一个错误?

时间: 2024-10-12 12:52:33

关于C++构造函数的FAQ的相关文章

javascript笔记—— 构造函数

出处:http://www.cnblogs.com/RicCC/archive/2008/02/15/JavaScript-Object-Model-Execution-Model.html 数据类型基本数据类型基本数据类型是JS语言最底层的实现.简单数值类型: 有Undefined, Null, Boolean, Number和String.注意,描述中的英文单词在这里仅指数据类型的名称,并不特指JS的全局对象N an, Boolean, Number, String等,它们在概念上的区别是比

C++11 FAQ

 C++11 FAQ auto – 从初始化中推断数据类型 当数据类型未知或不便书写时,使用auto可让编译器自动根据用以初始化变量的表达式类型来推导变量类型.考虑如下代码: template<class T > void printall(const vector< T>& v) { // 根据v.begin()的返回值类型自动推断p的数据类型 for ( auto p = v.begin(); p != v.end(); ++p) cout << *p

在全局对象(不是指针)的构造函数里不要对std集合做太多操作

写MaxvisionOnvif的时候,我用个宏把每个Command类注册到了CommandBuilder里面,通过全局对象初始化实现的,如下: void CommandBuilder::RegisterNewCommand(std::string cmd,FnCreateHandle cb) { m_allCommand.insert(std::pair<std::string,FnCreateHandle >(cmd,cb)); } #define NEW_HANDLE(classType)

FusionCharts导出图表常见问题(FAQ)汇总---FusionCharts常见问题大全

在前面几篇文章中,我们介绍了FusionCharts生成Flash图表常见问题FAQ以及使用中的一些常见报错及调试/解决方法.本文继续介绍FusionCharts导出图表时的一些常见问题(FAQ). 问题描述:我尝试使用Download Package > Code > ExportChartSamples中导出FusionCharts图表时,到最后一步的时候总是报错? 解决方法:在运行下载包中的示例时,你需要进行下列安装步骤: 当运行服务器端示例时,确定你已把相关导出处理程序 (服务器端)

C++ Constructors FAQ

最近对c++的构造函数产生了疑问?即而找到了一篇介绍这些知识的文章,苦于是英文的于是便打算将其翻译下,第一次翻译,翻译不好的地方请指出,谢谢. Q: 默认构造函数到底是什么? 答:很多程序员认为默认构造函数是当用户没有显示定义一个构造函数时,编译器自动的为我们合成一个默认的构造函数.其实这是错误的(这个在深入理解C++对象模型里面也有详细的介绍),一个默认构造函数可以是程序员定义也可以是编译器合成的.所谓的默认构造函数是当且仅当类能在没有任何参数时所调用的构造函数.如下: struct A {

c++ Constructor FAQ 续

这一章节我们来了解下什么时候编译器既会声明也会定义默认构造函数.它也同样解释了为什么看起来没有什么意义的即使不给定义也要声明一个默认构造函数的意义. Q:编译器什么时候隐式定义一个默认构造函数. 答: 一个隐式声明的默认构造函数只有在编译器需要的时候才隐式定义一个默认构造函数.只有如下情况其才是必须的. 1.拥有虚成员函数的类.一个有虚成员函数的类一定会有一个non-trivial的构造函数.一个non-trivial的构造函数可能是用户定义的或者是编译器隐式定义的构造函数.并且它有责任为例如v

C++11 FAQ中文版--转

更新至英文版October 3, 2012 译者前言: 经过C++标准委员会的不懈努力,最新的ISO C++标准C++11,也即是原来的C++0x,已经正式发布了.让我们欢迎C++11! 今天获得Stroustrup先生的许可,开始翻译由他撰写和维护的C++11 FAQ.我 觉得这是一件伟大而光荣的事情,但是我又觉得压力很大,因为我的英语水平很差劲,同时自己的C++水平也很有限,很害怕在翻译过程中出现什么错误,贻笑大方不要紧,而误人子弟就罪过大了.所以,我这里的翻译只能算是抛砖引玉,如果你的英文

【转载】C++拷贝构造函数(深拷贝,浅拷贝)

对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. #include <iostream>using namespace std;class CExample {private:     int a;public:     CExample(int b)     { a=b;}     void Show ()     {        cout<

C++程序设计方法3:移动构造函数

移动拷贝构造函数 语法: ClassName(ClassName&&); 目的: 用来偷"临时变量"中的资源(比如内存) 临时变量被编译器设置为常量形式,使用拷贝构造函数无法将资源偷出来("偷"是对原来对象的一种改动,违反常量的限制) 基于"右值引用"定义的移动构造函数支持接受临时变量,能偷出临时变量中的资源: #include <iostream> using namespace std; class Test {