前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《effective C++》from line 1 to line 12

《effective C++》from line 1 to line 12

作者头像
小二三不乌
发布2018-08-02 11:02:08
3750
发布2018-08-02 11:02:08
举报

前面两章的内容主要是习惯使用c++,大部分都是《C++ primer》中的需要注意的一些东西,由于刚刚看完前面一本,所以有些还是有些印象的。这里大体总结一下。

L1:C++是一个语言联邦。

包含着最初的以c语言为基础的C,面向对象的C++,C++的泛型编程,以及STL。在我们使用的过程中,可能会穿插,但是我们需要根据不同的情况使用不同的策略。

L2:代替#define

#define是在编译之前,也就是预处理的阶段就会被替换,这样我们在调试程序的时候看到的就是被替换的数字,会给别人甚至是之后调试的我们自己带来理解上的困难。另外,预处理器的工作是,直接把define的内容进行替换,当我们在define中写的表达式,并且在接下来使用的时候,可能产生无法理解的结果。所以当我们使用不想改变的常量时,使用const代替#define。 我们还可以使用enum来代替#define。这样显得会更接近一些,因为enum#define一样,同时也不会被pointer或reference指向。 使用inline函数。

L3:尽量使用const

这是一个很好理解的问题,就像你把东西给别人用,不想让别人动的地方就加一个const不让别人动一样。。。 具体的体现为:指针,不想被改变的变量,迭代器,成员函数等等。 我们可能还会为一个函数定义const非const版本。

L4:在使用对象前先初始化

嗯,记住。

L5:了解c++会默认编写并调用哪些函数

在面向对象编程时,记住三五法则。构造函数、拷贝构造函数、拷贝赋值运算符、移动赋值运算符、析构函数。记住这几个函数的作用,其在什么时候会被使用,如果没有的时候,系统会不会为我们生成。我们需不需要系统为我们生成。

L6:不想编译器默认生成的函数,应该明确拒绝

比如我们不希望编译器为我们生成默认的函数,我们应该将其定义为删除的或者定义为private的,也可以定义类似于uncopyable类似的base class。

L7:为多态的基类声明virtual析构函数

通常我们希望派生类覆盖或重写的函数,定义为virtual函数。析构函数作为对象被销毁时调用的函数,如果不是虚函数,那么可能在销毁的时候只会销毁基类的部分,局部销毁,造成资源泄露。

L8:不要让异常逃离析构函数

析构函数绝对不要吐出异常,当遇到异常的时候应该捕捉任何异常,然后吞下或结束程序。 如果需要对某个操作函数运行期间抛出的异常做出反应,应该提供一个普通的函数执行操作,而不是在析构函数中。

L9:绝不在构造和析构过程中调用virtual函数

构造和析构过程中,调用virtual函数的对象可能还没有产生,也就是派生类的对象,此时会产生未定义的行为。

L10:另operator=返回一个reference to *this

并不强制,只是为了防止一些调皮的调用者使用:x=y=z=15这样的操作。

L11:在operator=中处理自赋值的情况

确定任何函数如果操作一个以上的对象,而其中多个对象是同一个对象时,行为仍然正确。

L12:复制对象时不忘每一个成分

Copying函数应该确保复制对象内的所有成员变量和所有base class成分。 不要使用一个copying函数实现另一个copying函数,而是创建一个新的函数避免代码重复。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-10-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • L1:C++是一个语言联邦。
  • L2:代替#define
  • L3:尽量使用const
  • L4:在使用对象前先初始化
  • L5:了解c++会默认编写并调用哪些函数
  • L6:不想编译器默认生成的函数,应该明确拒绝
  • L7:为多态的基类声明virtual析构函数
  • L8:不要让异常逃离析构函数
  • L9:绝不在构造和析构过程中调用virtual函数
  • L10:另operator=返回一个reference to *this
  • L11:在operator=中处理自赋值的情况
  • L12:复制对象时不忘每一个成分
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档