<<Effecitve C++>> 学习笔记 条款1,2

2022/7/30 1:30:26

本文主要是介绍<<Effecitve C++>> 学习笔记 条款1,2,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

  1. 习惯 C++
    1. 1. C++ 是一个语言联邦
      1. 区别
      2. conclusion 总结
    2. 2. 尽量用const,enum,inline,替换#define
      1. const 的使用
      2. enum 的使用
      3. inline 的使用
      4. conclusion 总结

习惯 C++

1. C++ 是一个语言联邦

  1. c 部分
  • 最成功的的高级语言,他奠定了高级语言的基础,设计了区块blacks,语句statement,预处理器preprocesser,内置类型build-in-type,数组array,指针pointer,很多时候c++不过是更加高级的c解法

  • 面向过程的高级编程语言,与计算机底层和汇编关系密切,你可以详细的控制cpu的每一次操作,通过代码知道编译语句的内容,问题是,程序员面临着大量的潜在bug而无法从语言上获得帮助,数组的初值不确定,动态内存要自己管理,每一次指针的操作都可能使得程序崩溃,

  • 面向工程的巨大缺陷,无法面向对象,只有结构体,没有类class,没有模板template,没有异常,没有重载

  1. Object-Oriented C
  • 原生面向对象的c语言,c with classes:classes(包括构造和析构函数),封装(encapsolution),继承(inheritance),多态(polymorphism),virtual(动态绑定),...
  1. tempate C++
  • 泛型编程, 编程守则"唯泛型适用",TMP编程范式(template meta progranmming),但除了你是设计团队,大部分你只要用就行了,而且template和c++主流编程没有什么影响
  1. 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


这篇关于<<Effecitve C++>> 学习笔记 条款1,2的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程