C++变量初始化 - STEMHA's Blog

C++变量初始化

声明只是表明了变量的数据类型和属性,并不分配内存;定义则是需要分配内存的。

静态成员

类的静态成员(static member)必须在类内声明,在类外初始化
比如:

1
2
3
4
5
class A{
private:
static int count ; // 类内声明
};
int A::count = 0 ; 类外初始化,不必再加static关键字

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

类内初始化的成员

能在类中初始化的成员只有一种,那就是静态常量成员

1
2
3
4
class A{
private:
static const int count = 0; 静态常量成员可以在类内初始化
};

静态成员和常量成员不能在类内初始化。比如const int count = 0; 和static int count = 0;是不能在类里面初始化的。

总结

静态常量数据成员static const int count:

  • 可以在类内初始化(即类内声明的同时初始化),也可以在类外,即类的实现文件中初始化。
  • 不能在构造函数中初始化,也不能在构造函数的初始化列表中初始化;

静态非常量数据成员static int count:

  • 只能在类外,即类的实现文件中初始化
  • 不能在构造函数中初始化
  • 不能在构造函数的初始化列表中初始化

非静态的常量数据成员const int count:

  • 不能在类内初始化,也不能在构造函数中初始化,
  • 只能且必须在构造函数的初始化列表中初始化

非静态的非常量数据成员int count:

  • 不能在类内初始化,不能在类外。
  • 可以在构造函数中初始化
  • 可以在构造函数的初始化列表中初始化

在类外定义的成员变量肯定是有static 关键字的。

初始化规则

系统如何初始化取决于变量的类型以及变量定义的位置。

内置类型变量初始化 

内置类型变量是否自动初始化取决于变量定义的位置。

  • 函数体外定义的变量初始成0;(注意是主函数外)
  • 函数体内定义的变量不进行自动初始化。

类类型变量初始化

类类型变量在定义时,如果没有提供初始化式,则会自动调用默认构造函数进行初始化(不论变量在哪里定义,都会被初始化,只不过初始化为什么样子由编译器决定了)。
如果某类型没有默认构造函数,则定义该类型对象时必须提供显示初始化式。

参考资料

C++中静态变量的声明与初始化
详解C++中变量的初始化规则
C++的变量初始化

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×