邀朋友种豆,一起分享吧
喜欢购买正品行货?那就去品牌街

C++类的初始化小结

来自:种豆 时间:2017-12-29 阅读:715次 原文链接

    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就是修饰指针本身,即指针本身是常量。

 

 
关于种豆 ┊ 联系我们 ┊ 免责声明 ┊ 发帖须知 ┊ 请提意见 ┊ 站点地图
本站为个人爱好兴趣分享网站,不代表本人观点,如有侵权请联系QQ3033380280进行处理
sowsoy.com 版权所有 Copyright©2010-2021 备案号:蜀ICP备2020025376号-3
Email:sowsoy#hotmail.com