UE学习日志#18 C++笔记#4 基础复习4 指派初始化器和指针

devtools/2025/2/2 16:07:39/

1 指派初始化器

        C++20引入了指派初始化器,以使用他们的名称初始化所谓聚合的数据成员。

        聚合类型是满足以下限制的数组类型的对象或结构或类的对象:

        1.仅public数据成员,

        2.无用户声明或继承的构造函数,

        3.无虚函数和无虚基类、private或protected的基类

        指派初始化的顺序必须与声明顺序相同,不允许混合使用指派初始化器和非指派初始化器。未使用指派初始化器初始化的任何数据成员都将使用其默认值进行初始化,这意味着:

        拥有类内初始化器的数据成员会得到该值

        没有类内初始化器的数据成员会被零初始化

例如:

struct Employee{char firstInitial;char lastInitial;int employeeNumber;int salary{75000};
}

用统一初始化语法初始化:

Employee anEmployee{'J','D',42 ,80'000};

使用指派初始化器:

Employee anEmployee{.firstInitial = 'J',.lastInitial = 'D',.employeeNumber= 42,.salary =80'000
};

省略的成员将调用零初始化,而有默认初始化的成员将按其默认值进行初始化。

2 指针

2.1 栈和自由存储区

        C++程序中的内存分为两部分——栈(stack)和自由存储区(free store)。

        自由存储区是与当前函数或栈帧完全独立的内存区域。必须确保释放(删除)在自由存储区上分配的任何内存,这个过程不会自动完成,除非使用了智能指针。

2.2 指针

int* myIntegerPointer;

所声明的变量引用/指向某个整数内存,如上未初始化会指向某个随机位置 

int* myIntegerPointer{nullptr};

空指针是一个特殊的默认值,有效的指针都不含该值,在布尔表达式中使用时会被转换为false

 使用new操作符分配内存:

myIntegerPointer = new int;

使用解引用访问:

 *myIntegerPointer=8;

delete释放内存:

delete myIntegerPointer;
myIntegerPointer = nullptr;

也可以声明指向栈中变量甚至指向其他指针的指针:

int i {8};
int* myIntegerPointer{&i};

C++使用特殊语法处理指向结构体或类的指针:

“->”同时解引用并访问字段

Employee* anEmployee{getEmployee()};
cout<<(*anEmployee).salary<<endl;
//等价于
cout<<anEmployee->salary<<endl;

与指针一起使用:

bool isVaildSalary{(anEmployee!=nullptr && anEmployee->salary > 0 ) }

2.3 动态分配数组

int arraySize{8};
int* myVariableSizedArray{new int[arraySize]};

这种情况下指针变量仍然在栈中,但动态创建的数组在自由存储区中。

释放:

delete[] myVariableSizedArray;
myVariableSizedArray = nullptr;

2.4 const与指针

这两种写法都是无法更改ip指向的值

const int* ip;
ip=new int[10];
ip[4]=5;//Does not compile!int const* ip;
ip=new int[10];
ip[4]=5;//Does not compile!

如果想将ip本身标记为const,而不是他指向的值,需要这样写:

int* const ip{nullptr};
ip=new int[10];//Does not compile!
ip[4]=5;// 也可以初始化指向新分配的内存
int* const ip{new int[10]};

如果想本身和指向的值都标记为const,可以这样:

int const* const ip{nullptr};
const int* const ip{nullptr};


http://www.ppmy.cn/devtools/155479.html

相关文章

GCC之编译(8)AR打包命令

GCC之(8)AR二进制打包命令 Author: Once Day Date: 2025年1月23日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章请查看专栏: Linux实践记录_Once-Day的博客-C…

04树 + 堆 + 优先队列 + 图(D1_树(D7_B+树(B+)))

目录 一、基本介绍 二、重要概念 非叶节点 叶节点 三、阶数 四、基本操作 等值查询(query) 范围查询(rangeQuery) 更新(update) 插入(insert) 删除(remove) 五、知识小结 一、基本介绍 B树是一种树数据结构&#xff0c;通常用于数据库和操作系统的文件系统中。 B树…

论文阅读笔记:VMamba: Visual State Space Model

论文阅读笔记&#xff1a;VMamba: Visual State Space Model 1 背景2 创新点3 方法4 模块4.1 2D选择性扫描模块&#xff08;SS2D&#xff09;4.2 加速VMamba 5 效果5.1 和SOTA方法对比5.2 SS2D和自注意力5.3 有效感受野5.4 扫描模式 论文&#xff1a;https://arxiv.org/pdf/240…

Unbutu虚拟机+eclipse+CDT编译调试环境搭建

问题1: 安装CDT&#xff0c;直接Help->eclipse Market space-> 搜cdt , install&#xff0c;等待重启即可. 问题2&#xff1a;C变量不识别vector ’could not be resolved 这是库的头文件没加好&#xff0c;右键Properties->C Build->Enviroment&#xff0c;增加…

提供算法模型管理、摄像头管理、告警管理、数据统计等功能的智慧园区开源了

智慧园区场景视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。充分利用现有…

51单片机 01 LED

一、点亮一个LED 在STC-ISP中单片机型号选择 STC89C52RC/LE52RC&#xff1b;如果没有找到hex文件&#xff08;在objects文件夹下&#xff09;&#xff0c;在keil中options for target-output- 勾选 create hex file。 如果要修改编程 &#xff1a;重新编译-下载/编程-单片机重…

索引的底层数据结构、B+树的结构、为什么InnoDB使用B+树而不是B树呢

索引的底层数据结构 MySQL中常用的是Hash索引和B树索引 Hash索引&#xff1a;基于哈希表实现的&#xff0c;查找速度非常快&#xff0c;但是由于哈希表的特性&#xff0c;不支持范围查找和排序&#xff0c;在MySQL中支持的哈希索引是自适应的&#xff0c;不能手动创建 B树的…

Python3 【闭包】项目实战:5个新颖的学习案例

Python3 【闭包】项目实战&#xff1a;5个新颖的学习案例 以下是 5个闭包应用项目&#xff0c;涵盖实际场景并附带完整代码、解释和测试案例。 项目1&#xff1a;待办事项列表&#xff08;Todo List&#xff09; 功能&#xff1a;使用闭包管理待办事项的添加、删除和展示。 …