static数据成员
-
static成员不属于对象,属于类,是所有对象共有的--->调用可以不需要对象(当然也可以用对象调用)
-
static成员依旧受权限限定 (public、protected、private)
-
用static修饰的数据成员,必须在类外初始化
在类中直接初始化是错误的--->不能采用初始化参数列表方式初始化,和普通数据成员写法的区别
class MM
{
public:
MM(string name=""):name(name),num(num){}
protected: /*报错:num不是类MM的非静态数据成员或基类*/
string name;
static int num=0; //报错:带有类内初始值设定项的成员必须为常量
};
static成员在类外初始化不再需要static修饰,但是受权限限定,定义变量写在protected属性会报错
class MM
{
public:
MM(string name=""):name(name){}
static int num;
protected:
string name;
};
//必须在类外初始化,此时不再需要static修饰,但是需要类名限定
int MM::num = 1;
int main()
{
//静态数据成员访问,可以不需要对象--->但是需要类名限定
cout <<MM::num << endl;
}
什么叫做共有?深刻认识共有的概念--->所有对象用的都是用一份
class MM
{
public:
MM(string name = "") :name(name)
{
num++; //对static成员++
}
static int num;
protected:
string name;
};
int MM::num = 1;
int main()
{
//理解什么叫做共有的
MM mm("mm"); //2
//静态数据成员通过对象的方式去访问
cout << mm.num << endl; //此时num==2
MM array[3]; //5
MM* p = new MM("newMM"); //6
cout << MM::num << endl;
cout << p->num << endl;
cout << mm.num << endl;
delete p;
p = nullptr;
}
/*输出*/
2
6
6
6
static成员函数
-
static写在函数前面即可
-
调用非静态数据成员 必须要指定对象
小知识:
-
没有static构造函数
-
可以在类中声明,在类外实现/在类中实现,不需要static修饰词,需要类名限定
怎么调用非静态数据成员--->必须指定对象
静态函数调用静态数据没有要求
class MM
{
public:
MM(string name=""):name(name)
{
num++;
}
static void printMM();
static void printData(MM& mm) //调用非静态成员--->指定一个对象进来,就可以调用了
{
cout << mm.name <<" "<<num <<endl;//静态数据可以用对象指定,也可以不用对象指定
}
protected:
string name;
public:
static int num;
};
int MM::num = 1;
void MM::printMM()
{
/*报错:调用非静态数据成员,必须要指定对象--->否则不知道这个属性属于哪个对象,传
对象或者定义对象的方式,printMM()这个函数不采用对象去调用,name就没有来源*/
cout << name << endl;
//静态函数调用静态数据没什么要求
cout << num << endl;
cout << "静态成员函数" << endl;
}
int main()
{
//调用静态成员函数--->不需要对象
MM::printMM();
//调用静态成员函数--->通过创建一个对象的方式调用
MM mm("mm");
mm.printMM();
//调用静态成员函数--->通过传参的方式(传入对象的参数)调用
MM::printData(mm);
return 0;
}
/*输出*/
1
静态成员函数
2
静态成员函数
mm 2
static对象
生命周期到程序关闭--->最后释放
相关内容可以看看这篇博客:c++构造、析构顺序问题_考拉爱睡觉鸭~的博客-CSDN博客