C++新特性 初始化

简介: C++新特性 初始化

本篇来介绍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 的结构体,其中包含两个位域成员变量 aba 占据了8个比特位,默认初始化为11;b 占据了4个比特位,默认初始化为7。

位域是一种在C++中对数据进行精确控制的方法,可以指定成员变量所占用的比特位数。通过限定比特位数,可以节省内存空间,并且可以对取值范围进行约束。

需要注意的是,使用位域时要小心数据溢出问题。由于 ab 所占据的比特位数不同,其能够表示的最大值也不同。如果将超出可表示范围的值赋给位域变量,则可能导致溢出或未定义行为。

列表初始化:

传统初始化方法:

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++类型的新特性就介绍到这里了 在这里小编推荐一个课程:

https://xxetb.xetslk.com/s/2PjJ3T

相关文章
|
1月前
|
编译器 程序员 定位技术
C++ 20新特性之Concepts
在C++ 20之前,我们在编写泛型代码时,模板参数的约束往往通过复杂的SFINAE(Substitution Failure Is Not An Error)策略或繁琐的Traits类来实现。这不仅难以阅读,也非常容易出错,导致很多程序员在提及泛型编程时,总是心有余悸、脊背发凉。 在没有引入Concepts之前,我们只能依靠经验和技巧来解读编译器给出的错误信息,很容易陷入“类型迷路”。这就好比在没有GPS导航的年代,我们依靠复杂的地图和模糊的方向指示去一个陌生的地点,很容易迷路。而Concepts的引入,就像是给C++的模板系统安装了一个GPS导航仪
105 59
|
1月前
|
存储 编译器 数据安全/隐私保护
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解2
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解
31 3
|
1月前
|
编译器 C++
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解1
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解
46 3
|
1月前
|
存储 编译器 C++
【C++】面向对象编程的三大特性:深入解析多态机制(三)
【C++】面向对象编程的三大特性:深入解析多态机制
|
1月前
|
存储 编译器 C++
【C++】面向对象编程的三大特性:深入解析多态机制(二)
【C++】面向对象编程的三大特性:深入解析多态机制
|
1月前
|
编译器 C++
【C++】面向对象编程的三大特性:深入解析多态机制(一)
【C++】面向对象编程的三大特性:深入解析多态机制
|
1月前
|
编译器 C++
【C++】深入探索类和对象:初始化列表及其static成员与友元(三)
【C++】深入探索类和对象:初始化列表及其static成员与友元
|
30天前
|
C++
C++ 20新特性之结构化绑定
在C++ 20出现之前,当我们需要访问一个结构体或类的多个成员时,通常使用.或->操作符。对于复杂的数据结构,这种访问方式往往会显得冗长,也难以理解。C++ 20中引入的结构化绑定允许我们直接从一个聚合类型(比如:tuple、struct、class等)中提取出多个成员,并为它们分别命名。这一特性大大简化了对复杂数据结构的访问方式,使代码更加清晰、易读。
32 0
|
1月前
|
C++
C++构造函数初始化类对象
C++构造函数初始化类对象
21 0
|
1月前
|
存储 编译器 C++
【C++】面向对象编程的三大特性:深入解析继承机制(三)
【C++】面向对象编程的三大特性:深入解析继承机制