C++值初始化
问题描述:
我被士丹利李普曼阅读C++底漆第4版,我92页约值初始化上。C++值初始化
我只是不约值初始化时理解。我浏览过,我知道也有默认初始化和零初始化。任何人都可以解释价值初始化?
来到这一段..
子句)
“有些类没有定义默认 构造函数。我们不能指定 只有大小初始化这种类型的 载体,我们还必须指定一个 的初始值“
我明白上面的内容,但我发现下面的内容与ab相矛盾Ove句子。
子句B)
“元素类型可能是一个类类型 没有定义任何构造的。 在这种情况下,库仍然 产生一个值初始化的对象,它 这样做通过价值初始化该对象的每个 成员“
我不明白b条款。
任何帮助理解
答
一)这是真实的,如果类定义其他构造 - 从而抑制一个默认的构造的产生。
struct Foo {
Foo(int n) : mem(n) {}
int mem;
};
该类不能进行值初始化。
b)如果类具有没有构造限定值初始化将简单值初始化所有子对象(基类和非静态成员)的Bar
struct Foo {
Foo() : mem(0) {}
int mem;
};
struct Bar {
Foo f;
};
价值初始化简单地意味着f
成员将进行值初始化。
参见例如What do the following phrases mean in C++: zero-, default- and value-initialization?
答
#include <vector>
#include <string>
class fooz {
private:
string s;
int n;
public:
fooz(string& str, int num) {
s=str;
n=num;
}
~fooz(){}
void gets(string& str) {str=s;}
void getn(int& num) {num=n;}
};
vector<class fooz> vfDialpad = {
fooz(string(""),0),
fooz(string(""),1),
fooz(string("abc"),2),
fooz(string("def"),3),
fooz(string("ghi"),4),
fooz(string("jkl"),5),
fooz(string("mno"),6),
fooz(string("pqrs"),7),
fooz(string("tuv"),8),
fooz(string("wxyz"),9)
};
此后,两条规则都已被激活。这是一个初始化器列表,它对C++来说是新的,你可能会或可能不会在新版本的gcc中找到它。每个元素获取初始化的新对象。
也许我不是在最好的例子在这里,但它是一个开始。
你能不能给我根据条款B一些示例)? – yapkm01 2011-04-18 00:10:11
@ yapmk01:用一些示例更新了答案 – Erik 2011-04-18 00:17:21
我是C++新手。我来自Java背景。 b)你提到的Foo():mem(0){} ..不是Foo()的默认构造函数吗?在Java中,默认构造函数是没有任何参数的构造函数。C++类可以根本没有构造函数(也就是说没有默认的构造函数)?从我的理解。如果你不提供任何构造函数,编译器会为你生成默认的构造函数。如果C++类可以根本没有构造器,那么你如何初始化它? – yapkm01 2011-04-18 02:42:26