以下短语在C ++中意味着什么:零
以下短语在C ++中的含义如下:
零初始化,
默认初始化和
值初始化
C ++开发人员应该知道些什么?
有一点需要认识的是,'值初始化'是C ++ 2003标准中的新增功能 - 它并不存在于1998年的原始标准中(我认为这可能是唯一不同之处,不仅仅是澄清)。 有关直接来自标准的定义,请参阅Kirill V. Lyadvinsky的答案。
有关这些初始化类型的不同行为以及何时启动(以及它们与C ++ 98到C ++ 03不同)的详细信息,请参阅以前有关operator new
的行为的回答:
答案的要点是:
有时新运算符返回的内存将被初始化,有时它不会取决于新建的类型是POD,还是包含POD成员的类,并且正在使用编译器生成的默认构造函数。
至少可以这么说,这是相当复杂的,当不同的方法开始的时候是微妙的。
肯定要注意的一件事是,即使在VS 2008(VC 9或cl.exe版本15.x)中,MSVC也遵循C ++ 98规则。
以下片段显示MSVC和Digital Mars遵循C ++ 98规则,而GCC 3.4.5和Comeau遵循C ++ 03规则:
#include <stdio.h>
#include <string.h>
#include <new>
struct A { int m; }; // POD
struct B { ~B(); int m; }; // non-POD, compiler generated default ctor
struct C { C() : m() {}; ~C(); int m; }; // non-POD, default-initialising m
int main()
{
char buf[sizeof(B)];
memset( buf, 0x5a, sizeof( buf));
// use placement new on the memset'ed buffer to make sure
// if we see a zero result it's due to an explicit
// value initialization
B* pB = new(buf) B(); //C++98 rules - pB->m is uninitialized
//C++03 rules - pB->m is set to 0
printf( "m is %dn", pB->m);
return 0;
}
C ++ 03标准8.5 / 5:
要初始化 T类型的对象意味着:
- 如果T是标量类型(3.9),则将该对象设置为转换为T的值0(零);
- 如果T是一个非联合类类型,则每个非静态数据成员和每个基类子对象都是零初始化的;
- 如果T是联合类型,则该对象的第一个命名数据成员将被初始化为零;
- 如果T是一个数组类型,则每个元素都是零初始化的;
- 如果T是参考类型,则不执行初始化。
要默认初始化类型为T的对象意味着:
- 如果T是非POD类类型(第9章),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化不合格);
- 如果T是数组类型,则每个元素都默认初始化;
否则,该对象将被初始化为零。
为值初始化类型T的对象意味着:
- 如果T是一个具有用户声明的构造函数(12.1)的类类型(第9节),则调用T的默认构造函数(并且如果T没有可访问的默认构造函数,则初始化不合格);
- 如果T是没有用户声明构造函数的非联合类类型,则T的每个非静态数据成员和基类组件都进行了值初始化;
- 如果T是一个数组类型,则每个元素都进行了值初始化;
否则,该对象将被初始化为零
调用引用类型实体的默认初始化或值初始化的程序是格式不正确的。 如果T是cv限定类型,则c的非限定版本T用于零初始化,缺省初始化和值初始化的这些定义。
链接地址: http://www.djcxy.com/p/40661.html