C++值初始化

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?

+0

你能不能给我根据条款B一些示例)? – yapkm01 2011-04-18 00:10:11

+0

@ yapmk01:用一些示例更新了答案 – Erik 2011-04-18 00:17:21

+0

我是C++新手。我来自Java背景。 b)你提到的Foo():mem(0){} ..不是Foo()的默认构造函数吗?在Java中,默认构造函数是没有任何参数的构造函数。C++类可以根本没有构造函数(也就是说没有默认的构造函数)?从我的理解。如果你不提供任何构造函数,编译器会为你生成默认的构造函数。如果C++类可以根本没有构造器,那么你如何初始化它? – yapkm01 2011-04-18 02:42:26

#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中找到它。每个元素获取初始化的新对象。

也许我不是在最好的例子在这里,但它是一个开始。