本文主要是介绍C++static用法解析(给你的一份总结归纳),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Static在C++的用法
- 一、面向设计过程设计中的static
- 1.静态全局变量
- 2.静态局部变量
- 3.静态函数
- 二、面向对象static关键字(类中的static)
- 1.静态数据成员
- 2.静态成员函数
- 三、类模板遇上Static
前言:该文章主要讲解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
路漫漫其修远兮,吾将上下而求索
这篇关于C++static用法解析(给你的一份总结归纳)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!