湖南住房城乡建设厅官方网站,中文网站编辑,国人wordpress企业主题,安康市移动公司电话目录
1、静态成员变量
2、静态成员函数
3、常函数
4、常对象 当我们使用c的关键字static修饰类中的成员变量和成员函数的时候#xff0c;此时的成员变量和成员函数被称为静态成员。
静态成员包含#xff1a;
静态成员变量静态成员函数
1、静态成员变量
静态成员变量有…
目录
1、静态成员变量
2、静态成员函数
3、常函数
4、常对象 当我们使用c的关键字static修饰类中的成员变量和成员函数的时候此时的成员变量和成员函数被称为静态成员。
静态成员包含
静态成员变量静态成员函数
1、静态成员变量
静态成员变量有着如下几个特点
所有对象共享一份数据在编译阶段分配内存类内声明类外初始化 需要我们牢记的是空类的内存空间大小为1是为了每个空类对象一个独一无二的地址。
当我们在类内声明静态成员变量之后需要在类外定义静态成员变量 int Data::m_varA 10; int Data::m_varB 10; 定义多个类对象打印出不同类对象的同一个静态成员变量可以很明显看出结论类对象共享静态成员变量的同一份数据 对于私有权限下的静态成员变量m_varB发现在类的外部是无法访问的 这说明了静态成员变量也是有访问权限的。
由于静态成员变量是在编译期间分配的那么可以不可以通过类名直接访问静态成员变量呢
实践出真知运行效果图如下 那么我们就需要记得静态成员变量有两种访问方式第一种是通过对象第二种是通过类名。
2、静态成员函数
静态成员函数有着如下的特点
程序共享一个函数静态成员函数只能访问静态成员变量
对于第一个特点程序共享一个函数怎么理解通过案例代码来进行深刻理解
class Data
{
public:static void func(){cout static void func()函数调用 endl;}
private:};int main(void)
{Data d1;Data d2;d1.func();cout d1 - func()函数的地址为 : d1.func endl;d2.func();cout d2 - func()函数的地址为 : d2.func endl;return 0;
} 静态成员变量有着访问权限的限制问题那对应的静态成员函数也有着同样的访问权限问题 当我们使用静态成员函数的时候静态成员函数只能访问静态成员变量其余变量是无法访问的从而得出以下结论静态成员函数只能访问静态成员变量 静态成员函数和静态成员变量一样也有着两种访问方式通过对象和类名访问 3、常函数
成员函数加const后我们可以称这个函数为常函数常函数有着如下特点
常函数内不可以修改成员属性成员属性声明时加关键字mutable后在常函数中依然可以修改
class Data
{
public:Data() {m_A 0;m_B 0;}void change() const{this-m_A 100;}int m_A;mutable int m_B; //可修改 可变的
};
此上述案例代码看起来却似乎没有问题但是当我们运行的时候会出现报错因为在常函数里面是不被允许修改成员变量的。如果想要在常函数中修改成员变量需要在变量前加mutable这个关键字有了mutable关键字之后该成员变量就可以在常函数中修改了。 4、常对象
声明对象前加const称该对象为常对象常对象有着如下特点:
常对象只能调用常函数
class Data
{
public:Data() {m_A 0;m_B 0;//cout int m_A m_A endl;//cout mutable int m_B m_B endl;}void func(){cout func()函数调用 endl;}void change() const{//this-m_A 100;this-m_B 100;}int m_A;mutable int m_B; //可修改 可变的
};int main(void)
{//Data d1;//d1.change();//cout d1 - int m_A d1.m_A endl;//cout d1 - mutable int m_B d1.m_B endl;const Data d1;//常对象不能修改成员变量的值,但是可以访问//d1.m_A 100;cout const Data d1 - int m_A d1.m_A endl;cout const Data d1 - mutable int m_B d1.m_B endl;//常对象只能使用常函数//d1.func();d1.change();cout const Data d1 - int m_A d1.m_A endl;cout const Data d1 - mutable int m_B d1.m_B endl;return 0;
}