C++之static

C++ static 重要知识点

  • 1.静态成员变量
    • 定义
  • 2.静态成员函数
  • 3. 静态成员经典应用 – 单例模式

1.静态成员变量

定义

静态成员:被static修饰的成员变量(成员函数);
只占用一份内存。
静态成员变量必须初始化

  • 如何访问?

答:可以通过对象(对象.静态成员)、对象指针(对象->静态成员)、类访问(类名::静态成员

  • 静态成员变量

答:
1.存储在数据段(全局区,类似于全局变量),整个程序运行过程中只有一份内存
2.必须初始化,必须在类外面初始化,初始化时不能带static,如果类的声明和实现分离(在实现.cpp中初始化)
3.对比全局变量,它可以设定访问权限(public、 protected、 private),达到局部共享的目的

  • 怎么初始化静态成员变量?

必须在类外面初始化静态成员变量;
静态成员变量是不依赖于类存在的,只占用一份内存。

class Car {
public:
	static int m_price;
};

// 在类外面初始化成员变量
int Car::m_price = 0;
  • 访问静态成员代码:
int main() {
// 对象访问
	Car car1;
	car1.m_age = 1;
	car1.m_price = 2;

	Car car2;
	car2.m_price = 200;

	Car car3;
	car3.m_price = 300;
// 指针访问
	Car *p = new Car();
	p->m_price = 400;
	delete p;
// 类名直接访问
	cout << Car::m_price << endl;

	getchar();
	return 0;
}

2.静态成员函数

  • 访问(和访问静态成员变量一样):
Car car;
car.run(); // 对象

Car *p = &car;
p->run(); // 指针

Car::run(); // 直接通过类
  • 静态成员函数

1.内部不能使用this指针(this指针只能用在非静态成员函数内部)
2.不能是虚函数(虚函数只能是非静态成员函数)
3.静态成员函数内部不能访问非静态成员变量\函数,只能访问静态成员变量\函数
4.非静态成员函数内部可以访问静态成员变量\函数
5.构造函数、析构函数不能是静态(构造和析构只能通过对象去调用,所以不能是静态)
6.当声明和实现分离时,实现部分不能带static
7.可以直接访问静态成员函数,这样可以不创建对象,直接去访问静态成员函数。

3. 静态成员经典应用 – 单例模式

单例模式:设计模式的一种,保证某个类永远只创建一个对象;
步骤:
1.构造函数\析构函数私有化
2.定义一个私有的static成员变量指向唯一的那个单例对象
3.提供一个公共的访问单例对象的接口

  • 构造函数/析构函数私有化
class Rocket {
private:
	Rocket() {}
	~Rocket() {}
};
  • 定义一个私有的static成员变量指向唯一的那个单例对象
class Rocket {
private:
	Rocket() {}
	static Rocket *ms_rocket; // 静态成员变量记得初始化!
	~Rocket() {}
public:

};

Rocket *Rocket::ms_rocket = NULL; // 初始化静态成员变量

  • 提供一个公共的访问单例对象的接口
class Rocket {
private:
	Rocket() {}
	static Rocket *ms_rocket; // 静态成员变量记得初始化!
	~Rocket() {}
public:
// 携程静态成员函数,外面想要用Rocket创建对象的话,调用sharedRocket,
	static Rocket *sharedRocket() {
			// 这里要考虑多线程安全
			if (ms_rocket == NULL) {
				// 在堆空间申请一个内存,去访问
				ms_rocket = new Rocket();
			}
			return ms_rocket;
		}
};

Rocket *Rocket::ms_rocket = NULL; // 初始化静态成员变量

int main() {
	Rocket *p = Rocket::sharedRocket();
}

注解:这里就是说只有第一次访问的时候是有效的,后面都会直接 return ms_rocket
这样就能保证Rocket类只能创建一个对象(创建对象写在了 private 中)

public:
// 携程静态成员函数,外面想要用Rocket创建对象的话,调用sharedRocket,
	static Rocket *sharedRocket() {
			// 这里要考虑多线程安全
			if (ms_rocket == NULL) {
				// 在堆空间申请一个内存,去访问
				ms_rocket = new Rocket();
			}
			return ms_rocket;
		}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/606919.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UE和three.js的区别

UE&#xff08;Unreal Engine&#xff09;和three.js都是用于创建3D图形的软件平台&#xff0c;但它们在功能、目标和应用场景方面存在一些差异。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 功能 UE 是一款功能全面的3D游戏引擎&…

03-单片机商业项目编程,从零搭建低功耗系统设计

一、本文内容 上一节《02-单片机商业项目编程&#xff0c;从零搭建低功耗系统设计-CSDN博客》引出了伪时间片的概念&#xff0c;这也是再低功耗系统设计中必须使用的程序设计逻辑&#xff0c;本文着重来讲解如何利用伪时间片来设计伪多任务&#xff0c;以及伪时间片多任务内核设…

力扣刷题第1天:消失的数字

大家好啊&#xff0c;从今天开始将会和大家一起刷题&#xff0c;从今天开始小生也会开辟新的专栏。&#x1f61c;&#x1f61c;&#x1f61c; 目录 第一部分&#xff1a;题目描述 第二部分&#xff1a;题目分析 第三部分&#xff1a;解决方法 3.1 思路一&#xff1a;先排序…

私人健身教练预约管理小程序开发源码现成案例(小程序+APP+H5 源码部署)

一、私人健身教练预约管理系统-环境介绍 1.1 私人健身教练预约管理系统-运行环境 开发语言&#xff1a;PHP 数据库&#xff1a;MySQL 系统架构&#xff1a;TP 后端&#xff1a;SpringBoot 前端&#xff1a;Vue 2. 私人健身教练预约管理系统-系统介绍。 2.1私人健身教练预约管…

手机传输助手有哪些?如何快速互传文件?

手机已经成为我们生活和工作中不可或缺的一部分&#xff0c;而手机传输助手&#xff0c;作为一种帮助我们在不同设备之间快速、方便地共享文件的工具&#xff0c;其重要性不言而喻。无论是在工作中需要将文件从电脑传输到手机&#xff0c;还是在生活中想要与朋友分享美好的瞬间…

FFmpeg常用命令详解与实战指南

下载地址&#xff1a;Releases BtbN/FFmpeg-Builds (github.com) 1. 获取视频信息 使用FFmpeg获取视频信息是最基本的操作之一。你可以使用-i选项指定输入文件&#xff0c;然后使用FFmpeg内置的分析器来获取视频的各种信息&#xff0c;包括视频编解码器、音频编解码器、分辨…

2.外卖点餐系统(Java项目 springboot)

目录 0.系统的受众说明 1.系统功能设计 2.系统结构设计 3.数据库设计 3.1实体ER图 3.2数据表 4.系统实现 4.1用户功能模块 4.2管理员功能模块 4.3商家功能模块 4.4用户前台功能模块 4.5骑手功能模块 5.相关说明 新鲜运行起来的项目&#xff1a;如需要源码数据库…

封装一个可以最小化和展开的弹窗组件

gl-dialog 大概思路&#xff1a; 在弹窗组件内部引入gl-dialog-collapse&#xff0c;这个组件主要用于存储已经被最小化的弹窗&#xff08;基础数据&#xff09; 弹窗内部的数据如何在父组件拿到是通过作用域插槽来实现的 gl-dialog接收一个tempData这个数据会在内部被记录下来…

IDEA远程连接Docker服务

1.确保你的服务器已经安装docker docker安装步骤可查看&#xff1a;CentOS 9 (stream) 安装 Docker 2.安装完docker后开启远程连接 默认配置下&#xff0c;Docker daemon只能响应来自本地Host的客户端请求。如果要允许远程客户端请求&#xff0c;需要在配置文件中打开TCP监听…

【数据结构】栈(Stack)和队列(Queue)

文章目录 栈一、栈的概念及结构二、栈的特点三、栈的实现1.初始化栈2.判断栈空3.入栈4.出栈5.取栈顶元素6.栈的元素个数7.销毁 队列一、队列的概念及结构二、队列的特点三、队列的实现1.初始化2.入队3.出队4.判断队空5.取队头元素6.取队尾元素 总结 栈 一、栈的概念及结构 栈…

k8s 理论知识基本介绍

目录 一 k8s 理论前言 &#xff08;一&#xff09;微服务是什么 1&#xff0c;应用场景 2&#xff0c;API 是什么 &#xff08;二&#xff09;&#xff0c;微服务 如何做版本迭代 1. Docker镜像构建 2. 版本标记 3. Docker Registry 4. 环境一致性 5. 滚动更新…

26 | 备库为什么会延迟好几个小时?

在官方的 5.6 版本之前,MySQL 只支持单线程复制,由此在主库并发高、TPS 高时就会出现严重的主备延迟问题。 coordinator 就是原来的 sql_thread, 不过现在它不再直接更新数据了,只负责读取中转日志和分发事务。真正更新日志的,变成了 worker 线程。而 work 线程的个数,就是…

今日刷三题(day12):兑换零钱(一)+最长回文子串+编辑距离(一)

题目一&#xff1a;兑换零钱&#xff08;一&#xff09; 题目描述&#xff1a; 给定数组coins&#xff0c;coins中所有的值都为正整数且不重复。每个值代表一种面值的货币&#xff0c;每种面值的货币可以使用任意张&#xff0c;再给定一个aim&#xff0c;代表要找的钱数&…

单位圆内的正交向量多项式,第一部分:由Zernike多项式的梯度导出的基组

clear all; close all; clc; %% I1=double(imread(E:\zhenlmailcom-E8E745\华为家庭存\image\imgs\right\0.bmp)); I2=double(imread(E:\zhenlmailcom-E8E745\华为家庭存储\.法\image\imgs\right\1.bmp)); I3=double(imread(E:\zhenlmailcom-E8E745\华为家庭存储\.p\image\imgs…

学习torchmd分子动力学模拟

TorchMD打算提供一种简单易用的API&#xff0c;用于使用PyTorch进行分子动力学。这使研究人员能够更快地进行力场开发研究&#xff0c;并以PyTorch的简单性和强大性将神经网络潜力无缝集成到动力学中。 TorchMD使用与经典MD代码&#xff08;如ACEMD&#xff09;一致的化学单位&…

实在Agent智能体:引领智能自动化新纪元

在数字化转型的浪潮中&#xff0c;实在智能科技有限公司凭借其前沿技术&#xff0c;推出了实在Agent智能体——一款革命性的超自动化智能体。它不仅代表了人工智能技术的新高度&#xff0c;更预示着未来工作方式的变革。 什么是实在Agent智能体&#xff1f; 实在Agent智能体是…

《Fundamentals of Power Electronics》——状态空间平均法

文献中出现了许多交流变换器建模技术&#xff0c;包括电流注入法、电路平均法和状态空间平均法。尽管给定方法的支持者可能更喜欢用特定形式表示最终结果&#xff0c;但几乎所有方法的最终结果都是等效的。所有人都会赞同&#xff0c;平均和小信号线性化是PWM变换器建模的关键步…

云动态摘要 2024-05-06

给您带来云厂商的最新动态&#xff0c;最新产品资讯和最新优惠更新。 最新优惠与活动 [免费试用]即刻畅享自研SaaS产品 腾讯云 2024-04-25 涵盖办公协同、营销拓客、上云安全保障、数据分析处理等多场景 云服务器ECS试用产品续用 阿里云 2024-04-14 云服务器ECS试用产品续用…

用得助全媒体呼叫中心,让AI落到实处帮品牌做营销

怎么让人工智能落到实处的帮助到我们&#xff1f;我们今天来讲讲中关村科金得助全媒体呼叫中心是怎么让AI帮品牌。 这次聊的案例是知名的护肤品牌&#xff0c;该品牌在中国功能性护肤品市场占有率达到20.5%&#xff0c;这么高的市场占有率客户的咨询量也是非常庞大的&#xff0…

MAC M1 配置 Git SSH

背景 换了新笔记本&#xff0c;本地想要克隆github 上的项目需要配置ssh 公钥到自己的github账户中&#xff0c;否则使用ssh 地址克隆会报错&#xff0c;如下。 gitgithub.com: Permission denied (publickey). fatal: Could not read from remote repository.操作 1. 生成s…
最新文章