当我们使用 static 关键字来把类或者结构成员定义为静态的时侯,无论之后创建多少个类的对象(实例),静态成员都只有一个副本,所有实例都共享这个副本。也就是说,静态成员已经不属于实例了,它归属于类,是一种类普遍存在的属性,而与实例无关。

注意我们不能把静态成员的初始化放置在类的定义中,静态成员变量在类中仅仅是声明,没有定义,所以要在类的外面定义,也就是给静态成员变量分配内存。在类的外部通过使用范围解析运算符 :: 来重新声明静态变量从而对它进行初始化,如下:

#include <iostream>class Entity
{public:static int x, y; //声明static void Print(){std::cout << x << "," << y << std::endl;}
};int Entity::x; //定义
int Entity::y; //定义int  main()
{Entity::x = 1;Entity::y = 3;Entity::Print();Entity::x = 5;Entity::y = 8;Entity::Print();std::cin.get();
}

可以看到,静态成员在类当中只是声明,而定义在外面,后面的赋值也是直接赋值,甚至不需要创建任何实例,静态成员是脱离于实例的。

而静态成员函数只能访问静态成员数据、其他静态成员函数和类外部的其他函数。如以下代码:

#include <iostream>class Entity
{public:int x, y;static void Print(){std::cout << x << "," << y << std::endl;}
};int  main()
{Entity e1;e1.x = 1;e1.y = 3;Entity::Print();std::cin.get();
}

是不会通过的,因为它相当于以下可运行代码,但是把Print(Entity e)改为Print()

#include <iostream>class Entity
{public:int x, y;
};static void Print(Entity e)
{std::cout << e.x << "," << e.y << std::endl;
}int  main()
{Entity e1;e1.x = 1;e1.y = 3;Print(e1);std::cin.get();
}

也就是说,类的静态成员函数同样是与某个特定实例无关的,它归属于类。所以我们无法向它传入某个实例的成员(配不上),必须得是静态成员数据才能作为它的参数。

C++ 学习之旅(11)——类和结构中的static相关推荐

  1. 乐鑫Esp32学习之旅11 入门 乐鑫esp-adf 音频框架开发,造一个蓝牙耳机,实现切换歌曲,获取歌曲信息等功能。(附带Demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. 爬坑学习新旅程,虚拟机搭建esp32开发环境,打印 " ...

  2. python历史背景_python学习之旅1-1(python背景、安装介绍)

    一.python介绍 1.python历史背景 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆(中文名字:龟叔)为了在阿姆斯特丹打发时 ...

  3. 【Java学习日记】#11 类与对象 #3 对象

    对象 对象的特性 对象的创建 对象的引用 对象的使用 对象的销毁 对象的特性 对象的创建 使用new操作符调用构造方法就可以创建一个对象. 创建一个Test类对象: Test test1 = new ...

  4. Unity之C#学习笔记(11):静态类型 Static

    前篇链接:Unity之C#学习笔记(10):接口和多态 Interfaces and Polymorphism 静态类型(Static)用一句话概括就是:在程序运行期间只会被创建一份的通用内容,用关键 ...

  5. LINQ学习之旅——最后一站LTX之基础和编程接口所包含类的简介

    对LINQ TO SQL的内容讲解将告一段落,下面我们进入LINQ学习之旅的最后一站"LTX",即LINQ TO XML.当前XML技术在应用开发中显得越来越重要,已成为各类数据交 ...

  6. java多线程阶乘_【java学习记录】11.用多线程实现阶乘的计算过程和结果的读取(thread类ReadThread )...

    (源码在上传的压缩包"[java学习记录]11.多线程实现阶乘计算(Thread类和Runnable接口)"中可看到,该压缩包可下载)java * 采用Thread类的子类实现线程 ...

  7. 学计算机手机必备软件,精选推荐:手机电脑里的11类值得分享的“神器”,囊括你工作学习以及生活的方方面面...

    精选推荐:手机电脑里的11类值得分享的"神器",囊括你工作学习以及生活的方方面面 2019-12-04 19:25:38 5点赞 29收藏 1评论 现如今的我们,工作和生活里的方方 ...

  8. AD学习之旅(4)— 新建芯片类原理图库器件

    AD学习之旅(4)- 新建芯片类原理图库器件 一.前言 本文参考: [Altium500问]第006问 IC类器件的元件模型如何创建? [Altium500问]第007问 原理图库中如何使用封装向导快 ...

  9. AD学习之旅(11)— 绘制PCB图

    AD学习之旅(11)- 绘制PCB图 一.前言 当我们把元器件都导入PCB文件后,就可以开始PCB图的绘制了 本文参考:https://www.bilibili.com/video/BV16t411N ...

最新文章

  1. 004-什么是软件测试?软件测试的目的与原则
  2. python如何进行数据抓取_如何进行手机APP的数据爬取?
  3. 【Android 应用开发】Paint 渲染 之 BitmapShader 位图渲染 ( 渲染流程 | CLAMP 拉伸最后像素 | REPEAT 重复绘制图片 | MIRROR 绘制反向图片 )
  4. Linq to sql查询句法
  5. mysql binlog 权限_MySQL如何开启binlog?binlog三种模式的分析
  6. linux内核栈,内核同步,用户空间线程同步
  7. python函数应用实例_【Python 第22课】 函数应用示例
  8. 华为开源构建工具_为什么我构建了用于大数据测试和质量控制的开源工具
  9. 基于上一篇AS项目依赖库问题的优化解决方案
  10. 15.用户故事与敏捷方法——Scrum与用户故事笔记
  11. 在verilog中调用VHDL模块
  12. hdu acm 2569
  13. H5之微信授权登陆 (uniapp网页版微信授权登录)
  14. Google kickstart 2013 Practice Round Captain Hammer 题解
  15. Tomcat启动缓慢 Creation of SecureRandom instance for ... 花费时间过长的解决方法
  16. C++STL accumulate函数
  17. meb备份mysql_恢复使用MEB备份的MySQL数据库
  18. 艺体计算机教师考核细则,艺体教师考核细则.docx
  19. 第三章 人类社会及其发展规律
  20. 蓝桥杯同一类型题目汇总

热门文章

  1. 复习深入笔记01:对象/可变与不可变类型/字符编码/闭包
  2. android 调用c wcf服务,如何使用命名管道从c调用WCF方法?
  3. C语言试题九十二之输入数据有多行,第一行是一个整数n,表示测试用例的个数,后面跟着n行 ,每行包括一个由字母和数字组成的字符串
  4. IOS之学习笔记九(对象的初始化)
  5. Android之面试题精选,自己收藏下
  6. 结构体数组排列_学习RTOS(3)数据结构
  7. 球体表面积原来还可以这么求!
  8. 5部适合学英语的动画电影,快和孩子一起看!
  9. 16张扎心漫画,戳中女生私密日常,每一幕都很真实
  10. 除了PS,原来这个也可以轻松实现图像处理!