• 关于类中的引用、常量、静态常量的初始化


    不过 下面所说的在新的 c++11中,已经有所改变。

    比如程序中:

    static const double csd2 = 99.8; // error: 只有静态常量整型数据成员才可以在类中初始化
    已经可有在类中初始化了

    关于这点,可以参考 这个博客 :http://blog.csdn.net/fjb2080/article/details/7527468

    如下内容为摘抄自博客,由于几经整理,已经没有记录博客地址了,特此说明:


    这一部分待学习:C++11 FAQ中文版:类成员的内部初始化 http://blog.csdn.net/fjb2080/article/details/7527468



    有些成员变量的数据类型比较特别,它们的初始化方式也和普通数据类型的成员变量有所不同。这些特殊的类型的成员变量包括:

    1.引用

    2.常量

    3.静态

    4.静态常量(整型)

    5.静态常量(非整型)

    常量和引用,必须通过参数列表进行初始化。
    静态成员变量的初始化也颇有点特别,是在类外初始化且不能再带有static关键字,其本质:

    静态成员属于类作用域,但不属于类对象,和普通的static变量一样,程序一运行就分配内存并初始化,生命周期和程序一致。
    所以,在类的构造函数里初始化static变量显然是不合理的。
    静态成员其实和全局变量地位是一样的,只不过编译器把它的使用限制在类作用域内(不是类对象,它不属于类对象成员),要在类的定义外(不是类作用域外)初始化。

    参考下面的代码以及其中注释:

    ```

    #include <iostream>
    #include <functional>

    using namespace std;
    #include <iostream>
    using namespace std;

    class BClass
    {
    public:
    BClass() : i(1), ci(2), ri(i){} // 对于常量型成员变量和引用型成员变量,必须通过参数化列表的方式进行初始化
    //普通成员变量也可以放在函数体里,但是本质其实已不是初始化,而是一种普通的运算操作-->赋值运算,效率也低
    void printB(){
    std:cout<<this->i<<"*i*"
    <<this->ci<<"*ci*"
    <<this->ri<<"*ri*"
    <<this->si<<"*si*"
    <<this->csd<<"**"
    <<this->csd2<<"**"
    <<this->csi<<"*csi*"
    <<this->csi2<<"*csi2*";
    }
    private:
    int i; // 普通成员变量
    const int ci; // 常量成员变量
    int &ri; // 引用成员变量
    static int si; // 静态成员变量
    //static int si2 = 100; // error: 只有静态常量成员变量,才可以这样初始化
    static const int csi; // 静态常量成员变量
    static const int csi2 = 100; // 静态常量成员变量的初始化(Integral type) (1)
    static const double csd; // 静态常量成员变量(non-Integral type)
    static const double csd2 = 99.8; // error: 只有静态常量整型数据成员才可以在类中初始化
    };

    //注意下面三行:不能再带有static
    int BClass::si = 0; // 静态成员变量的初始化(Integral type)
    const int BClass::csi = 1; // 静态常量成员变量的初始化(Integral type)
    const double BClass::csd = 99.9; // 静态常量成员变量的初始化(non-Integral type)

    // 在初始化(1)中的csi2时,根据著名大师Stanley B.Lippman的说法下面这行是必须的。
    // 但在VC2003中如果有下面一行将会产生错误,而在VC2005中,下面这行则可有可无,这个和编译器有关。
    //const int BClass::csi2;

    int main()
    {
    BClass b;
    b.printB();
    std:cout<<"ok is";

    return 0;
    }
    ```

  • 相关阅读:
    数据库使用--MySQL: InnoDB 还是 MyISAM?
    数据库使用3--索引系列
    数据库使用1--注意事项
    数据库使用2--索引系列
    学习FFmpeg API
    几种常见 容器 比较和分析 hashmap, map, vector, list ...hash table
    tiny中文乱码问题,不过仅适用于windows,所以xml不可以出现中文
    【NumPy】numpy数组类型
    【1.1】Scrapy抓取4步走、新建项目
    django+markdown
  • 原文地址:https://www.cnblogs.com/jiudianren/p/5668590.html
Copyright © 2020-2023  润新知