目录
一、静态数据成员的特点
【static】类成员的特点:
- 静态成员变量⼀定要在类外进行初始化
- 静态成员变量为所有类对象所共享,不属于某个具体的对象,不存在对象中,存放在静态区
- ⽤【static】修饰的成员函数,称之为静态成员函数,静态成员函数没有【this】指针
- 静态成员函数中可以访问其他的静态成员,但是不能访问非静态的
- 非静态的成员函数,可以访问任意的静态成员变量和静态成员函数
- 静态成员也是类的成员,受【public】、【protected】、【private】 访问限定符的限制
- 静态成员变量不能在声明位置给缺省值初始化
- 突破类域就可以访问静态成员,可以通过(【类名】::【静态成员】) 或者 (【对象】.【静态成员】) 来访问静态成员变量和静态成员函数
二、静态数据成员的作用
- 静态数据成员在类的所有对象中共享一份存储空间,而不是每个对象都拥有一份独立的拷贝
- 也就是说,无论创建了多少个类的对象,静态数据成员都只有一份拷贝
- 静态成员在C++编程中非常有用,尤其是在需要跨多个对象共享数据或功能时
典型应用场景
- 计数器:用于跟踪类的实例数量
- 工厂函数:用于创建类的实例,通常作为静态成员函数实现
- 全局配置:用于存储类的全局配置信息,例如默认设置等
三、静态成员变量⼀定要在类外进行初始化
示例:
class Test
{
public:
private:
//类中声明
static int num;
};
//静态成员变量⼀定要在类外进行初始化
int Test::num = 100;
int main()
{
return 0;
}
静态成员变量不可以在局部函数进行初始化,比如说在【main】函数中:
class Test
{
public:
private:
//类中声明
static int num;
};
int main()
{
//静态成员变量不可以在局部函数进行初始化
int Test::num = 100;
return 0;
}
会报错:
四、静态成员变量不存在对象中
这个很好理解【static】关键字改变了类成员的生命周期,不存在对象中,存放在静态区
证明:
- 如果【static】修饰的成员变量存放在类中那么以下【Test】类的大小应该为4
- 如果【static】修饰的成员变量不存放在类中那么以下【Test】类的大小应该为1
class Test
{
public:
private:
//类中声明
static int num;
};
int main()
{
cout << sizeof(Test) << endl;
return 0;
}
结果:
五、静态成员函数没有【this】指针
成员函数被【static】修饰它们本身已经与类本身关联,而不是与类创建的对象关联,因此不需要【this】指针
静态成员函数只能访问类中的静态成员变量
普通的成员函数会默认的传递【this】指针,再进行访问成员变量时编译器都会默认加上【this】指针来访问
日常书写:
class Test
{
public:
void print()
{
cout << num << endl;
}
private:
int num;
};
实际显示:
class Test
{
public:
//编译器会默认的加上【this】指针
void print()
{
cout << this->num << endl;
}
private:
int num;
};
因此静态成员函数不可以访问类中非静态成员,因为没有【this】指针
示例:
class Test
{
public:
static void print()
{
cout << num << endl;
}
private:
int num;
};
结果:编译报错
六、静态成员的访问方式
突破类域就可以访问静态成员
- 【类名】::【静态成员】
- 【对象】.【静态成员】
【注意】
静态成员也是类的成员,受【public】、【protected】、【private】 访问限定符的限制
示例:
class Test
{
public:
//声明
static int num;
};
//定义
int Test::num = 100;
int main()
{
Test t;
//【对象】.【静态成员】
cout << t.num << endl;
//【类名】::【静态成员】
cout << Test::num << endl;
return 0;
}
结果:
示例:静态成员也是类的成员,受【public】、【protected】、【private】 访问限定符的限制
class Test
{
public:
private:
static int num;
};
int Test::num = 100;
int main()
{
Test t;
//【对象】.【静态成员】
cout << t.num << endl;
//【类名】::【静态成员】
cout << Test::num << endl;
return 0;
}
结果:编译报错
七、静态成员变量不能在声明位置给缺省值初始化
首先我们要理解:声明位置给缺省值的本质是给初始化列表传参
我们的静态成员变量的已经不在对象中存储了,缺省值是个构造函数初始化列表的,静态成员变量不属于某个对象,不⾛构造函数初始化列表
示例:
class Test
{
public:
private:
//静态成员变量不能在声明位置给缺省值初始化
static int num = 100;
};
结果:编译报错