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