类中的静态成员变量 非静态成员变量的初始化问题

#include <iostream> using namespace std; struct a { int m; };

struct b : public a { int n =8; };

int n =8这行报错,因为类的非静态成员不能在类中初始化。

1. 为什么类的静态成员变量不能在类中初始化

在C++中,类的静态成员(static member)必须在类内声明,在类外初始化,像下面这样

class A
{  
private:
    static int count ; // 类内声明
};

int A::count = 0 ; // 类外初始化,不必再加static关键字

为什么?因为静态成员属于整个类,而不属于某个对象,如果在类内初始化,会导致每个对象都包含该静态成员,这是矛盾的。

2.为什么类的非静态成员也不能在类中初始化

定义类的时候并没有分配内存这时候赋值的话值放在哪里呢? 当用类构造对象的时候首先分配内存然后调用构造函数这时候才可以初始化非静态成员变量。

类的静态成员变量和方法属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问;非静态成员(变量和方法)

属于类的对象,所以只有在类的对象产生(创建类的实例)时才会分配内存,然后通过类的对象(实例)去访问。

在一个类的静态成员中去访问其非静态成员之所以会出错是因为在类的非静态成员不存在的时候类的静态成员就已经存在了,访问一个内存中不存在的东西当然会出错。(访问的这个非静态成员必须是属于某个实例才行)

.

经验分享 程序员 微信小程序 职场和发展