C++类初始化顺序

C++类对象的构造顺序是这样的:分配内存->调用构造函数时,隐式/显式的初始化各数据成员->在构造函数内部初始化数据成员。

C++类初始化需注意以下几点

    1、类里面的任何成员变量在定义时是不能初始化的。
    2、一般的数据成员可以在构造函数中初始化。
    3、const数据成员必须在构造函数的初始化列表中初始化。
    4、static可直接初始化,也可在类的定义外面初始化。  
    5、数组成员是不能在初始化列表里初始化的。
    6、不能给数组指定显式的初始化。

    从上面的3和5可以看出:C++里面是不能定义常量数组的!但可定义静态常量数组。

C++类初始化示例

-----------------Test.h----------------------------
#pragma once

class Test
{
private :
    int   var1;
    //int var11= 4; 错误的初始化方法-2、成员变量在定义时不能初始化
    const    int var2 ;
    //const  int var22 =22222; 错误的初始化方法-3、const数据成员必须在构造函数的初始化列表中初始化
    static   int  var3;
    //static int var3333=33333; 错误-只有静态常量成员才能直接赋值来初始化
    static const int var4=4444; //正确,静态常量成员可以直接初始化
    static const int var44;
public:
    Test(void);
    ~Test(void);
};
--------------------Test.cpp-----------------------------------

#include ".\test.h"

int Test::var3 = 3333333; //正确-4、static可在类的定义外面初始化

//int Test::var1 = 11111; 错误-只有静态成员才能在类的外面初始化
Test::Test(void) :var1(11111),var2(22222)   //正确;但var3(33333) 不能在这里初始化
{
    var1 =11111;     //正确, 普通变量可以在这里初始化
    //var2 = 222222; 错误-3、const数据成员必须在构造函数的初始化列表中初始化
          
    var3 =44444;   //这个是赋值,值会影响到其它实例
}

Test::~Test(void)
{
}

类的初始化列表中成员初始化顺序

    C++初始化类成员时,是按照声明的顺序初始化的,而不是按照出现在初始化列表中的顺序。如

class CMyClass {
    CMyClass(int x, int y);
    int m_x;
    int m_y;
};

CMyClass::CMyClass(int x, int y) : m_y(y), m_x(m_y)
{
}

    你可能以为上面的代码将会首先做m_y=y,然后做m_x=m_y,最后它们有相同的值。但是编译器先初始化m_x,然后是m_y,因为它们是按这样的顺序声明的。结果是m_x将有一个不可预测的值。

    有两种方法避免它:1)总是按照你希望它们被初始化的顺序声明成员;2)如果你决定使用初始化列表,总是按照它们声明的顺序罗列这些成员。这将有助于消除混淆。

关于const

    如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值