决战深信服之系列一--入门C++

本文探讨了如何通过const和enum替代#define,以增强代码类型安全性,并介绍了在C++中使用const的注意事项,如常量指针、内存管理与可重载函数。此外,还讨论了如何在C++中正确使用const和enum以避免常见问题。

对于一线内卷失败的大龄程序员而言,长沙深信服总部是最好的容身之所。但是深信服对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{}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值