显示隐式-》初始化 & 类型转换
变量 显示隐式 初始化:
变量定义(定义包含声明)时会分配内存空间,仅变量声明(extern)不会分配内存
- 显示初始化:在变量定义时为变量提供初始值
- 隐式初始化:否则定义时未初始化,编译器为其默认初始化
隐式初始化:
默认初始化:不提供初始值,当定义变量没有初始化,就会执行默认初始化
- 对于内置变量:
- 全局变量 / static变量 会被隐式初始化为0,指针类型初始为 nullptr
- 类成员变量 & 函数 / 代码块 作用域变量:不能默认初始化,变量的值是未定义的,不能拷贝和访问值
- 对于类对象:
- 默认值为类自定义的初始化方式(构造函数),有些类无需显示初始化,例如string初始为空串。
- 有些类对象则必须显示初始化,如果定义类对象没有初始化,将引发错误
值初始化:只提供数量,不提供显示初始值,元素会执行默认初始化,仅限支持默认初始化的类型
显示初始化:
拷贝初始化:使用a=b号,只能提供一个初始值
直接初始化:使用a(b),只能提供一个初始值。注意:为避免二义性,类内初始化不允许用()形式。但可以用=|{}
元素数量初始化(属于直接初始化):(数量n,初始值)当要多个相同初始值,一般用这种方式
列表初始化:a{b},可以提供0个或多个初始值。 会尽可能把{}内的值当作初始值,无法执行才会考虑其他方式,比如作为容量值。 注意当类型转换存在数据损失的风险,编译器将报错
注意:
无论值初始化还是拷贝初始化,都会发生拷贝
对于const声明的常量,必须显示初始化
类型转换:
隐式转换:
编译器在特定的操作中自动将一个数据类型转换为另一个数据类型的过程
- 当类型不匹配时:先转换,再运算
- 发生情景:
- 基本数据类型转换:
- 函数参数转换:
- 运算符重载:
- 算数类型隐式转换规则:
- 非bool赋值给bool,值为0,bool为false,否则为true
- bool赋值给非bool,bool为false,值为0,否则为1
- 浮点形转换为整形,保留小数点前的部分
- 整形转换为浮点,小数部分为0,有可能损失精度
- 给unsigned type超出范围的值,初始值 %Mod unsigned type的范围总数
- 公式:a%b = a - (a/b) * b = a - a
- 注意:unsigned不能转换为signed,而signed可以转换为unsigned
- 注意:求%(向下取整,向负无穷方向舍入),和取余(向0方向舍入)
- 给signed超出范围的值,结果未定义
- 它使得代码更加简洁,但可能隐藏潜在的问题。
显示转换 / 强制类型转换:
程序员明确地指定要进行的类型转换
- C 风格的强制类型转换:(type)
static_cast<type>(x)
用于进行类型安全的转换。dynamic_cast<type>(x)
用于进行安全的类型转换,尤其是涉及到继承层次结构的情况。它在运行时检查转换是否安全。const_cast<type>(x)
用于添加或移除对象的const
或volatile
属性reinterpret_cast<type>(x)
用于进行低级别的类型转换,例如将一个类型转换为完全不同的类型。它的使用要小心,因为可能导致不可移植和不安全的代码。- 显式转换可以提高代码的可读性和安全性,避免意外的隐式转换。
存储区:
参考
-》-》-》
1.栈区:由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2.堆区:一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
3.全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 。
4.常量区:常量字符串就是放在这里的。 程序结束后由系统释放 。
5.程序代码区:存放函数体的二进制代码。
《-《-《-
原文地址:https://blog.csdn.net/sengyongan/article/details/140585732
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!