类成员变量初始化

类成员变量未初始化问题

在 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 结构:

在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值