#include
#include
using namespace std;
class Person
{
private:
string name;
static int age; //static数据成员age
public:
Person(const string &nm):name(nm){};
void Print();
};
int Person::age = 20; //对static数据成员进行初始化
void Person::Print(){
cout<
总结:在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝。
2、const static数据成员 的例子:
像上面说的,类的static成员,智能在类的定义体外进行初始化。const int 类型的static成员便可以在类定义体内部进行初始化。记住,一定只能是const int型的,换成const string ,double都不行的。
#include
#include
using namespace std;
class Person
{
private:
string name;
static const int age = 20;//在类的定义体内进行初始化
static string address;
public:
Person(const string&nm):name(nm){}
static string Address()
{
return address;
}
void Print()
{
cout<
解释一哈:
只有age才能在类定义体内进行初始化,address是不行的。
3、****** 的例子:
static数据成员的类型可以是该成员所属的类的类型,非static数据成员被限定为其自生类的指针或引用。
class Person
{
private:
string name;
static const int age = 20;//在类的定义体内进行初始化
static string address;
static Person person1;
Person *person2;
Person person3;
public:
Person(const string&nm):name(nm){}
static string Address()
{
return address;
}
void Print()
{
cout<
解释一哈:
如果没有定义person3,则能顺利通过编译,但是加上person3就不能通过编译了。
二、static变量 修饰成员函数:
#include
using namespace std;
class Myclass
{
public:
Myclass(int a,int b,int c);
static void GetSum();//声明静态成员函数
private:
int a,b,c;
static int Sum;//声明静态数据成员
};
int Myclass::Sum = 0;//定义并初始化静态数据成员
Myclass::Myclass(int a,int b,int c)
{
this->a = a;
this->b = b;
this->c = c;
Sum += a+b+c;//非静态成员函数可以访问静态数据成员
}
void Myclass::GetSum() //静态成员函数的实现
{
// cout<
解释一哈:
非静态成员函数可以访问,静态数据成员与普通数据成员;静态成员函数只能访问,静态数据成员,不能访问非静态数据成员。
说完了static成员后,我们再来看看static成员函数,static成员是类的组成部分并不是任何对象的组成部分,因此,static成员函数没有this指针。我们知道,一般而言,类中的成员函数具有一个附加的隐含实参,即指向该类对象的一个指针。这个隐含实参命名为this。因为static成员函数不是任何对象的组成部分,所以static成员函数就没有this形参了。由于成员函数声明为const说明该成员函数不会修改该成员函数所属的对象,所以static成员函数不能声明为const。为什么呢?因为static成员函数不是任何对象的组成部分。static成员函数可以直接访问所属类的static成员,但是不能直接使用非static成员函数!也不能访问static const 类型的成员!在上面的代码中static string Address()函数中如果是return name或者是return age都不行!
注意:
*出现在类体外的函数是不能指定关键字static的;
*静态成员之间可以相互访问, 包括静态成员函数访问静态数据成员和访问静态成员函数;
*非静态成员函数可以任意访问静态成员函数和静态数据成员;
*静态成员函数不能访问非静态成员函数和非经验数据成员;
*因为没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度会有少许的增长;
*调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,也可以直接使用如下格式:
<类名>::<静态成员函数名>(<参数表>)调用类的静态成员函数。
总结:在类中的static成员函数属于整个类所拥有,这个函数不接受this指针,因而只能访问类的static成员变量。
参考的网址:
1》C++类中的static数据成员、static成员函数:https://www.cnblogs.com/yyxt/p/4802688.html
2》C++中static的完全解析:https://blog.csdn.net/jsjwql/article/details/1788286