前言
这两周的任务做测试,实质就是熟悉设备调试环境,晚上时间在杂书及《北平无战事》上面花费比较多,周末也都有了骑行活动安排,学习上面自然稍微拖了后腿。废话不多说,继续基础知识。
类的初始化
类的初始化两种:显示初始化表、调用构造函数。
显示初始化优缺点:
- 显示初始化只能被应用在所有数据成员都是public的类对象上;
- 显示初始化是根据数据成员被声明的顺序来解析,增加意外与错误的可能性;
- 通过显示初始化,用常量值给大型数据结构直接赋值比较有效;
构造/析构函数
1,构造函数不能用const或volatile关键字来声明;
2,explicit修饰符用来通知编译器禁止提供隐式转换;
3,如果未声明构造函数,所有类成员又都是公有的,那么:
- 类的普通对象声明都不会完成初始化;
- 类对象声明为静态时,则初始化为0;
- 局部定义或动态分配的对象会被一个随机值初始化;
4,非public构造函数的主要用处:
- 防止用一个类的对象向该类另一个对象作拷贝;
- 指出只有当一个类在继承层次中被用作基类,而不能直接被应用程序操纵时,构造函数才能被调用;
5,拷贝构造函数,当一个类对象初始化该类另一个对象时,该函数会被调用;
6,拷贝构造函数有一个指向类对象的引用作为形式参数,传统上被声明为const;
7,如果没有声明拷贝构造函数的实例,则执行缺省的按成员初始化;
8,析构函数是构造函数的互补,它为生命期即将结束的类对象返还相关的资源或者自动释放资源;
9,在程序执行的初始化阶段和收尾阶段,全局类对象调用它们自己的构造函数和析构函数;
10,当类对象的指针或引用离开域时(被引用的对象还没有结束生命期),析构函数不会被调用;
11,new操作符允许我们在一个特定的、预分配的内存地址上构造一个类对象;
12,显示调用析构函数,底层的预分配存储区可以被后面的定位new操作符继续使用;
13,释放类对象数组,必须在delete操作符和被删除的对象的地址之间加上一个空的方括号;
14,类对象的vector在结果上等同于类对象的数组,但初始化vector代价比较大:临时对象的构造和析构以及拷贝构造函数往往比缺省构造函数计算上更复杂
15,一般的设计原则:类对象的vector仅仅最适合于元素的插入操作,即定义一个空的vector;
16,成员初始化表只提供该类数据成员的初始化,在构造函数体内对数据成员设置值是一个赋值操作;
PS:
在概念上,构造函数的执行过程被分成两个阶段:1)隐式或显式初始化阶段;2)一般的计算阶段;
- 初始化阶段可以是显式的或隐式的,取决于是否存在成员初始化表。隐式初始化阶段按照声明的顺序依次调用所有基类的缺省构造函数,然后是所有成员类对象的缺省构造函数;
- 一般的计算阶段由构造函数体内的所有语句构成,数据成员的设置被认为是赋值而不是初始化;
17,在初始化表中出现或者在被隐式初始化的成员类对象中的成员,总是在构造函数体内成员的赋值之前被初始化;
18,对于非类类型数据成员的初始化或赋值,除了const和引用数据成员,在结果和性能上都是等价的;
19,const和引用数据成员必须是在成员初始化表中被初始化,否则就会产生编译时刻错误;
20,每个成员在成员初始化表中只能出现一次,初始化的顺序不是由名字在初始化表中的顺序决定,而是由成员在类中被声明的顺序决定的;
总结
类的初始化,主要是学习对初始化成员表的使用。然后学习过程中,了解构造函数的执行过程分为初始化与赋值两个阶段的概念,这个概念对我来说是比较新颖的。上面这些内容重点是在补基础,借助C++进行面向对象内容的学习,后续开始重载、类模版之类的知识。
参考资料
《C++ Primer》
本文探讨了C++中类的初始化,包括显示初始化的特点和潜在问题,以及构造和析构函数的作用。指出构造函数在对象创建过程中的重要性,特别是对于静态和非静态对象的不同初始化方式,以及初始化阶段的显式和隐式区别。总结强调理解这些概念对于有效管理类对象的生命周期至关重要。

被折叠的 条评论
为什么被折叠?



