本系列之前的文章:
从视觉SLAM方案中理解C++的语法条款(一)-CSDN博客
从视觉SLAM方案中理解C++的语法条款(二)-CSDN博客
和前两篇文章相比本文更多的是经验而不是知识。
💫前言:
本文以开源ORB_SLAM2为例,分析Scott Meyers大佬的Effective C++,同时还用到了视觉slam十四讲高博的开源代码。使用这些素材其实是因为我最近也在学习SLAM,发现自己对SLAM代码中的许多语法不明所以。希望这个系列能给大家带来收获,我们一起进步!
💫资料链接:
链接: https://pan.baidu.com/s/16eN1vPq3Et1LEpXWlwColQ?pwd=hzfn 提取码: hzfn 复制这段内容后打开百度网盘手机App,操作更方便哦
内含:ORB_SLAM2代码,kitti数据集 2个G, Effective C++ PDF, 视觉SLAM十四讲从理论到实践 第2版.pdf
条款18:让接口容易被正确使用,不易被误用
用户输入数据后要检验数据是否在合理范围内
🌈条款19:设计class犹如设计type
你应该带着和“语言设计者当初设计语言内置类型(type)时”一样的谨慎来探讨class的设计。
这个条款提出了12个设计C++class的问题,我选择部分问题,尝试去回答。其他问题,有兴趣的读者可以通过文章最上方的链接,从百度网盘获取原文阅读。
你的新type需要什么样的转换?
如果你希望允许类型T1之物转换为类型T2之物,就必须在T1内写一个类型转换函数operator T2,或者作为友元。
// one-argument 的构造函数可以隐式调用,像这样:
class A
{
private:
int a_;
public:
A(int a)
{
a_ = a;
}
};
void test01()
{
A a1 = 1; // 隐式调用构造函数
A a2(1);
}
注意,只有单参构造函数可以隐式调用,多参不允许。
class A
{
private:
int a_;
public:
explicit A(int a) // 用explicit关键字修饰后,禁止隐式调用单参构造函数
{
a_ = a;
}
};
谁该取用新type的成员?
这个问题可以帮助你决定哪个成员为public,哪个为protected,哪个为private,已经哪个类或函数应该是friends。
条款20:宁以pass-by-reference-to-const替换pass-by-value
参见条款01
🌈条款22:将成员变量声明为private
🔥🔥下面这位博主写的很好,建议这个条款直接阅读他的文章:15.9为什么要将成员变量设置为private_实现类文件变量为啥定义成private-CSDN博客
下一个条款会进一步说明这一点
🌈条款23:宁可以non-member non-friend函数替换member函数
它们可以导致较大的封装性,因为它们并不增加“能够访问class内之private成分”的函数数量:
例如:
作者建议使用后一个non-member函数,因为这样并不增加“能够访问class内之private成分”的函数数量。这样就有较大的封装性
![](https://img-blog.csdnimg.cn/direct/6adabfbd83af4330ab19d3aed0a83aab.png)
此外,因为在意封装性而让函数成为non-member,并不意味这它不可以成为另一个class的member(这对于熟悉Java的人友好)
条款26:尽量延后变量定义式的出现时间
变量要用的时候再去定义它,因为存在构造和析构函数的运行成本。
条款27:尽量不要使用类型转换
旧式类型转换:
int i = 1;
double j = (double)i; // 旧式类型转换
新式类型转换 :
const_cast<T>(obj); // const对象转换为non-const对象的唯一方法
static_cast<T>(obj); // 强迫隐式转换,可以基类对象转换为派生类对象
🔥(以下是迭代器+智能指针的使用范例)