C++类特殊成员变量(引用、静态、常成员变量)的初始化操作

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

a.引用

b.常量

c.静态

d.静态常量(整型)

e.静态常量(非整型)

常量和引用,必须通过参数列表进行初始化。

静态成员变量的初始化也颇有点特别,是在类外初始化且不能再带有static关键字,其本质见文末。

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

    #include <iostream>
    using namespace std;  

    class BClass
    {
    public:
     BClass() : i(1), ci(2), ri(i){} // 对于常量型成员变量和引用型成员变量,必须通过参数化列表的方式进行初始化
                                                    //普通成员变量也可以放在函数体里,但是本质其实已不是初始化,而是一种普通的运算操作-->赋值运算,效率也低
    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.9;      // 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;
         return 0;
    }  

静态成员属于类作用域,但不属于类对象,和普通的static变量一样,程序一运行就分配内存并初始化,生命周期和程序一致。

所以,在类的构造函数里初始化static变量显然是不合理的。

静态成员其实和全局变量地位是一样的,只不过编译器把它的使用限制在类作用域内(不是类对象,它不属于类对象成员),要在类的定义外(不是类作用域外)初始化。

下面再说说成员变量是引用的情况:

因为引用是别名的意思,所以定义应用肯定是外部有定义,然后在构造函数初始化列表中被初始化的

    #include <iostream>
    using namespace std;
    class A
    {
    public:
        A(int i=3):m_i(i){}
        void print()
        {
            cout<<"m_i="<<m_i<<endl;
        }
    private:
        int m_i;
    };
    class B
    {
    public:
        B(){}
        B(A& a):m_a(a){}
        void display()
        {
            m_a.print();
        }
    private:
        A& m_a;
    };
    int main(int argc,char** argv)
    {
        A a(5);
        B b(a);
        b.display();
        return 0;
    }

这样B中就可以有a这个对象了,

[注意]:引用类型成员变量的初始化:

1,不能直接在构造函数里初始化,必须用到初始化列表,且形参也必须是引用类型。

2,凡是有引用类型的成员变量的类,不能有缺省构造函数。原因是引用类型的成员变量必须在类构造时进行初始化。

3,如果两个类要对第三个类的数据进行共享处理,可以考虑把第三个类作为这两个类的引用类型的成员变量。

时间: 2024-10-13 15:10:08

C++类特殊成员变量(引用、静态、常成员变量)的初始化操作的相关文章

Cocos2d-x 3.1.1 学习日志3--C++ 初始化类的常量数据成员、静态数据成员、常量静态数据成员

有关const成员.static成员.const static成员的初始化: 1.const成员:只能在构造函数后的初始化列表中初始化 2.static成员:初始化在类外,且不加static修饰 3.const static成员:类只有唯一一份拷贝,且数值不能改变.因此,可以在类中声明处初始化,也可以像static在类外初始化 #include <iostream> using std::cout; using std::endl; class base { public: base(int

c++初始化常量数据成员、静态数据成员。常量静态数据成员

有关const成员.static成员.const static成员的初始化: 1.const成员:只能在构造函数后的初始化列表中初始化 2.static成员:初始化在类外,且不加static修饰 3.const static成员:类只有唯一一份拷贝,且数值不能改变.因此,可以在类中声明处初始化,也可以像static在类外初始化 示例:   #include <iostream> using std::cout; using std::endl; class base { public: bas

转:C语言中的static变量和C++静态数据成员(static member)

转自:C语言中的static变量和C++静态数据成员(static member) C语言中static的变量:1).static局部变量        a.静态局部变量在函数内定义,生存期为整个程序运行期间,但作用域与自动变量相同,只能在定义该变量的函数内使用.退出该函数后, 尽管该变量还继续存在,但不能使用它.        b.对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值.而对自动变量不赋初值,则其值是不定的.2).static全局变量        全局变量本身就是静

C++点滴----关于类常成员函数

关于C++中,类的常成员函数 声明样式为:   返回类型 <类标识符::>函数名称(参数表) const 一些说明: 1.const是函数声明的一部分,在函数的实现部分也需要加上const 2.const关键字可以重载函数名相同但是未加const关键字的函数 3.常成员函数不能用来更新类的成员变量,也不能调用类中未用const修饰的成员函数,只能调用常成员函数.即常成员函数不能更改类中的成员状态,这与const语义相符. 例一:说明const可以重载函数,并且实现部分也需要加const #in

类之静态成员以及常对象、常成员

一.静态成员:static修饰,每个类只有一份拷贝,为所有该类的对象所共用. 1.静态数据成员: 类内声明.类外初始化.和全局变量一样,在数据段里分配内存. eg: class A{ static int co; }; int A::co=0; 2.静态成员函数: 1).静态成员函数专门用来存取类的静态成员,不可访问非静态成员,没有this指针.由static在类内声明,可以在类外定义,此时不需要static作为前缀. eg: class A{ static int co; static int

【转】C++ const成员变量和成员函数(常成员函数)

转:http://c.biancheng.net/view/2230.html 在类中,如果你不希望某些数据被修改,可以使用const关键字加以限定.const 可以用来修饰成员变量和成员函数. const成员变量 const 成员变量的用法和普通 const 变量的用法相似,只需要在声明时加上 const 关键字.初始化 const 成员变量只有一种方法,就是通过构造函数的初始化列表,这点在前面已经讲到了,请猛击<C++初始化列表>回顾. const成员函数(常成员函数) const 成员函

C++静态成员函数和静态数据成员

当将类的某个数据成员声明为static时,该静态数据成员只能被定义一次,而且要被同类的所有对象共享.各个对象都拥有类中每一个普通数据成员的副本,但静态数据成员只有一个实例存在,与定义了多少类对象无关.静态方法就是与该类相关的,是类的一种行为,而不是与该类的实例对象相关. 静态数据成员的用途之一是统计有多少个对象实际存在. 静态数据成员不能在类中初始化,实际上类定义只是在描述对象的蓝图,在其中指定初值是不允许的.也不能在类的构造函数中初始化该成员,因为静态数据成员为类的各个对象共享,否则每次创建一

C++静态数据成员与静态成员函数

一般情况下,如果有n个同类的对象,那么每一个对象都分别有自己的数据成员,不同对象的数据成员各自有值,互不相干.但是有时人们希望有某一个或几个数据成员为所有对象所共有,这样可以实现数据共享. 可以使用全局变量来达到共享数据的目的.例如在一个程序文件中有多个函数,每一个函数都可以改变全局变量的值,全局变量的值为各函数共享.但是用全局变量的安全性得不到保证,由于在各处都可以自由地修改全局变量的值,很有可能偶然失误,全局变量的值就被修改,导致程序的失败.因此在实际工作中很少使用全局变量. 如果想在同类的

C++中的静态数据成员的作用与好处

静态成员如果有n个同类的对象,那么每一个对象都分别有自己的数据成员,不同对象的数据成员各自有值,互不相干.但是有时人们希望有某一个或几个数据成员为所有对象所共有.这样可以实现数据共享. 在前面介绍过全局变量能够实现数据共享. 如果在一个程序文件中有多个函数,在每一个函数中都可以改变全局变量的值,全局变量的值为各函数共享.但是用全局变量的安全性得不到保证,由于在各处都可以自由地修改全局变量的值,很有可能偶一失误,全局变量的值就被修改,导致程序的失败.因此在实际工作中很少使用全局变量. 如果想在同类

深入了解C#中的静态变量和静态构造函数

深入的剖析C#中静态变量和静态构造函数: 在日常的程序开发过程经常会使用到静态变量,众所周知,静态变量时常驻内存的变量,它的生命周期是从初始化开始一直到Application结束.但是,我们经常会忽略静态变量的初始化时机.一下深入的介绍一下static变量是如何初始化的. 在一个类中定义了静态的变量,这个类就肯定会存在静态的构造函数,无论是我们自己定义了静态的构造函数还是不定义静态构造函数,如果不定义静态的构造函数,编译器会自动给我们生成默认的静态构造函数.而类的静态变量的初始化的 执行时机就是