当前位置: 首页 > news >正文

static和const

static成员变量:

  • static 成员变量必须在类声明的外部初始化,具体形式为

type class::name = value;(注意没有static关键字,仅仅在类中声明的时候加上static

  • type 是变量的类型,class 是类名,name 是变量名,value 是初始值。将上面的 m_total 初始化:

int Student::m_total = 0;

  • 静态成员变量在初始化时不能再加 static,但必须要有数据类型。被 private、protected、public 修饰的静态成员变量都可以用这种方式初始化。
  • 注意:static 成员变量的内存既不是在声明类时分配,也不是在创建对象时分配,而是在(类外)初始化时分配。反过来说,没有在类外初始化的 static 成员变量不能使用。
  • 静态成员变量既可以通过对象名访问,也可以通过类名访问,但要遵循 privateprotected public 关键字的访问权限限制。当通过对象名访问时,对于不同的对象,访问的是同一份内存

const成员变量和成员函数:

const 成员变量的用法和普通 const变量的用法相似,只需要在声明时加上 const 关键字。初始化 const 成员变量只有一种方法,就是通过参数初始化表。

 

const成员函数可以使用类中的所有成员变量,但是不能修改它们的值,这种措施主要还是为了保护数据而设置的。const 成员函数也称为常成员函数。

需要注意的是,必须在成员函数的声明和定义处同时加上 const关键字。char *getname() const和char *getname()是两个不同的函数原型,如果只在一个地方加 const会导致声明和定义处的函数原型冲突。

 

const 对象只能访问conast成员函数。

普通成员变量没有限制,但是不能修改其中的数值

可以访问static成员函数和成员变量。(但是可以修改静态成员变量)

 

 

const 可以修饰成员变量

const 可以修饰成员函数

const 可以修饰对象

const 可以修饰函数参数

 

修饰成员函数时,放在函数后面就是常量函数。

常量函数的作用:只能访问不能修改成员函数。

 

 

常量对象只能访问常量函数。

非常量对象既可以访问常量成员函数也可以访问非常量成员函数。 重载时访问非常量。

 


staticconst比较:

1、初始化

static成员变量必须外部初始化,不要static关键字

const只能通过构造函数的初始化列表初始化

 

2、修饰成员函数时候。

常函数只能访问成员函数,不能修改,但是可以修改静态成员函数。

static成员函数只能访问static成员变量。(具体原因是因为static是属于类的,他供所有类的对象都可以访问,所以不可能有某个对象的this指针,因此只能访问static成员变量)

 

3、二者都遵循privtaeprotected的屏蔽原则

 

相关文章:

  • 友元函数
  • 函数模板定义
  • 类模板定义+用类模板写一个入栈出栈的程序
  • 模板的全特化与偏特化
  • cout
  • cin
  • C++文件输入输出流+输入输出二进制文件(自定义对象)
  • 多态定义
  • 函数重载/遮蔽/隐藏
  • 纯虚函数和抽象类
  • 应用程序主窗体
  • 串口通讯中出现的错误(1)
  • 鼠标事件(鼠标的各种处理事件)
  • 键盘事件(按下CTRL+M 最大化窗口)
  • 定时器事件和随机数(示例代码)
  • 【译】JS基础算法脚本:字符串结尾
  • 【前端学习】-粗谈选择器
  • ES6--对象的扩展
  • Java 内存分配及垃圾回收机制初探
  • JavaScript HTML DOM
  • Linux CTF 逆向入门
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • 今年的LC3大会没了?
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 前端js -- this指向总结。
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 我感觉这是史上最牛的防sql注入方法类
  • 一些关于Rust在2019年的思考
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • # .NET Framework中使用命名管道进行进程间通信
  • # 计算机视觉入门
  • ###C语言程序设计-----C语言学习(6)#
  • #QT(TCP网络编程-服务端)
  • ${ }的特别功能
  • (3)STL算法之搜索
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (八十八)VFL语言初步 - 实现布局
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (二)linux使用docker容器运行mysql
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (三) diretfbrc详解
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (已解决)什么是vue导航守卫
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .Net - 类的介绍
  • .net Stream篇(六)