普通成员变量
用初始化列表或者构造函数中赋值
普通成员常量和引用型变量
用初始化列表初始化
静态成员变量
用类内声明,类外定义初始化
静态成员常量
当且仅当const、static、且为integer类型,可以直接类内声明并给一个默认值(可以不要类外定义初始化);
其余类型同样是类内声明,类外定义初始化
示例
A.h
#ifndef A_H
#define A_H
class A
{
public:
virtual ~A();
A(int p1,int p2,int p3):a(p1),b(p2),c(p3){};
void Print();
private:
int a;//初始化列表初始化、构造函数中赋值初始化
int &b;//初始化列表初始化
const int c;//初始化列表初始化
static int d;//静态成员变量在类内声明在类外初始化,此时该变量属于类,不属于某个对象。
static const int e=60;//静态成员常量,整型可以直接类内声明并赋默认值
static const float f;//静态成员常量,非整型需要类外初始化
};
#endif // A_H
A.cpp
#include "A.h"
#include<iostream>
int A::d = 1000;
const float A::f = 90.9;//类外初始化时不能再定义为static
void A::Print(){
std::cout<<a<<","<<b<<","<<c<<","<<d<<","<<e<<","<<f<<std::endl;
}
A::~A()
{
//dtor
}
MAIN.cpp
#include <iostream>
#include "A.h"
using namespace std;
int main(){
A a(21,22,23);
a.Print();
return 0;
}
为什么静态的就要类外初始化?
因为类内初始化会导致每个对象包含该静态成员,与静态变量属于类不属于对象相矛盾。
这里赋值和初始化有什么不同?
初始化是在分配空间时为对象赋值,赋值则是在空间分配完毕之后,在进行普通的赋值操作。
C++规定对象的成员变量的初始化动作发生在进入构造函数本体之前。
static const int e=60 还需要类外定义?
一般而言不需要在进行类外定义
若有对该变量取地址或者编译器强制要求看到定义才需要在类外定义
在类内声明并给了默认值的情况下,类外定义如下即可:
const int A::e; //不需要也不可以再赋值;
//不能用static