相关疑难解决方法(0)

C++类成员的默认值是什么

结构成员和c ++中类成员的默认值是什么,以及这些规则如何不同(例如,类/结构/基元/等之间)?是否存在有关默认值的规则不同的情况?

c++ struct class default-value

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

C++中的默认初始化

今天早上我问自己一些事情,我找不到正确"谷歌"的话:

让我们说:

struct Foo
{
  int bar;
};

struct Foo2
{
   int bar;
   Foo2() {}
};

struct Foo3
{
   int bar;
   Foo3() : bar(0) {}
};
Run Code Online (Sandbox Code Playgroud)

现在,如果我默认实例化Foo,Foo2并且Foo3:

Foo foo;
Foo2 foo2;
Foo3 foo3;
Run Code Online (Sandbox Code Playgroud)

在哪种情况下,bar会员是否正确初始化

(Foo3显然很明显地初始化它,并且只在这里显示明确差异Foo2所以问题主要是关于前两个.)

谢谢 !:)

c++ initialization pod

21
推荐指数
2
解决办法
7493
查看次数

我是否必须初始化简单的类成员变量?

快速初学者的问题:

是否必须初始化简单的类成员变量,或者它们是否保证在任何情况下都被赋予默认值?

例:

class Foo {
  int i;
  // is i==0 or do I need the following line for that?
  Foo() : i(0) {}
};
Run Code Online (Sandbox Code Playgroud)

谢谢!

c++ variables initialization class

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

值初始化和非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++ 14,并试图找出在构造时将所有实例变量初始化为零的最简单方法.这是我到目前为止所拥有的:

class MyClass {
public:
    int var;
    float* ptr;
    double array[3];
    MyStruct data;
    unique_ptr<MyStruct> smart_ptr;

    MyClass() = default;
    ~MyClass() = default;
}
Run Code Online (Sandbox Code Playgroud)

将构造函数设置为default等效于:

MyClass() : var{}, ptr{}, array{}, data{}, smart_ptr{} {}
Run Code Online (Sandbox Code Playgroud)

...或者我需要初始化每个变量吗?(我已经在Visual Studio中尝试了两种方式,但无论如何我都会得到零,但我不确定这是不是运气.)

我没有括号实例化课程: MyClass obj;

c++ constructor c++14

16
推荐指数
1
解决办法
1601
查看次数

C++构造:"MyClass c"不好,"MyClass c = MyClass()"很慢,我想要"MyClass c()"

这是一些代码:

class MyClass
{
public:
    int y;
};

int main()
{
    MyClass item1;
    MyClass item2 = MyClass();
}
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我收到以下值:

item1.y == [garbage]
item2.y == 0
Run Code Online (Sandbox Code Playgroud)

这让我感到惊讶.

我希望item1是默认构造的,而item2是从匿名默认构造的MyClass实例复制构造的,导致两者都等于0(因为默认构造函数将成员初始化为默认值).检查装配:

//MyClass item1;
//MyClass item2 = MyClass();
xor         eax,eax  
mov         dword ptr [ebp-128h],eax  
mov         ecx,dword ptr [ebp-128h]  
mov         dword ptr [item2],ecx  
Run Code Online (Sandbox Code Playgroud)

通过在某处临时写入'0'值然后将其复制到item2中来显示正在构造的item2,如预期的那样.但是,item1没有任何程序集.

因此,程序具有堆栈中item1的内存,但它从不构造 item1.

我很欣赏为了速度目的而想要这种行为,但我想要两全其美!我想知道item1.y == 0(它被构造),但我不想浪费时间在default-construct-anonymous-instance-then-copy-construct上,就像item2那样.

令人沮丧的是,我无法通过说明强制默认构造,MyClass item1();因为它被解释为函数原型.

所以...如果我想在item1上使用默认构造函数而不使用复制构造,那我该怎么做呢?

旁注:看起来如果我为MyClass声明一个构造函数,则item1像往常一样构造.所以这种行为只适用于编译器生成的构造函数.

c++ constructor

12
推荐指数
3
解决办法
970
查看次数

是否保证默认构造函数自动将内置类型初始化为0?

在你开始将其标记为重复之前,我已经读过这个 .但它没有回答我的问题.链接的问题谈到了C++ 98和C++ 03,但我的问题是关于C++ 11引入的默认构造函数.

考虑以下程序(请参阅此处的实时演示):

#include <iostream>
struct Test
{
    int s;
    float m;
    Test(int a,float b) : s(a),m(b)
    { }
    Test()=default;
}t;
int main()
{
    std::cout<<t.s<<'\n';
    std::cout<<t.m<<'\n';
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,编译器提供的默认构造函数总是初始化内置类型,在C++ 11和C++ 14中默认为0,当它们是class&struct成员时.这种行为是否由C++ 11标准保证?

c++ initialization default-constructor language-lawyer c++11

11
推荐指数
3
解决办法
1058
查看次数

C++默认构造函数不初始化指向nullptr的指针?

我想知道A*我的课程中是否有成员,nullptr如果我有这种形式的班级构造函数,我们不应该自动设置:

class MyCLass
{
    A* m_pointer;

public:
    MyCLass()
    {
    }
};
Run Code Online (Sandbox Code Playgroud)

如果我在C++ 11中做MyCLass* o = new MyCLass;或不做 MyCLass* o = new MyCLass();,这有关系吗?

c++

7
推荐指数
1
解决办法
8500
查看次数

包含原始类型的struct容器,零初始化?

#include <vector>
struct S { int x; };
std::vector<S> v;
int main() { v.resize(1000); return v[42].x; }
Run Code Online (Sandbox Code Playgroud)

上述程序是否保证在C++ 14中返回0?为什么?

c++ c++14

7
推荐指数
1
解决办法
183
查看次数

什么时候C++隐式类型初始化为0?

在与同事讨论之后我对此产生了一些怀疑......

正如标题所要求的那样,何时可以假设内置类型将被初始化为0而不是未知值?

规则是否因c ++标准而异?

c++ initialization built-in-types

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