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

C++ 变量二

文章目录

    • 1.变量
      • 1.变量声明与定义的区别
      • 2.作用域与生命周期
        • 1. 作用域分类
        • 2. 生命周期分类
        • 3. 变量的存储类型
        • 4. 变量查找顺序
        • 5. using 声明和指令对查找顺序的影响
      • 2.初始化方式
        • 1.C++ 括号初始化
        • 2.C++ 列表初始化

1.变量

变量是存储数据的容器,需先定义后使用。定义时需指定数据类型和标识符(变量名)。

1.变量声明与定义的区别

1.声明:告诉编译器变量的存在(如extern int x;),不分配内存。
2.定义:为变量分配内存并可初始化(如int x = 0;)。

2.作用域与生命周期

避免变量冲突,合理管理内存。

1. 作用域分类
  • 全局作用域:定义在所有函数和类外部的变量,整个程序可见。
  • 局部作用域:函数、代码块({})或类内部定义的变量,仅在作用域内可见。
  • 命名空间作用域:在namespace中定义的变量。
2. 生命周期分类
  • 自动存储期:局部变量默认为此类型,函数调用时创建,结束时销毁。
  • 静态存储期:使用static或全局变量,程序启动时创建,结束时销毁。
  • 动态存储期:通过new在堆上分配的变量,需手动delete释放。
3. 变量的存储类型
  • auto 自动推导变量类型(C++11 起),如auto x = 10;(推导为int)。
  • static 改变变量的存储位置和生命周期(如静态局部变量、静态类成员)。
  • extern 声明已在其他文件中定义的全局变量,不分配内存。
  • mutable 允许在const对象中修改特定成员变量。
4. 变量查找顺序

按优先级排序
1.局部作用域(函数内、代码块内)
2.外层作用域(逐级向外,直到全局作用域)
3.命名空间作用域(通过限定符或 using 引入)
4.ADL(实参依赖查找)(仅针对函数调用)

5. using 声明和指令对查找顺序的影响
  • using 声明(如using A::x):
    1.将指定命名空间的变量引入当前作用域
    2.优先级等同于当前作用域定义的变量

  • using 指令(如using namespace A):
    1.将命名空间的所有变量纳入查找范围
    2.优先级低于当前作用域,但高于外层作用域。先在当前作用域上找,然后找外层。

2.初始化方式

  • 默认初始化:未显式初始化时,内置类型(如int、double)的值未定义(包含垃圾值),类类型(如string)由默认构造函数初始化。
  • 直接初始化:使用括号或赋值初始化。
  • 列表初始化:使用花括号{},禁止隐式缩窄转换(如浮点数转整数时丢失精度)。 推荐使用。

全局变量和static 内置类型初始化为0.
类的静态内置类型成员变量(如static int)若未显式初始化,会被自动初始化为 0。

1.C++ 括号初始化

1、通过调用构造函数或转换函数来创建对象。
2、不支持 结构体聚合初始化.
3、T obj() 可能被解析为函数声明。
4、对于内置类型,空括号等价于值初始化(初始化为 0)。

2.C++ 列表初始化

1、关键特性 推荐使用

  • 禁止缩窄转换:防止可能导致数据丢失的隐式转换(如浮点数转整数时丢失精度)
  • 支持聚合初始化:直接初始化数组、结构体等聚合类型
  • 明确初始化语义:空列表{}对内置类型强制初始化为 0,对类类型调用默认构造函数

2、举例
当使用空花括号({})进行初始化时:
1.对于类类型(如MyClass):
调用默认构造函数(若未提供,则使用编译器生成的合成默认构造函数)。

2.对于内置类型成员(如int x):
强制初始化为 0(或空指针),无论该成员是否在类定义中显式初始化。

http://www.lqws.cn/news/139789.html

相关文章:

  • c++中char *p指针指向字符串输出问题
  • day46 python预训练模型补充
  • Java八股文——Redis篇
  • CCPC题目
  • Java 创建线程池的几种方式
  • .net jwt实现
  • Linux-linux和windows创建新进程的区别以及posix_spawn
  • ROS 2 环境下使用 Astra Pro 深度相机实现目标距离检测及远程可视化全流程总结
  • 卫星的“太空陀螺”:反作用轮如何精准控制姿态?
  • JavaWeb:前端工程化-ElementPlus
  • Python应用函数的定义与调用(一)
  • 嵌入式分析利器:DuckDB与SqlSugar实战
  • 前端组件推荐 Swiper 轮播与 Lightbox 灯箱组件深度解析
  • 半导体制冷片(Thermoelectric Cooler,TEC)
  • vue封装gsap自定义动画指令
  • JAVA容器
  • BERT vs Rasa 如何选择 Hugging Face 与 Rasa 的区别 模型和智能体的区别
  • 【拓扑】1639.拓扑排序
  • 六种高阶微分方程的特解(原创:daode3056)
  • 近端策略优化(PPO,Proximal Policy Optimization)
  • JavaScript 深入探索:高级应用与前沿技术
  • Java异步编程难题拆解技术
  • MySQL范式和反范式
  • 在 Windows 系统下配置 VSCode + CMake + Ninja 进行 C++ 或 Qt 开发
  • 【力扣】3403. 从盒子中找出字典序最大的字符串 I
  • Java 2D 图形变换方法
  • AI全链路赋能内容创作:电商新势力起飞
  • 让视觉基础模型(VFMs)像大语言模型(LLMs)一样“会思考”​
  • 第八部分:第六节 - 状态管理 (基础):协调多个界面的状态
  • 【Unity】R3 CSharp 响应式编程 - 使用篇(二)