静态成员包括:静态成员变量和静态成员函数。
一、静态成员变量
静态成员变量的特点。
1、验证 所有对象都共享一份数据。
class person {
public:
static int m_A ;
};
int person::m_A = 100; //类内声明,类外初始化
int main()
{
person m1;
cout << m1.m_A << endl;//结果是100
person m2;
m2.m_A = 300;
cout << m1.m_A << endl;//结果300
return 0;
}
2、验证 只能在类内声明,类外初始化。
class person {
public:
static int m_A = 100; //报错
};
//可以写成static const int m_A = 100;
这里有两个问题:
问题1:为什么static修饰的成员变量不可以在类内初始化??
答:静态成员变量是在编译时就分配内存,且是所有的实例化对象都拥有这一片内存空间,任何一个对象对齐修改,其余对象都会随之变化。如果说可以在类内初始化,那么我们每实例化一个对象出来就都会初始化一次,会产生矛盾,因为每一次初始化都开辟新的空间,没办法做到所有对象共享一片空间。
问题2:const 修饰的变量可以如何初始化??
答:很多网上的答案说的是,const修饰的成员变量只能在初始化参数列表中初始化。不能在类外初始化,也不能在定义时初始化。其实是错误的。不能在类外初始化是肯定的,但是可以在定义时初始化,编译器不会报错,也可以运行。但是不建议这样做,因为const修饰的成员变量的目的是防止成员函数对它任意修改,带来一些问题。对于每一个对象,const是常量,但是对于不同的对象const修饰的成员就不是常量,如果你在定义时就初始化就写死了。不建议但是可以成功。
3、静态成员也是有访问权限的。如果改成私有的,类外就不能访问了。class person {
private:
static int m_A; //报错
};
int person::m_A = 100; //类内声明,类外初始化
int main()
{
person m1;
m1.m_A; //报错
return 0;
}
静态成员变量是属于类的属性,不属于某一个对象。静态成员变量有两种访问方式:
class person {
public:
static int m_A;
};
int person::m_A = 100; //类内声明,类外初始化
int main()
{
// 通过对象访问。
person m1;
cout << m1.m_A << endl;
// 通过类访问。
cout << person::m_A << endl;
return 0;
}
二、静态成员函数
访问方式也是有两种:通过对象访问和通过类来访问。
public:
static void fun()
{
cout << "静态函数" << endl;
}
};
int main()
{
// 通过对象访问。
person m1;
m1.fun();
// 通过类访问。
person::fun();
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)