本篇来介绍C++非静态成员数据默认初始化和列表初始化(注意 列表初始化不是初始化列表 两者不一样)
1.什么是静态成员数据?
静态成员数据 static ....
非静态成员数据 就是不加static数据 生命周期也是比static类数据短的
在C++11以前只有类型为整型或者枚举类型的常量数据成员才能默认初始化 C++11以后 开始声明非静态数据成员的同时可以直接使用等号或者大括号进行初始化(非静态成员数据默认初始化)
2.非静态成员数据的默认初始化(见左图)
这里很好的说明了非静态成员数据的默认初始化可以很好的解决代码的冗余问题 直接在变量声明的时候初始化 能提高代码的质量
2.初始化优先级
当同时存在初始化列表和默认初始化时 初始化列表的优先级更高
#include<bits/stdc++.h> using namespace std; class A { public: A():a(1) { cout << a << endl;//1 } private: int a=0; }; int main() { A a; }
3.位域的默认初始化
位域的概念
在C++中,位域的概念与C语言类似,用于对结构体或类的成员变量进行位级别的精确控制。通过使用位域,可以指定每个成员变量所占据的位数,并灵活地管理存储空间。定义位域的语法如下:
struct Flags { bool flag1 : 1; // 占据一个比特位 int flag2 : 3; // 占据三个比特位 unsigned int flag3 : 8; // 占据八个比特位 };
位域的默认初始化具体代码实例
#include <iostream> using namespace std; struct s { int a : 8 = 11; int b : 4 = 7; }; int main() { s myStruct; cout << "a: " << myStruct.a << endl; // 输出: a: 11 cout << "b: " << myStruct.b << endl; // 输出: b: 7 return 0; }
代码说明
这段代码定义了一个名为
s
的结构体,其中包含两个位域成员变量a
和b
。a
占据了8个比特位,默认初始化为11;b
占据了4个比特位,默认初始化为7。位域是一种在C++中对数据进行精确控制的方法,可以指定成员变量所占用的比特位数。通过限定比特位数,可以节省内存空间,并且可以对取值范围进行约束。
需要注意的是,使用位域时要小心数据溢出问题。由于
a
和b
所占据的比特位数不同,其能够表示的最大值也不同。如果将超出可表示范围的值赋给位域变量,则可能导致溢出或未定义行为。
列表初始化:
传统初始化方法:
1.使用括号初始化的方法是直接初始化
2.使用等号初始化的方法是拷贝初始化
列表初始化采用{}的方法 一次性初始化多个值 常常用于STL标准容器类里面
代码实例:
vector<int> a = { 1,2,2,3,4,5 };//列表初始化
隐式缩窄转换:
隐式缩窄转换(Implicit Narrowing Conversion)指的是将一个类型的值赋给另一个较窄的类型时发生的自动转换。
在C++中,有些类型之间可以进行隐式的转换,例如将整数类型赋给较小范围的整数类型。然而,如果被赋值的值超出了目标类型能够表示的范围,就会发生隐式缩窄转换。 通俗的来说就是高类型转换成为低类型 如 int--->char
列表初始化不支持隐式缩窄转换
int x=1;
char c=x;
char d{x};//error 列表初始化不支持强类型转换成弱类型
C++20 指定初始化 以下代码为格式:
//三相比较运算符 #include<bits/stdc++.h> using namespace std; struct s { int point1; int point2; }; int main() { s p{ .point1 = 1,.point2 = 2 }; }
注意禁止对数组使用禁止初始化 但是可以使用列表初始化
好了 本篇对C++类型的新特性就介绍到这里了 在这里小编推荐一个课程: