C++中类的static静态成员(数据成员和成员函数)及const修饰类成员

类的静态成员与类的本身直接相关,而不是与类的各个对象保持相关。

静态数据成员的声明

●通过在成员的声明之前加上关键字static使得其与类关联在一起。和其他成员一样,静态数据成员的访问权限也可以是public、private、projected。静态数据成员的类型可以是常量、引用、指针、类类型等等。

class A
{
private:
    static int _count;
};
int main()
{
    sizeof(A);//计算A类所占内存的大小
    return 0;
}

结果:这里写图片描述
可以得知,只含一个静态数据成员的类的大小为1,即为空类的大小,所以当创建一个类的对象时,系统不会为类中的静态数据成员开辟空间。在编译期间,就会为类的静态成数据员准备好内存空间。
类的静态数据成员存在于任何对象之外,对象中不包含任何与静态数据成员有关的数据。
所以当创建一个类的多个对象时,只存在一个类的静态数据成员,而且它被所有的类的对象所共享。

静态成员函数的声明
class A
{
public:
    static void Test()
    {}
};
int main()
{
    return 0;
}

静态成员函数也不与任何类的对象绑在一起,静态成员函数不包含this指针。
静态成员函数不能声明成const类型,而且我们不能在static函数体内使用this指针,这一限制既适用于this的显示使用,也对调用非静态成员的隐式使用有效。

类的静态成员的使用

我们可以通过 作用域::静态成员 或 类对象名.静态成员 来访问类的静态成员(访问时应该注意访问权限)


定义静态成员函数

●和其他的成员函数一样,我们既可以在类的内部也可以在类的外部定义类的静态函数。当在类的外部定义类的静态函数时,不能重复static关键字,该关键字只在类的内部声明语句中出现。

定义静态数据成员

因为类的静态数据成员不属于任何一个类的对象,所以它不是在创建类的对象时被定义的,这就说明它不是由类的构造函数初始化的,一般情况下,我们不能在类的内部初始化静态成员,必须在类的外部定义和初始化每一个静态成员。
类似于全局变量,静态数据成员定义在任何函数之外。因此一旦它被定义,就会一直存在于程序的整个生命周期中。
定义静态数据成员的方式和在类外定义静态成员函数相似:
类型名 类名(作用域)::静态成员名= 初始化值

class A
{
public:
    static void Test();//静态成员函数的声明
private:
    static int _count;//静态数据成员的声明
};
int A::_count = 0;//定义并初始化静态数据成员
void A::Test()//定义静态成员函数
{
    ...//函数内容
}
int main()
{
    return 0;
}

const修饰类成员

在C语言中const只可修饰变量,用const修饰的变量是不可以被修改的变量。
在C++中,用const修饰一个变量,在编译期间,会将程序文件中所有使用该变量的位置替换为所修饰的常量。(类似于宏)
宏的缺点:
1.不能调试
2.不进行类型检测
3.代码复用率不高,造成代码膨胀
4.具有副作用

const使用场景

const修饰形参,一般和引用同时使用
const修饰返回值
const修饰数据成员,必须在构造函数的初始化列表中初始化
const修饰类的成员函数,实际修饰隐含的this指针,表示在类中不可以对类的任何成员进行修改
在const修饰的成员函数中要对类的某个数据成员进行修改,该数据成员定义声明时必须加mutable关键字

猜你喜欢

转载自blog.csdn.net/h___q/article/details/80816534