【问题标题】:c++ value initializationc++ 值初始化
【发布时间】:2011-04-18 08:32:50
【问题描述】:

我正在阅读 Stanley Lipmann 的 C++ 入门第 4 版,我在第 92 页上关于值初始化。

我只是不明白什么时候进行值初始化。我浏览了一下,我知道还有默认初始化和零初始化。谁能解释一下值初始化?

来到这一段..

a) 条

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

我确实明白上面的意思,但我发现下面的句子与上面的句子相矛盾。

条款 b)

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

我不明白第 b 句。

感谢任何帮助

【问题讨论】:

    标签: c++ initialization


    【解决方案1】:

    a) 如果类定义了 other 构造函数,则这是真的 - 从而抑制了默认构造函数的生成。

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

    这个类不能被值初始化。

    b) 如果类有 no 定义的构造函数,值初始化将简单地对所有子对象(基类和非静态成员)进行值初始化

    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?

    【讨论】:

    • 你能给我举一些 b) 条的例子吗?
    • @yapmk01:用一些示例更新了答案
    • 我是 C++ 新手。我来自Java背景。您提到的子句 b) Foo() : mem(0) {} .. Foo() 不是默认构造函数吗?在 Java 中,默认构造函数是没有任何参数的构造函数。 C++ 类可以完全没有构造函数(也意味着没有默认构造函数)吗?据我了解..如果您不提供任何构造函数,编译器将为您生成默认构造函数。如果 C++ 类根本没有构造函数,你如何初始化它?
    • @yapkm01: 如果有no构造函数,则生成隐式无参数构造函数
    【解决方案2】:
    #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 中找到它。每个元素都会初始化新对象。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-08
      • 2021-04-11
      • 1970-01-01
      • 2017-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多