我正在阅读Stanley Lipmann撰写的c ++ primer第4版,我在第92页关于价值初始化。
关于价值初始化,我只是不明白。我浏览了一下,我知道还有默认的初始化和零初始化。任何人都可以解释价值初始化吗?
来到这一段..
条款a)
“某些类没有定义默认值 构造函数。我们无法初始化 通过指定这种类型的矢量 只有一个尺寸,我们还必须指定一个 初始值“
我确实理解上述内容,但我发现下面与上述句子相矛盾。
条款b)
“元素类型可能是类类型 没有定义任何构造函数。 在这种情况下,图书馆仍然 创建一个初始化值的对象。它 通过对每个值进行初始化来实现 该对象的成员“
我不明白条款b。
感谢任何帮助
答案 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中找到它。每个元素都会初始化新对象。
也许我没有在这里做出最好的例子,但这是一个开始。