对于一线内卷失败的大龄程序员而言,长沙深信服总部是最好的容身之所。但是深信服对C++要求比较高,我们可以分25个系列来熟悉C++的主流语法特性。

深信服长沙总部
C++是一个支持多重泛型编程语言,是一个同时支持过程形式、面向对象形式、函数形式、泛型形式、元编程形式的语言。本文先讲述#define及const两个特性,同时也是《Effective C++》笔记。
#define
尽量以const,enum,inline替换#define,也就是以编译器替换预处理器。比如如下例子:
#define Pi 3.14
那么Pi这个符号不会进入符号表(symbol table),缺乏类型的检测机制,对于debug会造成干扰。可以使用const替换:
const double Pi=3.14;
此时Pi作为常量会被编译器记录至符号表。此外对于浮点常量而言,使用常量比使用#define目标码更小,可以适量减少文件体积。
定义常量指针时,由于定义式一般放在头文件,为防止指针及指针所指内容被修改,需要使用两次const:
const char* const Name = “jixieyuan”;
当然使用std::string比char*更合适,更方便操作:
const std::string Name(“jixieyuan”);
Tips:string的内存管理是由系统处理,除非系统内存池用完,不然不会内存问题。char *的内存管理由用户自己处理,很容易出现内存不足的问题。同样,尽量使用vector(关联数组),不用数组;尽量使用迭代器、智能指针,而不用原生指针。
#define一个缺陷是无法限制作用域,对于class专属常量,需要让其成为class的一个成员:
Class Wiget{
Private:
Static const int Num =5;
Int scores[Num];
...
};
这里Num 是声明而非定义,只要不取地址就不需要提供定义式。如果需要取该常量地址,需要在源文件中定义:
const int Wiget::Num ; //不要赋值
Enum
上面的class可以使用enum代替,如下:
Enum{Num = 5};
但是enum比较类似#define,比如不能取地址等,而且不会像const类型变量一样产生内存分配。
#define的第二个缺陷体现在实现宏的时候。比如经典的max宏:
#define MAX(a,b) ((a) > (b) ? (a) : (b))
使用时还要考虑参数重名、参数自增等因素,使用inline替代就不会出现隐患,而且不会导致代码体积膨胀。
Const
两个成员函数如果只是常量性不同,可以被重载:
Class Text{
Public:
Const char& operator[](std::size_t position) const{}
char& operator[](std::size_t position){}//成员函数把实现放在头文件中,默认为inline函数
Private:
Std::string text;
};
如果operator[]不单只是返回text的某个字符,也执行边界检验、数据完整性检验等,那么这些操作都需要同时放入Const operator[]和operator[]中,导致代码重复。更好的设计方案是实现operator[]一次并使用它两次:
Class Text{
Public:
Const char& operator[](std::size_t position) const{
... //边界检验等
return text[position];
}
char& operator[](std::size_t position){
return const_cast<char&>(static_cast<const Text&>(*this)[position]);
//将*this加上const,可以调用const op[]接口;
//然后将op[]返回的const属性去除
}
...
};
上面如果不将*this转型为const Text属性,会导致operator[]循环调用operator[],导致爆栈。
此外,如果需要在const成员函数中对某些成员变量进行修改,可以使用mutable释放non-static成员变量的const约束。
上述const成员函数的const修饰只能放在成员函数签名式末尾,因为该const属性本质上是修饰this指针。
char& operator[]() const{}
本文探讨了如何通过const和enum替代#define,以增强代码类型安全性,并介绍了在C++中使用const的注意事项,如常量指针、内存管理与可重载函数。此外,还讨论了如何在C++中正确使用const和enum以避免常见问题。
1692

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



