ToB企服应用市场:ToB评测及商务社交产业平台
标题:
<<Effecitve C++>> 学习笔记 条款1,2
[打印本页]
作者:
海哥
时间:
2022-9-3 12:32
标题:
<<Effecitve C++>> 学习笔记 条款1,2
习惯 C++
1. C++ 是一个语言联邦
区别
conclusion 总结
2. 尽量用const,enum,inline,替换#define
const 的使用
enum 的使用
inline 的使用
conclusion 总结
习惯 C++
1. C++ 是一个语言联邦
c 部分
最成功的的高级语言,他奠定了高级语言的基础,设计了区块blacks,语句statement,预处理器preprocesser,内置类型build-in-type,数组array,指针pointer,很多时候c++不过是更加高级的c解法
面向过程的高级编程语言,与计算机底层和汇编关系密切,你可以详细的控制cpu的每一次操作,通过代码知道编译语句的内容,问题是,程序员面临着大量的潜在bug而无法从语言上获得帮助,数组的初值不确定,动态内存要自己管理,每一次指针的操作都可能使得程序崩溃,
面向工程的巨大缺陷,无法面向对象,只有结构体,没有类class,没有模板template,没有异常,没有重载
Object-Oriented C
原生面向对象的c语言,c with classes:classes(包括构造和析构函数),封装(encapsolution),继承(inheritance),多态(polymorphism),virtual(动态绑定),...
tempate C++
泛型编程, 编程守则"唯泛型适用",TMP编程范式(template meta progranmming),但除了你是设计团队,大部分你只要用就行了,而且template和c++主流编程没有什么影响
STL
stl是个template程序库,极佳的紧密配合和协调了 容器(container),迭代器(iterraters),算法(algorithm),以及函数对象function Object的规约,如果你要使用它,就得遵守他的规约.
区别
c部分pass by value 更好,只有指针和基础类型
然而Object-Oriented C 和 template C++由于有构造和析构函数的classes ,pass-by-reference-to-const更加高效,
然而使用STL时,由于stl的迭代器和函数对象都是基于指针构建的,pass-by-value 再次适用
conclusion 总结
C++ 高效编程守则视现状而定,取决于你使用C++的哪一部分
2. 尽量用const,enum,inline,替换#define
宁可编译器而不是预处理器, 因为#define 设计就不是语言的一部分,编译器很多情况下报错无法追踪,因为#define 没有记名表,没有变量名,在编译器眼里是常量,只会报错常量,而你无法通过常量追踪报错位置,调试的时候更是这样
#define 不提供封装性,作用域控制,即static,class member,private,protect
eg #define ASP 1.63 -> const double ASP = 1.63
const 的使用
c part (based-on-char*) eg :
const char * str const = "hello effective cpp";
复制代码
在星号前的const代表修饰*str,即str所指向的内存存储的值不可变
在星号后的const修饰str,代表该指针的值不可变,即不能指向别的内存
c++ part(based-on-classes)string :
const std::string str("hello effective cpp");
复制代码
classes 专属常量 for class scope define as a class member, for single store define as static
class GamePlayer{
private:
static const int NumTurns = 5; // 常量声明式
int score[NumTurns]; //使用该常量
...
};
复制代码
如果这个常量不是整数型变量类型 byte,int,char,bool 或者你需要取这个常量的地址,你必须在class外提供定义式,参考头文件和源文件的关系理解,第一次为声明,第二次为定义,由于const的属性而显得奇怪,下面会解释原因
const int GamePlayer::NumTurn;
复制代码
由于已经在声明时赋值,const使得不可再次赋值
在文件内的static已有特殊定义,即文件内部常量,不可被文件外部使用,对应extern,对于class static member的作用域,显然不合理,所以不可使用static,而使用extern,而extern可省略
enum 的使用
当你的编译器(错误的)不允许"static整数常量"完成"class int初值设定",使用the enum hack ,enum补偿法
class GamePlayer{
enum{NumTurns=5};
int scores[NumTurns];
}
复制代码
enum 无法被取地址更安全,而const 可以, 然后enum是TMP (template mete programming)的基础技术
inline 的使用
使用#define而避免函数调用的开销
#define CALL_WITH_MAX(a,b) f((a)>(b)?(a):(b))
复制代码
错误情况
int a=5,b=0;
CALL_WITH_MAX(++a,b);
CALL_WITH_MAX(++a,b+10);
复制代码
使用inline
template<T>
inline void call_with__max(T a,T b){
f(a>b?a:b);
}
复制代码
conclusion 总结
对于单纯常量,最好以const对象或者enums替换#define
对于形似函数的宏(micros), 最好改用inline函数替换#define
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4