网站首页 > 基础教程 正文
我们知道,C和C++因为性能的考量,只对静态/全局变量进行初始化,其它如栈、堆上的数据的初始化时机由程序员自行选择。(静态/全局变量的特权在于其数量少,重要性高)
1 初始化VS赋值
一个数据在定义时就直接设置成某值,就叫“初始化”;而一个数据已经存在后才被设置成某值,叫“赋值”。
2 构造式初始化
使用小括号“()”可以对基本数据类型、有构造函数的类的对象进行构造式初始化。
struct Point{ Point(int a, int b){ x=a;y=b;} int x,y; }; int i(5); Point point(3,4);
3 赋值式初始化
尽管构造式初始化非常有格调,但对于简单变量,更常见的还是采用等号完成初始化:
int i = 5; float f = 12.3F; char c = 'c';
赋值式初始化的限制:
3.1 如果一个对象的构造函数有两个入参呢?赋值式初始化不支持需要多个入参的构造。
3.2 赋值式初始化不支持堆对象的双重初始化:
int* p = new int(5);
3.3 类和结构体的赋值式初始化的具体实现还取决于编译器
struct A{ A(int i){x=i;} int x; };
如果编译器未做优化处理,对于:
A a=5;
编译器会做两步操作:
A tmp(5); // 先构造一个临时对象
A a(tmp); // 再从临时对象复制到目标对象
如果编译器有做优化,则可以一步到位,直接用构造式初始化代替赋值式初始化:
A a(5);
4 列表式初始化
列表式初始化使用大括号{},如:
int main() { struct Point{ Point(int a, int b){ x=a;y=b;} int x,y; }; int i{5}; Point point{3,4}; int arr[5]{1,2,3,4,5}; int* parr = new int [5]{1,2,3,4,5};
一些类的特殊成员在构造函数中初始化时,编译器强制要求使用构造式初始化,称为成员初始化列表,如对象成员、调用基类构造函数初始基类成员、const和引用数据成员。
数量不定的初始化列表:
std::vector<int> vec{23,12,45,56};
5 成员声明式初始化(C++11)
C++11支持类或结构体在数据成员声明时即初始化:
struct Point{ int x = 3; int y = 4; };
-End-
猜你喜欢
- 2024-10-10 C++系列1-1:初探C++ c=2μf
- 2024-10-10 浅谈C++11(第9篇 可变参数模板) c++可变参数模板类
- 2024-10-10 数组的初始化方式有哪几种? 数组的初始化是什么意思
- 2024-10-10 c++对于内建类型的默认初始化 创建内部类的对象
- 2024-10-10 C++类构造函数,如何初始化对象?linux C++第27讲
- 2024-10-10 【C++编程语言】之 类和对象——对象的初始和消除
- 2024-10-10 C++基础语法梳理:引用、封装、继承和多态
- 2024-10-10 C++核心准则?:按照成员声明的顺序定义和初始化成员变量
- 2024-10-10 C++核心准则C.47:按照成员变量声明的次序定义和初始化数据成员
- 2024-10-10 C/C++语言编程系列002——不同情况下数组的初始化方法
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)