当我们定义了构造函数之后,原有的默认构造函数就不可用了。但是拷贝构造函数还是可用的。
当然我们也可以显式禁止拷贝构造函数。
我们也可以自己定义默认构造函数,可以不带参数就构造一个类对象。
class String {
public:
String(const char∗ p = ""); // default constructor : empty string
// ...
};
String s1; // OK
String s2 {}; // OK
s1不带任何参数也是OK的。因为默认构造函数String(const char p = "") 已经带了默认参数""了。
模板类:
template<class T>
struct Handle {
T∗ p;
Handle(T∗ pp = new T{}) :p{pp} { }
// ...
};
Handle<int> px; // will generate int{}; px == 0
什么时候应该要定义默认构造函数呢?
1 必须情况!当我们需要使用这个类在数组当中,如下:
struct S1 { S1(); }; // has default constructor
struct S2 { S2(string); }; // no default constructor
S1 a1[10]; // OK: 10 default elements
S2 a2[10]; // error : cannot initialize elements
S2 a3[] { "alpha", "beta" }; // OK: two elements: S2{"alpha"}, S2{"beta"}
vector<S1> v1(10); // OK: 10 default elements
vector<S2> v2(10); // error : cannot initialize elements
vector<S2> v3 { "alpha", "beta" }; // OK: two elements: S2{"alpha"}, S2{"beta"}
vector<S2> v2(10,""); // OK: 10 elements each initialized to S2{""}
vector<S2> v4; // OK: no elements
或者我们需要隐藏构造函数的时候,例如单一模式(singleton)的时候需要这么做。
2 我们认为默认值有道理的时候,如数字值为0,字符串为""。但是如栈的数据类型就不应该带默认值了。
reference:
The C++ Programming Language by Bejarne
分享到:
相关推荐
关于“C++构造函数初始化列表 ”的实例分析
C++简单类的实现,包括构造函数,析构函数以及拷贝构造函数
C++类对象的拷贝构造函数 C++类对象的拷贝构造函数 C++类对象的拷贝构造函数 C++类对象的拷贝构造函数 C++类对象的拷贝构造函数 C++类对象的拷贝构造函数
C++ Primer中在讲构造函数初始化列表的时候有这么一段话:无论是在构造函数初始化列表中初始化成员,还是在构造函数体中对它们赋值,最终结果是相同的。不同之处在于,使用构造函数初始化列表的版本初始化数据成员,...
c++派生类继承构造函数方法!!!!!!!!!!!
C++规定与类同名的函数就是拷贝构造函数 默认拷贝构造函数 在类定义中如果没有提供自己的拷贝构造函数,则C++提供一个默认的构造函数,其拷贝策略是逐个成员依次拷贝。 深拷贝和浅拷贝 默认拷贝构造函数均是浅拷贝 ...
C++派生类的构造函数,在初始化对象时,对数据的初始化操作,初学者练习。
主要介绍了c++ 子类构造函数初始化及父类构造初始化的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
C++类和对象练习 构造函数 复制构造函数 缺省参数列表
C++\测试 对象成员构造函数、基类构造函数、派生类本身的构造函数 的先后顺序.rar
简单的c++常识,类的定义,构造函数和析构函数
C++ 拷贝构造函数 赋值构造函数 解释
C++ 类对像构造时,需要对类成员变量完成初始化赋值操作。使用初始化列表完成这步操作在性能上有益处。什么好处呢?摆道理显得不够彻底。看书不如做实验。让我们结合执行过程来查看。考虑如下示例代码: ...
c++初始化列表和构造函数初始化区别.pdf
C++复制构造函数详解C++复制构造函数详解C++复制构造函数详解C++复制构造函数详解C++复制构造函数详解
C++中的构造函数、析构函数剖析 在C+ + 中, 构造函数是一个在构件对象的时 候调用的特殊的函数, 其目的是对对象进行初始 化工作, 从而使对象被使用之前可以处于一种合 理的状态。析构函数是在撤消对象时, 收回对象 ...
C++ 默认构造函数C++ 默认构造函数C++ 默认构造函数C++ 默认构造函数C++ 默认构造函数C++ 默认构造函数C++ 默认构造函数C++ 默认构造函数C++ 默认构造函数C++ 默认构造函数C++ 默认构造函数C++ 默认构造函数
本程序包含构造函数和析构函数,可以把构造函数和析构函数的作用区分开
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如: class CExample { public: int a; float b; //构造函数初始化列表 CExample(): a(0...
根据 C++ 标准,全局变量的初始化要在 main 函数执行前完成,常识无疑,但是这个说法有点含糊,main 函数执行前到底具体是什么时候呢?是编译时还是运行时?答案是既有编译时,也可能会有运行时(seriously), 从...