总结遇到的不同的初始化方便的知识
- 赋值初始化 直接初始化 列表初始化
例子:
int x = 3.5;
// x 的值为 3(隐式转换)首先分配内存,然后执行赋值。此过程涉及两个步骤:内存分配和赋值操作。
int a(3.5);
// a 的值为 3(隐式转换) 直接初始化可能会比赋值初始化更高效
int b{3.5};
// 错误:不允许窄化转换,编译失败 内存分配和初始化同时发生,并且不允许窄化转换。不匹配的初始化都将导致编译错误,提供更安全的内存管理。
int x = 3; 和 int a(3); 都允许隐式转换,适用于较宽松的初始化。
int a{3}; 提供了更严格的类型检查,防止不必要的类型转换和潜在错误。优先使用列表初始化来增强代码的安全性和可读性。
class MyClass {
public:
MyClass(int value) : data(value) {}
int data;
};
// 使用赋值初始化
MyClass obj1 = 10; // 隐式转换,等同于 MyClass obj1(10);
// 使用直接初始化
MyClass obj2(10); // 明确的直接初始化
// 使用列表初始化
MyClass obj3{10}; // 同样是直接初始化,但更加严格
赋值初始化(=)涉及内存分配和赋值两个步骤,可能会引入隐式转换。
直接初始化(())和列表初始化({})通常更高效,并且列表初始化支持更严格的类型检查,防止隐式转换。
对于数组有:
int arr1[3] = {1, 2, 3}; // 赋值初始化
int arr2[3](1, 2, 3); // 不允许
int arr3[3] {1, 2, 3}; // 列表初始化
- 静态成员的定义与声明
静态成员变量必须在类外部进行定义和初始化
#include <iostream>
class Counter {
public:
static int count;
Counter() {
count++; // 创建实例时增加计数
}
~Counter() {
count--; // 销毁实例时减少计数
}
static int getCount() { // 静态成员函数来访问静态成员
return count;
}
};
// 在类外部定义并初始化静态成员变量
int Counter::count = 0;
int main() {
Counter c1; // count: 1
Counter c2; // count: 2
std::cout << "Current count: " << Counter::getCount() << std::endl;
{
Counter c3; // count: 3
std::cout << "Current count: " << Counter::getCount() << std::endl;
} // c3销毁,count: 2
std::cout << "Current count: " << Counter::getCount() << std::endl;
return 0;
}