Linux后台服务器编程。
分类: C/C++
2014-10-23 21:45:25
在C++中,当我们没有为一个类定义构造函数时,编译器会自动生成一个默认的构造函数,这个时候可能生成的类对象中的数据成员跟我们所期待的值会不一样,接下来讨论一下当使用默认构造函数生成对象时类中各数据成员的初始化情况。这主要取决于以下三点:
(1) 数据成员本身的类型;
(2) 生成的类对象的作用域范围(局部对象和全局对象);
(3) 特殊的static数据成员。
一、数据成员本身的类型
合成的默认构造函数使用与变量初始化相同的规则来初始化成员。具有类类型的成员通过运行各自的默认构造函数来进行初始化;内置和复合类型的成员,如整形、数组和指针,则不自动进行初始化。
#include "stdafx.h"
#include
using namespacestd;
class Test
{
public:
int a;
bool b;
char c;
double d;
strings;
};
Test t2;
int _tmain(intargc,_TCHAR*argv[])
{
Testt;
return0;
}
从上面可以看到,对于int、bool、char、double这些内置数据类型,默认构造函数并不会自动进行初始化,其中存放的都是一些随机值;对于string这种类类型则会调用string类的默认构造函数进行初始化,即将s初始化空串。
二、生成的类对象的作用域范围(局部对象和全局对象)
在前面的代码中,定义了Test类的一个全局对象t2,通过上面可以发现,对于定义在全局作用域中的对象,其内置类型也会进行相应的初始化。
三、特殊的static数据成员
static数据成员必须在类定义体的外部定义(正好一次)。不像普通数据成员,static成员不是通过类构造函数进行初始化,而是应该在定义时进行初始化,如代码的的e变量;对于特殊的static const成员则可以在类的定义体中进行初始化,但仍必须在类的定义体之外进行定义,如代码中的f变量。
#include "stdafx.h"
#include
using namespacestd;
class Test
{
public:
static int e;
static const int f = 0;
};
int Test::e = 0;
const intTest::f;
int _tmain(intargc,_TCHAR*argv[])
{
Testt;
return0;
}