Static在C++的用法
前言:该文章主要讲解C++的类中含有static的情况,小白发文,若有不足欢迎各位大佬斧正( •̀ ω •́ )✧
一、面向设计过程设计中的static
1.静态全局变量
此处省略介绍
2.静态局部变量
此处省略介绍
3.静态函数
好处:静态函数不能被其他文件所用。
其他文件中可以定义相同名字的函数,不会发生冲突
二、面向对象static关键字(类中的static)
1.静态数据成员
■无论这个类的对象被定义了多少个,该成员是该类的所有对象所共有的
■该成员定义时要在全局数据区分配空间,所以不能在类声明里面定义
class Person
{
private:
static int sum; //声明static静态数据成员
int m_age, m_id;
public:
static int fun(Person* p){...}
};
int Person::sum = 0; //该成员是private时,在类声明外定义
■该成员没有进入程序的全局名字空间,因此不存在与其它全局名字冲突的可能性
■可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能
2.静态成员函数
■无论这个类的对象被定义了多少个,该成员是该类的所有对象所共有的
■类体外的函数定义不能指定关键字static
■调用函数,可用一个类的对象(.)或(->)指向类对象的指针调用静态成员函数。当用for_each时,要调用函数,用的是(.)调用的,若不给函数加上static,只能在类外部实现,但会导致个问题“不能用调用类private数据成员”。所以我们可以给函数加上static解决这问题
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
class Person
{
private:
int m_age, m_id;
public:
Person(){}
Person(int age, int id) : m_age(age), m_id(id){}
static void func(Person* p)
{
cout << "age: " << p->m_age << "id: " << p->m_id << endl;
}
};
/** 会报错 **/
// void func(Person* p)
// {
// cout << "age: " << p->m_age << "id: " << p->m_id << endl;
// }
int main()
{
vector<Person*> v;
Person p1(10, 20), p2(20, 30), p3(30, 40);
v.push_back(&p1);
v.push_back(&p2);
v.push_back(&p3);
vector<Person*>::iterator pBegin = v.begin();
vector<Person*>::iterator pEnd = v.end();
for_each(pBegin, pEnd, Person::func); //此处是用(.)调用函数的
return 0;
}
三、类模板遇上Static
这种情况,我们会引出一个这样的问题 “static成员是被全部具体的实现类共享,还是每个具体的实现类都会创建属于自己的static成员?”
我们以下面的代码进行举例:
#include <iostream>
#include <windows.h>
using namespace std;
template<class T>
class Person
{
public:
static int a;
};
//类外初始化
template<class T> int Person<T>::a = 0;
int main()
{
SetConsoleTitle("IF template class include static mumber");
/** 两个不同的具体实现类 **/
Person<int> p1, p2, p3;
Person<char>pp1, pp2, pp3;
p1.a = 10;
pp1.a = 100;
cout << p1.a << " " << p2.a << " " << p3.a << endl;
cout << pp1.a << " " << pp2.a << " " << pp3.a << endl;
return 0;
}
我们根据上面所说,思考这样一个问题 “p1\p2\p3 和 pp1\pp2\pp3的值是多少?如果是共享一个static,那么它们的值都一样是100,否则他们的值将不相等”
根据如下类图,具体实现类1 和 具体实现类2,虽然都用了模板类的static int a,但是他们两个是相互独立、互不干扰的
所以以上的代码Output:
p1=10 p2=10 p3=10
p1=100 p2=100 p3=100
路漫漫其修远兮,吾将上下而求索