草庐IT

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

进击的人 2023-03-28 原文
  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的更多相关文章

  1. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  2. ruby-on-rails - rspec should have_select ('cars' , :options => ['volvo' , 'saab' ] 不工作 - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request

  3. ruby-on-rails - Nokogiri:使用 XPath 搜索 <div> - 2

    我使用Nokogiri(Rubygem)css搜索寻找某些在我的html里面。看起来Nokogiri的css搜索不喜欢正则表达式。我想切换到Nokogiri的xpath搜索,因为这似乎支持搜索字符串中的正则表达式。如何在xpath搜索中实现下面提到的(伪)css搜索?require'rubygems'require'nokogiri'value=Nokogiri::HTML.parse(ABBlaCD3"HTML_END#my_blockisgivenmy_bl="1"#my_eqcorrespondstothisregexmy_eq="\/[0-9]+\/"#FIXMEThefoll

  4. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  5. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  6. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  7. ruby-on-rails - 没有参数的 `<<`(小于两倍)是什么意思? - 2

    我在一个我想在formtasticGem中覆盖的方法中找到了这个。该方法如下所示:defto_htmlinput_wrappingdohidden_field_html是什么意思?在第三行做什么?我知道它对数组有什么作用,但在这里我不知道。 最佳答案 你可以这样读:hidden_field_htmllabel_with_nested_checkbox是连接到hidden_​​field_html末尾的参数-为了“清晰”,他们将其分成两行 关于ruby-on-rails-没有参数的`

  8. ruby-on-rails - 找不到 gem railties (>= 0.a) (Gem::GemNotFoundException) - 2

    我已经看到了一些其他的问题,尝试了他们的建议,但没有一个对我有用。我已经使用Rails大约一年了,刚刚开始一个新的Rails项目,突然遇到了问题。我卸载并尝试重新安装所有Ruby和Rails。Ruby很好,但Rails不行。当我输入railss时,我得到了can'tfindgemrailties。我当前的Ruby版本是ruby2.2.2p95(2015-04-13修订版50295)[x86_64-darwin15],尽管我一直在尝试通过rbenv设置ruby​​2.3.0。如果我尝试rails-v查看我正在运行的版本,我会得到同样的错误。我使用的是MacOSXElCapitan版本10

  9. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

  10. ruby-on-rails - 连接字符串时如何在 <%=%> block 内输出 html_safe? - 2

    考虑一下:现在这些情况:#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2我需要用其他字符串输出URL。我如何保证&符号不会被转义?由于我无法控制的原因,我无法发送&。求助!把我的头发拉到这里:\编辑:为了澄清,我实际上有一个像这样的数组:@images=[{:id=>"fooid",:url=>"http://

随机推荐