本文参考资料 :  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++代码的更多相关文章

  1. 编写高效的js/jQuery代码 :rocket:

    讨论jQuery和javascript性能的文章并不罕见.然而,本文我计划总结一些速度方面的技巧和我本人的一些建议,来提升你的jQuery和javascript代码.好的代码会带来速度的提升.快速渲染 ...

  2. 值传递:pass by value(按值传递) 和 pass by reference(引用传递)-[all]-[编程原理]

    所有的编程语言,都会讨论值传递问题. 通过一个js示例直观认识 //理解按值传递(pass by value)和按引用传递(pass by reference) //pass by value var ...

  3. MySql如何编写高效的SQL

    最近应团队要求,研究整理了下,mysql相关的优化,有些是根据实际java项目中碰到的情况经验之谈.欢迎讨论~ SQL 语言是一种强大而且灵活的语言,在使用 SQL 语言来执行某个关系查询的时候,用户 ...

  4. iOS应用开发最佳实践系列一:编写高质量的Objective-C代码

          本文由海水的味道编译整理,转载请注明译者和出处,请勿用于商业用途! 点标记语法 属性和幂等方法(多次调用和一次调用返回的结果相同)使用点标记语法访问,其他的情况使用方括号标记语法. 良好的 ...

  5. 编写高效SQL最佳实践

    编写高效 SQL 语句的最佳实践 秦玮, 高级软件工程师, IBM 王广成, 软件工程师, IBM 王韵婷, 高级软件工程师, IBM 简介: 本文列举了一些在编写 SQL 查询语句时可能导致 DB2 ...

  6. 编写高效的JavaScript

    Web前端性能优化——编写高效的JavaScript   前言 随着计算机的发展,Web富应用时代的到来,Web 2.0早已不再是用div+css高质量还原设计的时代.自Gmail网页版邮件服务的问世 ...

  7. 编写高效的jQuery代码

    http://www.css88.com/jqapi-1.9/ 编写高效的jQuery代码 最近写了很多的js,虽然效果都实现了,但是总感觉自己写的js在性能上还能有很大的提升.本文我计划总结一些网上 ...

  8. 编写高效的JavaScript程序

    作者: Addy Osmani  来源: CSDN  发布时间: 2013-01-10 14:15  阅读: 7952 次  推荐: 15   原文链接   [收藏] 英文原文:Writing Fas ...

  9. 编写高效Lua代码的方法

    编写高效Lua代码的方法 翻译自<Lua Programming Gems>Chapter 2:Lua Performance Tips:Basic fact By Roberto Ier ...

随机推荐

  1. Leetcode-求两数之和

    题目: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中 ...

  2. 步步为营(十五)搜索(一)DFS 深度优先搜索

    前方大坑预警! 先讲讲什么是搜索吧. 有一天你去一个果园摘梨子,果农告诉你.有一棵树上有一个金子做的梨子,找到就是你的,你该怎么找? 地图例如以下: S 0 0 0 0 0 0 0 0 0 0 0 0 ...

  3. php杂项函数

    php杂项函数 一.总结 看着函说作用 函数 描述 PHP     constant() 返回一个常量的值. 4 define() 定义一个常量. 3 defined() 检查某常量是否存在. 3 d ...

  4. Android ListView带CheckBox实现单选

    第1种方法: 首先是我们的bean: public class Bean { private boolean isChecked; private String msg = "这是一条测试数 ...

  5. 全面详细介绍一个P2P网贷领域的ERP系统的主要功能

        一般的P2P系统,至少包括PC网站的前端和后端.前端系统的功能,可以参考"P2P系统哪家强,功能其实都一样" http://blog.csdn.net/fansunion/ ...

  6. 【BZOJ 3998】弦论

    [链接]h在这里写链接 [题意]     给你一个长度为n的子串;     让你求出第k小的子串是什么;     输出答案的类型分两种;     第一种,重复的算两次,第二种,重复的算一次.     ...

  7. SQLITE3 使用总结(直接使用C函数)

    转载网址:http://blog.chinaunix.net/uid-8447633-id-3321394.html 前序: Sqlite3 的确很好用.小巧.速度快.但是因为非微软的产品,帮助文档总 ...

  8. Android 利用an框架快速实现网络请求(含下载上传文件)

    作者:Bgwan链接:https://zhuanlan.zhihu.com/p/22573081来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. an框架的网络框架是完全 ...

  9. HTML标签的权重

    原文 简书原文:https://www.jianshu.com/p/c86d540aec40 大纲 1.HTML权重标签 2.常见的权重标签 3.常见的权重标签的使用 1.HTML权重标签 SEOer ...

  10. iOS开发ARC与MRC下单例的完整写法与通用宏定义

    #import "XMGTool.h" /** * 1:ARC下的完整的单例写法:alloc内部会调用+(instancetype)allocWithZone:(struct _N ...