读书人

编译器提供的默许构造函数

发布时间: 2013-08-10 21:14:06 作者: rapoo

编译器提供的默认构造函数
到底是什么都不干,还是会给成员赋初值?
[解决办法]

引用:
到底是什么都不干,还是会给成员赋初值?


2楼说的很全面了。
如果抛开虚表、继承这些因素,单考虑成员变量的情况下。

成员变量是对象的会调用对象的默认构造函数,即会初始化为默认值
成员变量是普通类型的则不会初始化。
所以安全的做法是在默认构造函数以及其他构造函数中把成员变量手动初始化。

我在vs2010下面测试的情况是这样的。

#include <iostream>
#include <string>
#include <new>
using namespace std;

class A
{
public:
int data;
string str;
};

int main()
{
char buff[100] = "abcdefghijklomnopresgoiuoisufjlsglasdjflsdjflsajfhlcvhskdfhskdfhsfhssdf";
cout << buff << endl; //内存中是垃圾值
A* a = new(buff) A; //用placement new来申请内存并且构造对象
cout << a->data << endl; //简单起见,用了public变量
cout << a->str << endl;
a->~A(); //手动调用析构函数,不能用delete
return 0;
}

//结果
//int 打印的值不是0
//string 什么都没打印。

[解决办法]
引用:
Quote: 引用:

Quote: 引用:

到底是什么都不干,还是会给成员赋初值?

看情况,会初始化虚表指针,会调用其成员的缺省构造函数(如果需要的话),会调用基类的缺省构造函数(如果需要的话)


基本类型成员呢?

一般不会初始化基本类型成员。

读书人网 >C++

热点推荐