(23条消息) 零初始化_最后冰吻free的博客-CSDN博客

PHOTO EMBED

Thu Nov 24 2022 06:08:42 GMT+0000 (Coordinated Universal Time)

Saved by @leawoliu

#include <iostream>
#include <string>
#include <vector>

/*  零初始化
    build-in type:内置类型初始化,我们知道局部作用域内置类型未初始化会出现
    无法预料问题

*/
// 像int、double、指针等类型没有默认的构造函数,因此不会被初始化一个有意义的值
// 任何未被初始化的局部变量都是未定义的值
void func(){
    int a;
    double b;
    int* ptr;
}

// 因此在定义模板时,若让一个模板参数类型定义的变量初始化成一个默认值,简单的定义是无法
// 做到的,因为内置类型无法被初始化
template<typename T>
void func(){
    T t; // T若是内置类型,t无法被初始化,值未定义
}

// 对于内置类型最好显示调用默认构造函数来将它们初始化为0(bool-false,ptr-nullptr)
// 值初始化-要么调用对象已有构造函数,要么用0初始化

struct MyClass;

template<typename T>
void zero_init() {
    T t{}; // 在c11之前确保一个对象初始化方式是T t = T();

    if (!std::is_same_v<T, MyClass>) {
        std::cout<<std::boolalpha<<t<<std::endl;
    }
    else {
        std::cout<<std::boolalpha<<t<<std::endl;
    }
}

struct MyClass{
    friend std::ostream&  operator<<(std::ostream& os, MyClass& c) {
        return os<<c.a;
    }
    int a;
};


void Test(){
    zero_init<int>(); // 0
    zero_init<bool>(); // false
    zero_init<nullptr_t>(); // nullptr;
    zero_init<MyClass>();
}

// 花括号初始化的情况,如果没有可用的默认构造函数,它还可以使用列表
// 初始化构造函数(initialize-list constructor)
template<typename T>
struct MyClass1{
    MyClass1():t{} {

    }

    T t;
};

template<typename T>
struct MyClass2{
    MyClass2(): t(){} // c11之前使用()初始化t
    T t;
};

template<typename T>
struct MyClass3{
    T t{}; // c11之后可以对非静态成员变量进行就地初始化;
};


// 注意点: 不能使用{}对默认参数进行初始化
// template<typename T>
// void func_default(T t{}) { // error

// }
// 可以使用T()进行默认参数初始化
template<typename T>
void func_default(T t = T()){ // ok
    std::cout<<t<<std::endl;
}

void Test1(){
    MyClass1<int> m;
    std::cout<<m.t<<std::endl; // 0

    MyClass1<int> m1;
    std::cout<<m1.t<<std::endl;// 0

    MyClass1<int> m2;
    std::cout<<m2.t<<std::endl;// 0

    func_default<int>(); // 0
}
int main()
{
   Test();
   Test1();
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
content_copyCOPY

https://blog.csdn.net/CodeHouse/article/details/126439469