首页
社区
课程
招聘
[分享]《探索现代化C++》泛读笔记摘要4
2022-9-10 09:06 4795

[分享]《探索现代化C++》泛读笔记摘要4

2022-9-10 09:06
4795

《探索现代化C++》泛读笔记摘要4

Chapter 2 类

成员

一个类定义了新的数据类型,它可以包含如下的内容:

  • 数据
  • 函数
  • 类型定义
  • 包含另外一个类

C++也有struct关键字,他也是用于定义一个类,不过这个类的成员默认是public的。

1
2
3
4
struct xyz
{
    ...
};

类中的静态声明

对类中的成员变量使用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
complex c1(2.0,3.0);

现代化调用方法

1
complex c1{2.0,3.0};

当然构造函数也有了现代化的写法

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)。


[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞0
打赏
分享
最新回复 (3)
雪    币: 3114
活跃值: (7764)
能力值: ( LV4,RANK:41 )
在线值:
发帖
回帖
粉丝
_重黎 2022-9-10 09:12
2
0
这是论坛,不是CSDN。。。。
雪    币: 6
活跃值: (2915)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
咖啡_741298 2022-9-10 18:07
3
0
_重黎 这是论坛,不是CSDN。。。。
挺好的好,发在编程区,没啥问题
雪    币: 8044
活跃值: (4335)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
sunsjw 1 2022-9-23 10:36
4
0
支持楼主,1楼无营养的发言就当没看到。
游客
登录 | 注册 方可回帖
返回