zoukankan      html  css  js  c++  java
  • 第20课.初始化列表

    1.类成员的初始化

    c++中提供了初始化列表对成员变量进行初始化
    语法规则:使用在构造函数的定之后,函数体之前

    ClassNam::ClassName() : m1(v1), m2(v1, v2), m3(v3)    //初始化列表
    {
        //some other initialiaze operatiion
    }
    

    注意事项:

    a.成员的初始化顺序与成员的声明顺序相同;
    b.成员的初始化顺序与初始化列表中的位置无关;(初始化列表中的先后顺序无法决定,成员的初始化顺序。成员的初始化顺序又成员定义的先后顺序决定。即先定义的先初始化,后定义的后初始化)
    c.初始化列表先于构造函数的函数体执行;

    #include <stdio.h>
    
    class Value
    {
    private:
    	int mi;
    public:
    	Value(int i)
    	{
    		printf("i = %d
    ", i);
    		mi = i;
    	}
    	int getI()
    	{
    		return mi;
    	}
    };
    
    class Test
    {
    private:
    	Value m2;
    	Value m3;
    	Value m1;        //这里定义了3个变量。定义的顺序2,3,1
    public:
    	Test() : m1(1), m2(2), m3(3)        //这里调用Value实现初始化,列表顺序1,2,3
    	{
    		printf("Test::Test()
    ");        //初始化完后才执行构造函数的函数体
    	}
    };
    
    
    int main()
    {
    	Test t;
    	
    	return 0;
    }
    


    最后实现的结果是2,3,1

    注意:
    a.这种类中组合的这关系,类的初始化只能使用初始化列表。
    b.类中的const成员会被分配空间
    c.类中的const成员的本质是只读变量
    d.类中的const成员只能在初始化列表中指定初始值
    (编译器无法直接得到const成员的初始值,因此无法进入符号表成为真正意义上的常量)

    #include <stdio.h>
    
    class Value
    {
    private:
        int mi;
        
    public:
    
        Value(int i)
        {
            printf("i = %d
    ", i);
            mi = i;
        }
    
        int getI()
        {
            return mi;
        }    
    };
    
    class Test
    {
    private:
        const int ci;
        Value m2;
        Value m3;
        Value m1;
        
    public:
        Test() : m1(1), m2(2), m3(3), ci(100)
        {
             printf("Test::Test()
    ");
        }
        
        int getCI()
        {
            return ci;
        }
        
        int setCI(int v)
        {
            int *p = const_cast<int *>(&ci);        //去掉只读属性
            
            *p = v;
        }
    };
    
    int main(void)
    {
        Test t;
        
        printf("t.ci = %d
    ", t.getCI());       //100
    
        t.setCI(10);
        
        printf("t.ci = %d
    ", t.getCI());       //10
    
        return 0;
    }
    

    2.初始化与赋值的不同:

    初始化:对正在创建的对象进行初值设定
    赋值 :对已经存在的对象进行值的设定

  • 相关阅读:
    MFC程序执行过程剖析
    不同位数操作系统的 数据长度
    测试:safenet提供的CheckKey函数 内存泄漏。具体来说是句柄.
    关于更改项目名称
    内存泄漏相关的
    美化MFC 之调整静态文本的颜色 字体。 用于添加公司标题 联系方式 口号等数据
    DAVINCI DM365-DM368开发攻略——开发环境搭建(DVSDK4.02)
    Removing Unnecessary HTTP Headers in IIS and ASP.NET 在ASP.Net和IIS中删除不必要的HTTP响应头
    Implementing Singleton in C#
    WEBAPI VS WCF微软随.NET 4.5发布新REST API框架
  • 原文地址:https://www.cnblogs.com/huangdengtao/p/11826049.html
Copyright © 2011-2022 走看看