[GeekBand ] 利用 pass by reference -to -const 编写高效规范的 c++代码
本文参考资料 : GeekBand 侯捷老师,学习笔记
Effective C ++ 侯捷译 条款20
开发环境采用:VS2013版本
首先:分析值传递的缺点 (一)
class Person{
public:
Person();
virtual ~Person();
private:
std::string name;
std::stringi address;
};
class Student: public Persion{
public:
Student();
~Student();
private:
std::string schoolName;
std::string schoolAddress;
};
函数调用部分:
bool validateStudent(Student s);
Student plato;
bool platoIsOk = validateStudent(plato);
通过以上代码,分析得:
1、基类Student的构造函数调用,以plato 为蓝本为s初始化;结束时调用一次析构函数。
基类Student中有两个String对象,此时又有两次构造函数和析构函数。
基类Student共有三次构造、三次析构
2、每次构造Student对象必须构造一次Person对象。因为Student继承自Person对象。
同理,Person也有三次构造、三次析构。
推论:这种按值传参的方式,效率有点低啊。同时如果采用按引用传递,那么没有任何构造函数或析构函数被调用,因为没有任何对象被创建
然后:分析值传递的缺点 (二)
Class Window
{ public:
std::string name() const;
virtual void display() const;
}
Class WindowWithScrollBars:public Window
{ public:
virtual void display() const; }
观察代码得知:
1、子类WindowWithScrollBars继承自基类Windows
2、基类、子类中均有函数 display,这里简单的把基类的display记为,dispaly_1.子类的记录为,display_2
void printNaAndDisplay(Window w)
{ std::cout<<w.name();
w.display(); }
而此时
WindowWithScrollBars wwsb;
printNameAndDisplay(wwsb);
这时创建了子类对象wwsb,看上去应该调用子类的dispay_2才对,而实际上因为void printNameAndDisplay(Window w),是按值传递的。
无论传递过来的数值是什么,夸张点的、比如整形、字符型等等。都会自动的转换为Window类型,因为传递过来的仅仅是数值!!!
所以,这里调用的是基类的display,所以此程序无法满足程序员最开始的设想!
解决这个问题,同样采用引用传递即可!
传进来是什么类型,w就是那种类型
三、再说说,为什么采用const这个参数进行限定
按引用传递后,在函数内部会改变传过来的数值。而改动函数的返回值从来就不是合法的。所以我们加个限定词 const,这样就解决这个问题了。
[GeekBand ] 利用 pass by reference -to -const 编写高效规范的 c++代码的更多相关文章
- 编写高效的js/jQuery代码 :rocket:
讨论jQuery和javascript性能的文章并不罕见.然而,本文我计划总结一些速度方面的技巧和我本人的一些建议,来提升你的jQuery和javascript代码.好的代码会带来速度的提升.快速渲染 ...
- 值传递:pass by value(按值传递) 和 pass by reference(引用传递)-[all]-[编程原理]
所有的编程语言,都会讨论值传递问题. 通过一个js示例直观认识 //理解按值传递(pass by value)和按引用传递(pass by reference) //pass by value var ...
- MySql如何编写高效的SQL
最近应团队要求,研究整理了下,mysql相关的优化,有些是根据实际java项目中碰到的情况经验之谈.欢迎讨论~ SQL 语言是一种强大而且灵活的语言,在使用 SQL 语言来执行某个关系查询的时候,用户 ...
- iOS应用开发最佳实践系列一:编写高质量的Objective-C代码
本文由海水的味道编译整理,转载请注明译者和出处,请勿用于商业用途! 点标记语法 属性和幂等方法(多次调用和一次调用返回的结果相同)使用点标记语法访问,其他的情况使用方括号标记语法. 良好的 ...
- 编写高效SQL最佳实践
编写高效 SQL 语句的最佳实践 秦玮, 高级软件工程师, IBM 王广成, 软件工程师, IBM 王韵婷, 高级软件工程师, IBM 简介: 本文列举了一些在编写 SQL 查询语句时可能导致 DB2 ...
- 编写高效的JavaScript
Web前端性能优化——编写高效的JavaScript 前言 随着计算机的发展,Web富应用时代的到来,Web 2.0早已不再是用div+css高质量还原设计的时代.自Gmail网页版邮件服务的问世 ...
- 编写高效的jQuery代码
http://www.css88.com/jqapi-1.9/ 编写高效的jQuery代码 最近写了很多的js,虽然效果都实现了,但是总感觉自己写的js在性能上还能有很大的提升.本文我计划总结一些网上 ...
- 编写高效的JavaScript程序
作者: Addy Osmani 来源: CSDN 发布时间: 2013-01-10 14:15 阅读: 7952 次 推荐: 15 原文链接 [收藏] 英文原文:Writing Fas ...
- 编写高效Lua代码的方法
编写高效Lua代码的方法 翻译自<Lua Programming Gems>Chapter 2:Lua Performance Tips:Basic fact By Roberto Ier ...
随机推荐
- 5. Node基础编程
基于Chrome V8引擎 单线程 使用JavaScript开发后端代码 非阻塞的IO common规范 common一定是通过module.exports={}输出 创建Http Server ...
- 2. Vue基础语法
模板语法: Mustache语法: {{}} Html赋值: v-html="" 绑定属性: v-bind:id="" 使用表达式: {{ok?'Yes': ...
- es6常用功能与异步详解(JS高级面试题)
callback hell方法的使用 可读性不友好 function loadImg(src,callback,fail){ var img = document.createElement('img ...
- H5移动端IOS/Android兼容性总结,持续更新中…
H5移动端IOS/Android兼容性总结,持续更新中… 1. IOS不识别日期 new Date("2018-07-01 08:00:00")在Android下正常显示可以直接进 ...
- YUM查询软件信息
我们常会碰到这样的情况,想要安装一个软件,只知道它和某方面有关,但又不能确切知道它的名字.这时yum的查询功能就起作用了.你可以用yum search keyword这样的命令来进行搜索,比如我们要则 ...
- Google guava工具类的介绍和使用
概述 工具类 就是封装平常用的方法,不需要你重复造轮子,节省开发人员时间,提高工作效率.谷歌作为大公司,当然会从日常的工作中提取中很多高效率的方法出来.所以就诞生了guava.. 高效设计良好的API ...
- 博客已迁移至http://blog.csdn.net/lujinhong2/
http://blog.csdn.net/lujinhong2/ 请继续关注
- sbt教程
更详细内容请见:http://www.scala-sbt.org/0.13/tutorial/Basic-Def.html 或者 http://wenku.baidu.com/link?url=o ...
- thinkphp3.2二维码扩展
//简易二维码 public function qrcode(){ Vendor('phpqrcode.phpqrcode'); //生成二维码图片 $object = new \QRcode(); ...
- angular之Http服务
原文 https://www.jianshu.com/p/53e4a4bfad7d 大纲 1.什么是angular服务 2.服务的类别 3.认识angular的Http请求 4.简单实例 5.angu ...