`
bcyy
  • 浏览: 1824527 次
文章分类
社区版块
存档分类
最新评论

C++类初始化 构造函数 笔记

 
阅读更多

当我们定义了构造函数之后,原有的默认构造函数就不可用了。但是拷贝构造函数还是可用的。

当然我们也可以显式禁止拷贝构造函数。

我们也可以自己定义默认构造函数,可以不带参数就构造一个类对象。

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics