c ++值初始化

时间:2011-04-17 23:55:30

标签: c++ initialization

我正在阅读Stanley Lipmann撰写的c ++ primer第4版,我在第92页关于价值初始化。

关于价值初始化,我只是不明白。我浏览了一下,我知道还有默认的初始化和零初始化。任何人都可以解释价值初始化吗?

来到这一段..

条款a)

  

“某些类没有定义默认值   构造函数。我们无法初始化   通过指定这种类型的矢量   只有一个尺寸,我们还必须指定一个   初始值“

我确实理解上述内容,但我发现下面与上述句子相矛盾。

条款b)

  

“元素类型可能是类类型   没有定义任何构造函数。   在这种情况下,图书馆仍然   创建一个初始化值的对象。它   通过对每个值进行初始化来实现   该对象的成员“

我不明白条款b。

感谢任何帮助

2 个答案:

答案 0 :(得分:8)

a)如果类定义其他构造函数 - 这样就可以抑制默认构造函数的生成。

struct Foo {
  Foo(int n) : mem(n) {}
  int mem;
};

此类无法进行值初始化。

b)如果类定义了 no 构造函数,则value-initialization将简单地初始化所有子对象(基类和非静态成员)

struct Foo {
  Foo() : mem(0) {}
  int mem;
};

struct Bar {
  Foo f;
};

Bar的值初始化只是意味着f成员将进行值初始化。

参见例如What do the following phrases mean in C++: zero-, default- and value-initialization?

答案 1 :(得分:0)

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

也许我没有在这里做出最好的例子,但这是一个开始。