以下短语在C++中的含义是什么:
零初始化,
默认初始化,和
值初始化
C++开发人员应该了解他们什么?
正如初始化所述,需要进行左值到右值的转换?是int x = x;UB吗?C++标准在3.3.2 声明部分中有一个令人惊讶的例子,其中a int用它自己的不确定值初始化:
Run Code Online (Sandbox Code Playgroud)int x = 12; { int x = x; }这里第二个x用它自己的(不确定的)值初始化.- 结束例子 ]
Johannes对此问题的回答表明是未定义的行为,因为它需要左值到右值的转换.
在最新的C++ 14草案标准中N3936,可以在此处找到此示例已更改为:
Run Code Online (Sandbox Code Playgroud)unsigned char x = 12; { unsigned char x = x; }这里第二个x用它自己的(不确定的)值初始化.- 结束例子 ]
C++ 14中有关于不确定值和未定义行为的变化,这些变化在示例中引发了这种变化吗?
我正在阅读JP Mueller和J. Cogswell撰写的"C++ All-in-One for Dummies"并偶然发现:
#include <iostream>
using namespace std;
int main()
{
int ExpensiveComputer;
int CheapComputer;
int *ptrToComp;
...
Run Code Online (Sandbox Code Playgroud)
这段代码首先初始化所有涉及的东西 - 两个整数和一个指向整数的指针.
只是为了确认,这是一个错误,应该读作'......通过声明',对吧?对我来说,这样的基本错误仍然会出现在书中,这一点很奇怪.
我的问题与此以及其他几个相似的问题有些重叠.那些有一些很好的答案,但我已经读过了,我仍然感到困惑,所以请不要认为这个问题是重复的.
所以,我有以下代码:
class A {
public: int _a;
}
void main()
{
A inst1;
A* inst2 = new A;
A* inst3 = new A();
}
Run Code Online (Sandbox Code Playgroud)
_a未初始化in inst1和in inst2初始化为0in inst3.调用哪个初始化,以及代码为何如此工作?请考虑我的帐户我手头没有C++ 03标准,但我有最后的C++ 11草案(我按'03标准编程),所以'03标准的引用或对'11的引用非常欢迎.
PS这项研究背后的原始任务是正确地初始化任意模板类型的成员T.
有人可以指出标准中的哪个子句支持在Coliru中获得的以下行为,对于该片段:
#include <iostream>
class A
{
int i;
float x;
public:
A() : i(10) {}
A(int i) : i(i) {}
int GetI() { return i; }
float GetF() { return x; }
};
int main()
{
A a;
A b(1);
A x{};
A y{1};
std::cout << a.GetI() << '\n';
std::cout << a.GetF() << '\n';
std::cout << b.GetI() << '\n';
std::cout << b.GetF() << '\n';
std::cout << x.GetI() << '\n';
std::cout << x.GetF() << '\n';
std::cout << y.GetI() << '\n';
std::cout …Run Code Online (Sandbox Code Playgroud) 我想知道 static 结构中变量的默认值static std::unordered_map<std::string, struct>。
这是我的示例代码:
#include <iostream>
#include <string>
#include <unordered_map>
int main()
{
enum MyStateType
{
MY_STATE_NEW,
MY_STATE_RUN,
MY_STATE_FREE
};
struct Foo
{
int num;
MyStateType state;
};
static std::unordered_map<std::string, Foo> map;
std::cout << map["Apple"].num << '\n';
std::cout << map["Apple"].state << '\n';
}
Run Code Online (Sandbox Code Playgroud)
输出结果:
0
0
Program ended with exit code: 0
Run Code Online (Sandbox Code Playgroud)
认为内部Foo的变量总是0在开始时被初始化是否安全?
对两个类中的一个对象执行 var_dump 会得到相同的结果
Class Node{
public $parent = null;
public $right = null;
public $left = null;
function __construct($data){
$this->data = $data;
}
}
Class Node{
public $parent;
public $right;
public $left;
function __construct($data){
$this->data = $data;
}
}
Run Code Online (Sandbox Code Playgroud)
例如
$a = new Node(2);
var_dump($a);
Run Code Online (Sandbox Code Playgroud)
对于上述任一类返回以下内容
object(Node)#1 (4) {
["parent"]=>
NULL
["right"]=>
NULL
["left"]=>
NULL
["data"]=>
int(2)
}
Run Code Online (Sandbox Code Playgroud)
对于变量来说,情况似乎并非如此。
$b;
var_dump($b);
Run Code Online (Sandbox Code Playgroud)
如果您打算将该属性的值设置为 ,null是否需要明确编写该值,因为 php 似乎会自动为您执行此操作?
另外 - 根据这个答案/sf/answers/422316331/,如果您尝试获取未初始化变量的值,C++ 会给出未定义的行为。如果类中的属性未初始化为值null,C++ 是否会像 php 那样自动设置该属性的值?
可能重复:
未初始化的常量
我知道需要初始化 const 对象。
所以对于下面的代码,
class sample
{};
int main()
{
const sample obj;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译器会抱怨,因为 const 对象obj没有初始化。
但是当我使用默认构造函数修改代码(如下所示)时,编译器不会抛出任何错误。
class sample
{
public:
sample() { }
};
int main()
{
const sample obj;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
新添加的默认ctor做了哪些让编译器满意的事情?
在使用之前,应该正确定义和初始化每个变量(为其赋值).但是在某些情况下,c ++会将变量设置为默认值零.像下面的情况.
class A{
...
static int val;
...};
//int val = 10; //This is the usual definition.
int val;//Definition without assigning a value.
...
A a; //a class A object
std::cout<<a.val;
Run Code Online (Sandbox Code Playgroud)
结果将为零.显然,编译器做了一些事情来将变量a.val初始化为零.我很好奇他们什么时候会这样做?
我有这个功能:
void fraction::init()
{
cout<<"enter the values for the numerator and denominator\n";
cin>>num;
cin>>denom;
}
Run Code Online (Sandbox Code Playgroud)
我希望这两个数字用于操纵它们的另一个函数.我该如何将它们带到其他功能?注意:两个功能属于同一类.
在图书馆,我遇到了一个奇怪的结构,作为枚举:
typedef struct SetControl
{
const static uint16_t RC_MODE_ERROR;
const static uint16_t RELEASE_CONTROL_SUCCESS;
const static uint16_t OBTAIN_CONTROL_SUCCESS;
const static uint16_t OBTAIN_CONTROL_IN_PROGRESS;
const static uint16_t RELEASE_CONTROL_IN_PROGRESS;
const static uint16_t RC_NEED_MODE_F;
const static uint16_t RC_NEED_MODE_P;
const static uint16_t IOC_OBTAIN_CONTROL_ERROR;
} SetControl;
Run Code Online (Sandbox Code Playgroud)
成员不会在任何地方初始化,但即使RC_MODE_ERROR等于0,RELEASE_CONTROL_SUCCESS等于1,依此类推.我知道因为我用printf记录了它.到目前为止我还没有看到类似的东西.为什么它甚至可以工作(我认为值默认情况下会被随机数据初始化,或者0)?这个超标准有增值enum吗?我将非常感谢所有的帮助.
我已声明这些变量,然后使用此代码在屏幕上打印.
int totalAge = 0;
float totalGPA = 0.0;
cout << "totalAge "<<totalAge << endl << "TotalGPA " << totalGPA;
Run Code Online (Sandbox Code Playgroud)
输出就是这个.
totalAge 1975299651
TotalGPA -1.51482e+037
Run Code Online (Sandbox Code Playgroud)
那么,现在我想知道为什么这两个变量被分配了这些值,并且如果编译器已经为它们分配了值,那么为什么它没有分配然后默认值为零?
c++ ×11
c++11 ×2
declaration ×2
c ×1
c++-faq ×1
c++14 ×1
constants ×1
constructor ×1
dictionary ×1
enums ×1
php ×1
static ×1
struct ×1
terminology ×1