相关疑难解决方法(0)

以下短语在C++中的含义是什么:零,默认和值初始化?

以下短语在C++中的含义是什么:

  • 零初始化,

  • 默认初始化,和

  • 值初始化

C++开发人员应该了解他们什么?

c++ initialization c++-faq

183
推荐指数
2
解决办法
3万
查看次数

内置类型有默认构造函数吗?

看完文章我做了一个点int ()产生0,因为临时int的值进行初始化而不是因为int()呼吁默认构造函数int.(根据我的理解,这篇文章有缺陷.)

我还说原始(内置)类型没有构造函数.原作者让我查看章节$ 10.4.2(TC++ PL)

内置类型也有默认构造函数(6.2.8美元)

但我仍然认为语句"C++允许甚至内置类型(原始类型)具有默认构造函数." 是有缺陷的(根据C++ 03).

我认为TC++ PL中的Bjarne将"构造函数如符号ie ()"与实际的构造函数调用混淆了.当Bjarne写这本书的时候没有引入价值初始化,对吧?那么根据C++ 98和C++ 03,TC++ PL中的文本是不正确的?

你们有什么感想?

编辑

我亲自(通过邮件)问Bjarne关于TC++ PL中有缺陷的文本,这是他的答复

我认为你混淆了"实际的构造函数调用"与概念上有一个构造函数. 内置类型被认为具有构造函数(标准用于描述其行为的任何单词).

c++ constructor value-initialization

43
推荐指数
3
解决办法
2万
查看次数

在C++ 11中更改了默认初始化的含义?

C++ 2003 8.5/5说:

缺省初始化类型的对象T表示:

- 如果T是非POD类类型(第9节),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的);

- 如果T是数组类型,则每个元素都是默认初始化的;

- 否则,对象被零初始化.

[重点补充.]

C++ 2011标准将最后一项更改为

- 否则,不执行初始化.

对于某些程序来说,这似乎是一个突破性的变化.这是故意的吗?

编辑

以下是一些激励这个问题的代码:

class Foo {
  public:
    Foo() : m_values() {}

    int m_values[3];
};
Run Code Online (Sandbox Code Playgroud)

在C++ 11之前,我认为m_values在默认构造函数中明确提到将默认初始化该数组.由于数组的元素是标量,我预计这意味着值都被设置为0.

在C++ 11中,似乎不再保证会发生这种情况.但也许正如Mooing Duck在评论中指出的那样,也许这不再是默认初始化的情况,而是一些保留预期行为的其他形式.引文欢迎.

c++ initialization c++-faq language-lawyer c++11

34
推荐指数
1
解决办法
3780
查看次数

值初始化和非POD类型

一个小时前我在这里发了一个答案,根据我的说法是正确的.然而我的回答却被Martin B贬低了.他说

你很幸运,并且因为我所处的内存恰好是零初始化而得到了零.标准不保证这一点.

然而读迈克尔·伯尔的回答后,这里并尝试下面的示例代码

1)

#include <cassert>

struct B { ~B(); int m; };

int main()
{
   B * b = new B();
   assert(b->m == 0);
}
Run Code Online (Sandbox Code Playgroud)

我在MSVC++ 2010上遇到调试错误.

我有一个类似的错误,当我尝试下面的代码[我的答案在这里 ]在MSVC++ 2010

2)

#include <cassert>
struct Struct {
    std::string String;
    int Int;
    bool k;
    // add add add
};

struct InStruct : Struct
{
   InStruct() : Struct() {}
};

int main()
{
   InStruct i;
   assert(i.k == 0);
}
Run Code Online (Sandbox Code Playgroud)

既没有(1)也没有(2)给gcc/Clang这样的错误让我想到MSVC++ …

c++ initialization visual-c++ value-initialization

17
推荐指数
2
解决办法
4884
查看次数

零初始化,静态初始化和值初始化如何不同?

本·福格特曾指出这里是:

零初始化是静态初始化的步骤之一.但你是对的,你不能盲目地替换后者(标签),因为零初始化也是为了初始化值.但是,在C++的上下文中不需要(标记名为)零初始化,因为标记已经存在于静态初始化和值初始化中,并且这些标记更相关.

我认为有一种情况是"零初始化"而不是"静态初始化""价值初始化"或"零初始化"永远不会在野外发生,我应该使用更具体的术语如:"静态初始化"或"价值初始化"?

公平地说,我对这些主题的大部分经验都来自于研究这个问题的答案,所以我确定Ben Voigt是对的,我只是想让别人明白为什么.

c++ initialization static-initialization value-initialization

6
推荐指数
1
解决办法
158
查看次数

默认初始化与零初始化

我无法理解 gcc 4.8.1 或 Visual Studio 2015 在默认初始化与值初始化方面的行为。

我试图自己理解这些之间的差异并可能遇到编译器错误并没有帮助?

我的问题是:有人可以解释这种行为吗?最好告诉我应该发生什么。

我有两个班级:

class Foo{
    int _bar;
public:
    void printBar(){ cout << _bar << endl; }
};

class bar{
    int ent;
public:
    int getEnt(){return ent;}
};
Run Code Online (Sandbox Code Playgroud)

我正在使用以下代码进行测试:

int main()
{
    Foo foo;

    foo.printBar();
    Foo().printBar();

    bar b;

    cout << b.getEnt() << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在 gcc 和 Visual Studio 上,我得到:

134514795
0
0

现在,如果我将测试代码更改为:

int main()
{
    Foo foo;

    foo.printBar();

    bar b;

    cout << b.getEnt() << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

gcc …

c++ default initialization zero

3
推荐指数
2
解决办法
1975
查看次数