#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
Preview:
downloadDownload PNG
downloadDownload JPEG
downloadDownload SVG
Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!
Click to optimize width for Twitter