-
-
[分享]《探索现代化C++》泛读笔记摘要4
-
发表于:
2022-9-10 09:06
5555
-
《探索现代化C++》泛读笔记摘要4
Chapter 2 类
成员
一个类定义了新的数据类型,它可以包含如下的内容:
C++也有struct关键字,他也是用于定义一个类,不过这个类的成员默认是public的。
类中的静态声明
对类中的成员变量使用static关键字,一种目的是在对象之间共享资源,另一种目的是创建单例。
类中的静态函数只能访问静态数据和调用静态函数。
设置值:构造函数和赋值
构造函数
对于成员变量,C++一般都不写一堆繁琐的set和get函数。而是采用构造函数进行初始化。
1 2 3 4 5 6 7 8 9 | class complex
{
public:
complex (double rnew, double inew)
: r(rnew), i(inew) / / 老式的初值列
{
}
/ / ...
};
|
对于上述构造函数,老式调用方法如下:
现代化调用方法
当然构造函数也有了现代化的写法
1 2 3 4 5 6 7 8 9 | class complex
{
public:
complex (double rnew, double inew)
: r{rnew}, i{inew} / / 现代化的成员初始化列表
{
}
/ / ...
};
|
C++11 推出 移动构造函数
建议:如果可能的话,最后定义一个构造函数,别让编译器自己生成一个。
隐式的构造转换可以通过加关键字explicit进行禁用。
1 2 3 | class complex {
explicit complex (double nr = 0.0 ,double i = 0.0 ) :r{nr},i{i} {}
};
|
C++11 委托构造,也就是提供了调用其他构造函数的能力,避免冗余的成员初始化列表编写工作。
1 2 3 4 5 6 | class complex {
public:
complex (double r,double i): r{r},i{i} {}
complex (double r) : complex {r, 0.0 } {}
complex (): complex { 0.0 } {}
};
|
C++11 支持成员拥有默认值。
1 2 3 4 5 6 7 8 9 10 | class complex
{
public:
complex (double r, double i) : r{r}, i{i} {}
complex (double r) : r{r} {}
complex () {}
...
private:
double r = 0.0 , i = 0.0 ;
};
|
C++11 引入了<initializer_list>
这是vector支持初始化列表初始化的原因,当然下面例子中列表里的元素需要类型一样。
读到这里才注意到vs2019最低默认支持C++14了,切换不到C++11。
1 2 | vector v = { 1.0 , 2.0 , 3.0 };
vector v { 1.0 , 2.0 , 3.0 };
|
C++11 统一初始化 对于无构造函数的结构体可以采用这种方式初始化。
1 2 3 4 5 6 | struct sloppy_complex
{
double r,i;
};
sloppy_complex z1{ 3.66 , 2.33 },
z2 = { 0 , 1 };
|
C++20 指定初始化
我们可以跳过一些成员的赋值,但是不能改变顺序,如下z3就是错的。
1 2 3 | sloppy_complex z1{ 3.66 , 2.33 },
z2 = { .i = 1 };
sloppy_complex z3{.i = 4.4 ,.r = 0.9 }; / / Error: 顺序错误
|
C++11 移用语义
引出右值引用 &&
目的是为了减少拷贝带来的开销。
C++11 移动构造
C++11 移动赋值
C++17 消除拷贝 Copy Elision
Copy Elision最大的用处是返回值优化(RVO)。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!