类成员变量未初始化问题
在 C++ 中,类的成员变量未初始化问题,取决于对象创建方式,不同的创建方式,直接导致类成员变量的初值不同。
本文通过下例,得出一下结论:
1.在函数体内创建一个对象,类成员变量和普通的局部变量一样,是一个随机值。
2.创建一个全局成员对象,类成员变量和全局变量一样,编译器赋值为 0。
3.在函数体内 new 出一个对象,在不同的编译器下,结果不同
3.1 在 Windows VS 下,仍未随机值,不可靠
3.2 在 Linux 下,初值为 0
当然上述全部是在未初始化时的情况,对于普通的类成员变量初始化既可以直接赋值也可以用构造函数的初始化列表赋值
除此之外还有几个比较基础的问题简单提一下:
1.static 成员变量在类内声明,必须在类外初始化(定义,即分配内存)
2.const 成员变量,必须通过构造函数的初始化列表来初始化
3.引用成员变量同 const 一样,必须奥在初始化列表中初始化
下例为,普通类成员变量未初始化时的情况
#include <stdio.h>
class A
{
private:
// bool flag;
public:
A();
A(int num);
A(int a, int b);
~A();
// const int const_num;
bool flag;
int _num;
int _num1;
// bool flag;
int _num2;
};
A::A()
{
printf("no parameter constructor function\n");
printf("flag = %d\n", flag);
printf("num1 = %d\n", _num1);
printf("\n");
}
A::A(int num):_num(num)
{
printf("one parameter constructor function\n");
printf("flag = %d\n", flag);
printf("num1 = %d\n", _num1);
printf("\n");
}
A::A(int a, int b):_num1(a), _num2(b)
{
printf("two parameters constructor function\n");
printf("flag = %d\n", flag);
printf("num1 = %d\n", _num1);
printf("\n");
}
A::~A()
{
;
}
int main()
{
A* a1 = new A;
printf("a1->flag = %d\n", a1->flag);
printf("a1.num = %d\n", a1->_num);
printf("a1.num1 = %d\n", a1->_num1);
printf("a1.num2 = %d\n", a1->_num2);
printf("\n");
A a2(3);
printf("a2.flag = %d\n", a2.flag);
printf("a2.num = %d\n", a2._num);
printf("a2.num1 = %d\n", a2._num1);
printf("a2.num2 = %d\n", a2._num2);
printf("\n");
A *a22 = new A(3);
printf("a22->flag = %d\n", a22->flag);
printf("a22->num = %d\n", a22->_num);
printf("a22->num1 = %d\n", a22->_num1);
printf("a22->num2 = %d\n", a22->_num2);
printf("\n");
A a3(2,3);
printf("a3.flag = %d\n", a3.flag);
printf("a3.num = %d\n", a3._num);
printf("a3.num1 = %d\n", a3._num1);
printf("a3.num2 = %d\n", a3._num2);
return 0;
}
Linux 结果:
VS 结构: