01 基本概念

静态成员:在定义前面加了static关键词的成员。

class A
{
public:
A(int a, int b):m_a(a),m_b(b)
{
num += m_a + m_b;
} ~A(){ } void Fun(); // 普通成员函数
static void PrintNum() // 静态成员函数
{
// 在静态成员函数中,不能访问非静态成员变量,也不能调用非静态成员函数
std::cout << num << std::endl;
} private:
int m_a; // 普通成员变量
int m_b; // 普通成员变量
static int num; // 静态成员变量
}; // 静态成员必须在定义类的文件中对静态成员变量进行初始化,否则会编译出错。
int A::num = 0; int main()
{
A a1(1,1);
A::PrintNum(); // 访问静态函数
A a2(1,1);
A::PrintNum(); // 访问静态函数 return 0;
}

输出结果

2
4
  • 普通成员变量每个对象有各自的一份,而静态成员变量一共就一份,为所有对象共享。

这里需要注意的是sizeof运算符不会计算静态成员变量的大小,如下栗子:

class CTest
{
int n;
static int s;
};

sizeof(CTest)等于4

  • 普通成员函数必须具体作用于某个对象,而静态成员函数并不具体作用于某个对象
  • 因此静态成员不需要通过对象就能访问,因为他是共享的。

02 如何访问静态成员

1) 类名::成员名

A::PrintNum();

2) 对象名.成员名

A a;
a.PrintNum();

3) 指针->成员名

A *p = new A();
p->PrintNum();

4) 引用.成员名

A a;
A & ref = a;
ref.PrintNum();

03 小结

  • 静态成员变量本质上是全局变量,哪怕一个对象都不存在,类的静态成员变量也存在。
  • 静态成员函数本质上是全局函数。
  • 设置静态成员这种机制的目的是将和某些紧密相关的全局变量和函数写在类里面,看上去像是一个整体,易于维护和理解。
  • 在静态成员函数中,不能访问非静态成员变量,也不能调用非静态成员函数。
  • 静态成员必须在定义类的文件中对静态成员变量进行初始化,否则会编译出错。

C++ static静态成员的更多相关文章

  1. 缓存篇(Cache)~第一回 使用static静态成员实现服务器端缓存(导航面包屑)

    返回目录 今天写缓存篇的第一篇文章,在写完目录后,得到了一些朋友的关注,这给我之后的写作带来了无穷的力量,在这里,感谢那几位伙伴,哈哈! 书归正传,今天我带来一个Static静态成员的缓存,其实它也不 ...

  2. C++学习10 static静态成员变量和静态成员函数

    一般情况下,如果有N个同类的对象,那么每一个对象都分别有自己的成员变量,不同对象的成员变量各自有值,互不相干.但是有时我们希望有某一个或几个成员变量为所有对象共有,这样可以实现数据共享. 可以使用全局 ...

  3. C++ 类的static静态成员

    静态static 静态成员的提出是为了解决数据共享的问题.实现共享有许多方法,如:设置全局性的变量或对象是一种方法.但是,全局变量或对象是有局限性的. 在全局变量前,加上关键字static该变量就被定 ...

  4. c++学习笔记之类和对象(三、static静态成员变量和静态成员函数)

    一.static静态成员变量 对象的内存中包含了成员变量,不同的对象占用不同的内存,这使得不同对象的成员变量相互独立,它们的值不受其他对象的影响.是有时候我们希望在多个对象之间共享数据,对象 a 改变 ...

  5. 想用@Autowired注入static静态成员?官方不推荐你却还偏要这么做

    生命太短暂,不要去做一些根本没有人想要的东西.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习 ...

  6. 对static静态成员的理解

    疑惑: 数据成员可以分静态变量.非静态变量两种.  静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例 ...

  7. c++,static 静态成员变量 / 静态成员函数

    静态成员变量: //静态成员变量(static) // //1.如果想在同类的多个对象之间实现数据共享 ,可以用静态 //成员变量,即用static修饰的成员变量,例 static int a; // ...

  8. C++ static 静态成员变量 和 静态成员函数

    静态(static) 成员 变量 1•  静态成员变量的初始化须要在类外完毕. 2•  静态成员不属于详细的某个对象,而属于整个类: 3•  全部对象共享本类中的静态成员: 4•  静态成员最好直接通 ...

  9. 34)static 静态成员和静态成员函数

    1) static修饰的方法,只能在这个文件中使用,比如你是多文件编程,别的文件即使引入了我的 .h文件  但那时我的static方法也是不能用 2)C++的static的成员变量   比如  sta ...

随机推荐

  1. go语言之数据类型和格式化输出

    1.数据类型 package main import ( "fmt" "reflect" ) func main() { //整形 var v1 int32 v ...

  2. Repeater嵌套

    我们自己观察 这是由两个重复项组成的 重复项包含重复项 而重复项的数据源是由订单号决定 即父Repeater的某数据源字段 protected void Repeater1_ItemDataBound ...

  3. C++设计考试例题

    1. 采用面向对象的方式编写一个通迅录管理程序,通迅录中的信息包括:姓名,公司,联系电话,邮编.要求的操作有:添加一个联系人,列表显示所有联系人.先给出类定义,然后给出类实现.(提示:可以设计二个类, ...

  4. ASP.NET Core 2.2 WebApi 系列【五】MiniProfiler与Swagger集成

    MiniProfiler 是一款性能分析的轻量级程序,可以基于action(request)记录每个阶段的耗时时长,还是可以显示访问数据库时的SQL(支持EF.EF Code First)等 一.安装 ...

  5. ASP.NET Core Web 应用程序开发期间部署到IIS自定义主机域名并附加到进程调试

    想必大家之前在进行ASP.NET Web 应用程序开发期间都有用到过将我们的网站部署到IIS自定义主机域名并附加到进程进行调试. 那我们的ASP.NET Core Web 应用程序又是如何部署到我们的 ...

  6. Business Model Design 业务模型设计

    Note This section is split into two parts, which describe the use of two different Object-relational ...

  7. Cesium专栏-气象卫星云图动图(附源码下载)

    Cesium Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精 ...

  8. QT--HTTP文件下载器

    QT--HTTP文件下载器 1.pro文件添加 QT       += core gui network 2.头文件 #include <QNetworkAccessManager> #i ...

  9. python2 和 python3共存的常见使用(如安装虚拟环境的问题)

    1.安装好python2和python3,配置好全部环境变量 环境变量修改后,需要重新启动命令行才有效 2.如何启动不同版本的python 启动的时候会执行python.exe,python2和pyt ...

  10. How To Restore Rman Backups On A Different Node When The Directory Structures Are Different (Doc ID 419137.1)

    How To Restore Rman Backups On A Different Node When The Directory Structures Are Different (Doc ID ...