在C++的类中有些成员变量初始化和一般数据类型的成员变量有所不同。以下测试编译环境为:
? g++ -v Using built-in specs. COLLECT_GCC=g++ Target: x86_64-linux-gnu gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4)
测试代码(g++编译通过):
#include <iostream>
using namespace std;
class Test
{
public:
Test() : y(1), r(y), d(3){} //对于常量型成员变量和引用型成员变量,必须通过参数化列表的方式进行初始化。
~Test(){}
int y; //普通变量成员
int &r; //引用成员变量
const int d; //常量成员变量
static int c; //静态成员变量
static const int x = 2.1; //静态常量整型成员变量
static const int xx; //静态常量整型成员变量声明
static const double z; //静态常量非整型成员变量声明
static const float zz = 6.6; //静态常量非整型成员变量
};
const int Test::xx = 4; //静态常量整型成员变量定义
const double Test::z = 5.1; ////静态常量非整型成员变量定义
int Test::c = 2;
int main(void)
{
cout << Test::x << endl;
return 0;
}
这些特殊类型的成员变量主要有:
1. 引用 2. 常量 3. 静态变量 4. 静态整型常量 5. 静态非整型常量
对于==1. 引用==和==2. 常量==,成员变量必须通过构造函数的==参数列表==的方式初始化。例如:上述程序中的r 和 d 变量的初始化。
对于==3. 静态变量==,static成员变量需要在类定义体外进行初始化与定义,因为static数据成员独立该类的任意对象存在,它是与类关联的对象,不与类对象关联。例如:上述程序中的c变量的初始化。
对于==4. 静态整型常量==,该类型成员可以直接在类中初始化,也可以在类中声明,在类定义体外进行定义。例如:上述程序中的x和xx变量。
对于==5. 静态非整型常量==,该类型也是可以在类中声明在类定义体外进行定义,或者直接在类中定义初始化。例如:上述程序中的z和zz变量。
静态成员属于类作用域,但不属于类对象,它的生命周期和普通的静态变量一样,程序运行时进行分配内存和初始化,程序结束时则被释放。所以不能在类的构造函数中进行初始化。
#include <iostream>
using namespace std;
class test2
{
public:
test2(int num) : y(num){}
~test2(){}
static void testStaticFun()
{
cout << "y = " << y << endl; //Error:静态成员函数不能访问非静态成员
}
void testFun()
{
cout << "x = " << x << endl;
}
private:
static int x;//静态成员变量的引用性说明
int y;
};
int test2::x = 10;//静态成员变量的定义性说明
int main(void)
{
test2 t(100);
t.testFun();
return 0;
}
原文:https://www.cnblogs.com/wlzy/p/10890414.html