在C++中,类可以拥有静态和非静态成员(变量和函数)。它们的出现是为了支持类的共有数据(供所有类对象使用),以及不需要访问特定实例状态的函数。
重要的是要区分静态和非静态成员,因为它们具有不同的生命周期、作用域和初始化规则。常见错误包括:错误的定义、同时使用实例和静态成员、头文件中的重复定义。
类的静态变量是在类内部声明为static,但必须在类外单独定义(直到C++17)。它们以单个实例存在。静态函数在没有显式指示的情况下不能访问非静态(实例的)成员。
示例代码:
class Counter { public: static int count; Counter() { ++count; } static void Reset() { count = 0; } }; int Counter::count = 0;
关键特性:
可以在类内部直接初始化静态成员变量吗(在C++17之前)?
不可以,在C++17之前,静态成员必须在类外定义。在C++17及更高版本中,可以在类内部进行inline static的定义。
// C++17 class Foo { inline static int counter = 0; };
类的static函数是否可以访问this或非静态成员?
不可以,static成员不能访问非静态成员或this,即使类实例已经创建。需要显式传递对象以进行访问。
类的static成员在每个类实例时是否会被创建?
不,static成员在整类中只有一个实例,与对象的数量无关。
开发人员在类中声明了static int,但未在类外定义它。链接器会产生未定义符号错误,因为静态成员未被初始化。
优点:
缺点:
静态成员在类中声明,在类外定义,并作为创建对象的计数器使用。
优点:
缺点: