**************************C++中的static的用法********************************
*******************************************************************************
C++primer里面讲过:static成员它不像普通的数据成员,static数据成员独立于该类的任意对象而存在,每个static数据成员是与类关联的对象,并不与该类的对象相关联!这句话可能比较拗口,其实可以这么理解:每个static数据成员可以看成是类的一个对象,而不与该类定义的对象有任何关系!下面我们就来具体看看类中的static数据成员!
一、static变量 修饰数据成员
1、static变量 ( 修饰数据成员) 的例子:
#include<iostream>
#include<string>
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<<name<<" is "<<age<<endl;
}int main(int argc,char **argv)
{Person person("tom");person.Print();Person person2("nike");person2.Print();person.Print();return 0;
}
解释一哈:
     对于非静态数据成员,每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员。无论是这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷贝,由改类型的所有对象共享访问。也就是说,静态数据成员是该类的所有对象所共有的。对该类的多个对象来说,静态数据成员只分配一次内存,供所有对象共用。所以,静态数据成员的值对每个对象都是一样的,他的值可以更新。

对C++中静态数据成员的了解:

静态数据成员初始化格式:<数据类型><类名>::<静态数据成员名>=<值>
存储:static数据成员是存储在程序的静态存储区,并不是在栈空间上的。(一般程序的由new产生的动态数据存放在堆区,函数内部的自动变量存放在栈区。自动变量一般会随着函数的退出而释放空间,静态数据(即使是函数内部的静态局部变量)也存放在全局数据区。全局数据区的数据并不会因为函数的退出而释放空间。)
初始化:在类中不能对static数据成员进行初始化,要初始化的话必须在类外进行定义! static数据成员不是通过类构造函数进行初始化的!如上面的代码所示:在类外定义int Persion::age = 20;这里前面就不加static 了。
如何访问static数据成员:我们可以通过作用域操作符从类直接调用static数据成员;或者通过对象;或者通过引用;或者指向改类类型对象的指针间接调用(这种情况下static数据成员是public的访问权限,如果定义在private访问权限下是不行的)。
注意:如果类中有多个static数据成员,static数据成员初始化的次序是按照static数据成员在类中的声明次序进行初始化的,初始化后,就可以使用static数据成员了。

总结:在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝。

2、const static数据成员 的例子:

像上面说的,类的static成员,智能在类的定义体外进行初始化。const int 类型的static成员便可以在类定义体内部进行初始化。记住,一定只能是const int型的,换成const string ,double都不行的。

#include<iostream>
#include<string>
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<<name<<" is "<<age;}
};
string Person::address = "XiangGang"; //在类的定义体外进行初始化int main()
{Person person("tom");person.Print();cout<<" and live in "<<person.Address();cout<<endl;return 0;
}

解释一哈:

只有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<<name<<" is "<<age;}
};

解释一哈:

如果没有定义person3,则能顺利通过编译,但是加上person3就不能通过编译了。

二、static变量 修饰成员函数:

#include<iostream>
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<<a<<endl; //error a是非静态数据成员        cout<<"Sum = "<<Sum<<endl;
}int main()
{Myclass M(1,2,3);M.GetSum();Myclass N(4,5,6);N.GetSum();Myclass::GetSum();
}

解释一哈:

非静态成员函数可以访问,静态数据成员与普通数据成员;静态成员函数只能访问,静态数据成员,不能访问非静态数据成员。

说完了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

对C++ static作用——修饰 数据成员(改变为静态数据成员)、 成员函数(改变为静态成员函数)相关推荐

  1. 【编程】C++入门:static成员——用static修饰的成员函数,称之为静态成员函数。

    C++入门:static成员 用static修饰的成员函数,称之为静态成员函数. 静态的成员变量一定要在类外进行初始化. [静态的成员变量不能在声明.初始化列表中进行初始化.] class Date ...

  2. C++类的常量数据成员,静态数据成员,常量静态数据成员,枚举类型

    文章目录 C++类的常量数据成员,静态数据成员,常量静态数据成员 const成员 static成员 静态整型常量数据成员 C++枚举类型 C++中作用域受限的枚举类型 经典做法 C++11的枚举类 C ...

  3. 静态数据成员与非静态数据成员的区别

    数据成员: 静态数据成员是类的一部分,为类的所有实例共享(静态区): 非静态数据成员,类的每个实例都有一份拷贝(动态区). 静态数据成员的访问: 静态数据成员是类的一部分,在产生任何实例之前已经存在, ...

  4. 类的成员函数指针和静态成员函数指针 调用成员函数***

    C++提供static这个关键词对静态成员进行声明,静态成员函数和类的实例化无关,对于同一类来说,静态成员函数是所有类的对象共享的.而普通成员函数需要实例化才能调用,对于每一个实例来说,普通成员函数是 ...

  5. 对C语言 static作用——修饰 变量(全局变量/局部变量)、函数

    *******************************概念******************************************** ********************** ...

  6. 静态数据成员与非静态数据成员

    静态数据成员   用static来声明静态成员,它是类的一部分,有该类中的所有对象共同使用和维护,实现类中数据的共享(静态区),要受private控制符影响. 非静态数据成员   类的每个实例都有一份 ...

  7. 静态数据成员和静态成员函数(static)

    目录 一.关于静态成员 二.静态数据成员和普通数据成员的共同点 三.为什么要使用静态数据成员 四.关于静态数据成员的初始化 五. 静态成员的访问方式 六.静态成员函数 1.与静态数据成员不同,静态成员 ...

  8. C++类的静态数据成员-关键字static

    C++类的静态数据成员-关键字static 定义:用static关键字声明的数据成员称为静态数据成员. 每个类只有一个存储单元,静态数据成员为该类的所有对象共有,不属于某个对象.静态数据成员的初始化必 ...

  9. 类的静态成员函数和静态数据成员

    一.静态数据成员 1.定义: 静态数据成员就是给类的普通数据成员加上关键字static. 2.访问规则 静态数据成员也遵守public/protected/private访问规则 访问静态成员时,则可 ...

最新文章

  1. 个人在公司在意的三点
  2. Google瓦片地图算法解析
  3. vs.net 2005 中自定义模版项
  4. Docker Dockerfile详解
  5. 怎么在html mui中找到下拉刷新,HelloMUI例子中的下拉刷新
  6. 《微型计算机原理及应用》复习整理(针对考点)
  7. 挠场的科学丨二、无线电力传送与特斯拉遗失的文件
  8. 计算机课ppt实验报告,ppt模板,实验报告
  9. Element UI 之 Tabs 栏下拉菜单的实现
  10. 【redux------状态管理库】
  11. CentOS离线 + 在线安装telnet(rpm包安装)
  12. 【牛尔】【小p】这些美容强男的超级秘籍!!!丝般肌肤毛孔看不见,清透小面颊,丝滑小脸蛋儿,你难道不想拥有吗————【收缩毛孔的最佳方法】(一夜之间6万浏览量,大师的感召力和信服力就是强啊!)
  13. c语言编程TLC2543AD采集,TLC2543单片机程序 带Proteus仿真 电路原理图 AD转换实验
  14. 树莓派摄像头检测运动物体
  15. android开发常用的ADB命令
  16. linux定时释放内存,定时释放Linux 内存 带释放记录
  17. zz: 胡适:赠与今年的大学毕业生
  18. 如何在美国大学生数学建模竞赛中获奖?
  19. Android替换系统默认输入法
  20. Ozone SCM HA模式下的请求处理过程

热门文章

  1. 洗牌算法(Knuth-Durstenfeld Shuffle)
  2. C# 获取当前系统时间 与某一时间相减
  3. modbus通讯失败_【分享】Modbus通讯失败后数据一直保持不变,差点引起事故,检查Modbus通讯失败次数...
  4. 学习软件测试前景如何?好就业吗?
  5. 关于电商项目面试遇到的问题
  6. Holistic Multi-modal Memory Network for Movie Question Answering心得体会
  7. WINS服务器和DNS服务器有什么区别?
  8. 油管8k视频使用av1格式 用什么显卡才行 为什么cpu 100%
  9. 事实、观点、立场与信仰
  10. 网易新闻app自媒体号信息爬取