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

C++学习笔记02 static关键字

一、类内static 和 类外(全局)static

  1. class 和 struct 内 (此类或此struct的所有实例公共可见)
  2. class 和 struct 外 (只在当前编译单元可见 xxx.obj)

(1)Main.cpp

#include<iostream>
int s_Variable = 10;
int main(){std::cout << s_Variable << std::endl;
}

(2)Static.cpp

  1. static int s_Variable = 8; //类似于class的private变量,➕️static 后属于当前.obj文件的private变量
  2. int s_Variable = 8; //项目全局变量,不仅限于当前.obj文件
static int s_Variable = 8; //✅️
int s_Variable = 8;  //❌️ 

当Static.cpp的 同名变量s_Variable 为 static时,只在当前 编译单元Static.cpp可见,编译通过 ✅️
当为非static时,是全局变量,所有编译单元可见❌️
"int s_Variable" (?s_Variable@@3HA) already defined in Main.obj

1. extern 防止全局(类外)非static变量多处定义

修正方式:
去掉Main.cpp中的 = 10赋值操作,并在前面加extern 关键字, 这被称为:external linkage 或者 external linking

#include<iostream>
extern int s_Variable;
int main(){std::cout << s_Variable << std::endl;
}

此时,虽然没有 import Static.cpp,但是仍然能打印出 s_Variable的值

2. 类外(全局)非static变量不可以被多处import

在Header中定义的全局变量(未加static),如果被多个.cpp文件引用,报错。#include的原理是复制粘贴代码,所以被不同的地方定义了多次,报错

Header.h
#pragma once
int a = 10;//Main.cpp
import "Header.h"//Static.cpp
import "Header.h"

3. 类内静态属性需要在struct和lclass外声明,方法不需要

#include<iostream>struct Entity {static int x;static int y;static void print() {std::cout << x << " , " << y << std::endl;}
};//struct 和 class 静态属性需要在struct 和 class 外声明,否则报错,而 静态方法则不需要在类外声明
int Entity::x;
int Entity::y;int main() {Entity a;Entity::x = 3;Entity::y = 4;//Entity b = { 5, 6 };Entity b;Entity::x = 5;Entity::y = 6;Entity::print();Entity::print();std::cin.get();
}

二、Local static

1. 局部static变量示例

局部静态变量,可以在方法里,可以在if else while 分支里,
生命周期和类中static变量的生命周期一致,只是使用的scope被局限了

#include<iostream>void Function() {static int i = 0;i++;std::cout << i << std::endl;
}
int main() {Function();Function();Function();Function();std::cin.get();
}

2. 单例模式类作用域静态变量实现

#include<iostream>
//使用全局静态变量实现单例
class Singleton {
private:static Singleton* s_singleton;
public:static Singleton& getInstance() {return *s_singleton;}void print() {std::cout << "hello world" << std::endl;}
};
//必须写,否则编译报错
Singleton* Singleton::s_singleton = nullptr;int main() {Singleton s = Singleton::getInstance();s.print();std::cin.get();
}

3. 单例模式本地作用域静态变量实现

#include<iostream>
class Singleton {
public:static Singleton& getInstance() {static Singleton s_singleton;return s_singleton;}void print() {std::cout << "hello world" << std::endl;}
};int main() {Singleton s = Singleton::getInstance();s.print();std::cin.get();
}
http://www.jsqmd.com/news/71684/

相关文章:

  • 深入解析:STM32外设学习-串口数据包笔记-(程序)
  • 告别臃肿:为什么 Drizzle ORM 是 TypeScript 后端的未来?
  • 保存文件带上时间蹉
  • 为什么我们需要使用react提供的ChildrenAPI而不是 JavaScript 的 map?
  • 医用/低速/生物制药/血站/大容量/微量高速/血库/自动/低温冷冻/国产离心机厂家排名 2025:实力厂家、优质品牌及选购技巧 - 品牌推荐大师
  • 暂时修复龙芯+深度 25Lazarus安装lazreport的lr_dialogdesign.lpk后Lazarus程序无法启动的Bug(完善的处理方法)
  • doker批量停用和删除容器命令
  • centos7创建swap linux创建swap 创建swap
  • windriver 第10章:PCI高级功能
  • 国产替代实验室离心机实力厂家推荐:四川蜀科、湖南凯达、美瑞克仪器 - 品牌推荐大师
  • 2025年高低温试验箱国内哪家好哪家性价比高?国产高低温试验箱制造商/生产商/供应商推荐 - 品牌推荐大师
  • 接触角测量仪品牌与型号大盘点:科研与便携式、高温真空/压力专用推荐 - 品牌推荐大师1
  • 2025年北京合同审查工具服务推荐:合同审查工具哪个好? - mypinpai
  • 2025年窑湖小镇周边亲子农家乐、团建农家乐推荐:五大热门选 - 工业推荐榜
  • 泰克示波器差分探头偏置校准:完整操作指南
  • 医用/低速/生物制药/血站/大容量/微量高速/国产离心机哪个品牌好?实力厂家推荐与选购建议指南 - 品牌推荐大师
  • 2025中国别墅入户门十大品牌权威榜:深度解析与选购指南 - 匠子网络
  • IDEA中创建Spring Boot项目兼容JDK8的解决方案
  • 医用/低速/生物制药/血站/大容量/国产离心机哪家强?2025 年头部企业及优质品牌全方位对比 - 品牌推荐大师
  • 医用/低速/生物制药/血站/大容量/微量高速/血库/自动/国产离心机优质品牌有哪些?头部企业及高口碑厂家推荐 - 品牌推荐大师
  • 医用/低速/生物制药/血站/大容量/微量高速/国产离心机推荐品牌 TOP3:3大品牌及靠谱生产商盘点 - 品牌推荐大师
  • 国产盐雾腐蚀试验箱哪家好,推荐实力厂家|生产商 - 品牌推荐大师
  • 2025全球力传感器品牌价值榜——高精度测量领域十大金牌供应商技术解密 - 品牌推荐大师1
  • 医用/低速/生物制药/血站/大容量/微量高速/血库/自动/国产离心机推荐厂家怎么选?质量过硬的实力生产商榜单 - 品牌推荐大师
  • 剑指offer-49、把字符串转换成整数
  • 详细介绍:基于DBLE的MySQL分库分表实践:部署与核心场景实现
  • 2025年度中国铝合金精密管材厂家推荐:专业的铝合金精密管材 - mypinpai
  • 2025年杭州艺术学校美术考试录取人数TOP5合作画室推荐: - myqiye
  • 2025年杭州艺术学校美术专业招生机构TOP5推荐:杭州艺术 - 工业品牌热点
  • 2025年窑湖小镇附近团建农家乐TOP5推荐:窑湖小镇周边美 - 工业推荐榜