|
主要涉及以下内容
- default specifier
- delete specifier
- override and final specifiers
上述这些特性在webrtc的源码中较为多见,这些新增的特性是对原C++类特性的一些补充,C++原来称为带类的C,在C语言中增加了面向对象特性,因此夸张一点说类就是C++面向对象的核心一点也不为过。对象就是类思想的集中和核心体现。
工具的目的在于应用,如何使用对象是C++编程的主要工作,总之一句话,类是怎样定义的,就要怎样使用。比如在C++中,简单对象的创建和声明
// 创建一个“向量”的类
class Point
{
// TODO:
};
int a; // 简单对象:整数
std::complex<float> z1; // 稍微复杂一点:复数
Point p; // 再复杂一点:平面向量
有参数的构造函数
Point p(0.0, 0.5);
运算符重载(赋值)
Point p1,p2;
p1 = p2;
运算符重载(乘法),为什么要运算符重载呢,这里举一个例子,比如两个复数相乘z1*z2,根据复数乘法,其结果应为复数。
z_1 = a_1 + b_1j
z_2 = a_2 + b_2j
z_1*z_2 = (a_1a_2-b_1b_2)+(a_1b_2+a_2b_1)j
而两个向量相乘,结果是实数
\vec{x} = (a_1, b_1)
\vec{y} = (a_2, b_2)
\vec{x}*\vec{y} = a_1a_2 + b_1b_2
虽然都是由两个元素构成,但不同的对象做乘法时需要采取不同的处理方式。
Point p1,p2;
float x = p1*p2;
std::complex<float> z1,z2,z3;
z3 = z1*z2;
default specifier
在传统的C++构造函数,拷贝构造函数没有手动创建时,编译器会创建一个默认的相应的函数,default相当于显式的表示默认的函数。
delete specifier
用于显式禁用某些函数。举个例子,在webrtc源码smoothing_filter.h文件中有一个类,其中部分声明和定义如下
// 有参数构造函数
// explicit关键字只对有一个参数的类构造函数有效,防止隐式转换
explicit SmoothingFilterImpl(int init_time_ms);
// 无参数构造函数
SmoothingFilterImpl() = delete;
// 拷贝构造函数
SmoothingFilterImpl(const SmoothingFilterImpl&) = delete;
// 赋值运算符重载
SmoothingFilterImpl& operator=(const SmoothingFilterImpl&) = delete;
在webrtc中这种写法较多,拷贝构造和赋值运算被禁用表示该类只能以指针的方式使用
在上面的例子中,无参数的构造函数也被禁用说明该类初始化时必须要给定参数。
final specifiers
final作用是标志某个类或结构不可被派生。这时应将其放在被定义的类或结构名后面。
class SmoothingFilterImpl final : public SmoothingFilter
override specifiers
override显式声明了成员函数是一个虚函数且覆盖了基类中的该函数,防止出现程序员由于拼写错误或代码改动没有让基类和派生类中的成员函数名称完全一致的情况。
// 析构函数可以override,构造函数不行
~SmoothingFilterImpl() override;
void AddSample(float sample) override;
absl::optional<float> GetAverage() override;
bool SetTimeConstantMs(int time_constant_ms) override;
拓展1:拷贝构造函数调用的几种情形。
拓展2:类中含有指针的情况以及深拷贝和浅拷贝。
本文使用 Zhihu On VSCode 创作并发布
|
|