本文参考资料 :  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. Mongodb总结5-通过装饰模式,用Mongodb解决Hbase的不稳定问题

    最近继续学习Mongodb的根本原因,是为了解决今天的问题.项目中用到了Hbase,生产环境服务器用了3台,但是不够稳定,每2天左右,就连不上了.重启就好了,当然,这是一个历史遗留问题.我在想,是不是 ...

  2. HDU 5071 模拟

    考察英语的题 - -# 按条件模拟,一遍即可了,每一个聊天对象有其价值U.数组模拟队列过程即可,若存在Top标记,则和Top标记的人聊天,否则和队列的第一个人聊天 mark记录队尾,top记录Top操 ...

  3. Oracle动态SQL语句

    动态SQL返回游标: create or replace procedure proc_ValidityDueQuery( p_regioncode in number, p_pscode in nu ...

  4. SSH进阶(2)——用Struts拦截器实现登陆限制

    拦截器从字面意思来看就是限制.限制用户訪问某些网页.在Action提出请求之前用拦截器来做权限设置,让符合的用户跳入对应的界面中.近期做的一个商城项目中就用到了自己定义的拦截器,实现了一个简单的ses ...

  5. Android 6.0 扫描不到 Ble 设备需开启位置权限

    Android 6.0 扫描不到 Ble 设备需开启位置权限 之前做 Ble 开发都是在 Android 6.0 系统以下的版本中进行测试的,今天使用 Android 6.0 的设备测试的时候,发现扫 ...

  6. Project Euler 501 Eight Divisors (数论)

    题目链接: https://projecteuler.net/problem=501 题意: \(f(n)\) be the count of numbers not exceeding \(n\) ...

  7. Altium Designer中敷铜和板子一样大

  8. 关于jsonp跨域的问题以及解决方法(跨域、同源与非同源)

    什么是跨域? 想要了解跨域,首先需要了解下浏览器的同源机制: JSONP和AJAX相同,都是客户端向服务器端发送请求:给服务器端传递数据 或者 从服务器端获取数据 的方式 JSONP属于非同源策略(跨 ...

  9. 关于Android中设置闹钟的相对完善的解决方案

    前些时候,有人在我「非著名程序员」微信公众号的后台问我有没有设置闹钟的demo,我当时说承诺为大家写一个,一直没空,直到最近又有人跟我要,我决定抽时间写一个吧.确实设置闹钟是一个比较麻烦的东西.我在这 ...

  10. 34、JZ2440上WIFI网卡使用

    :http://wireless.kernel.org在这个网站上的document中有下面说有内容的介绍 1. 准备工作(虚拟机,开发板)及配置内核选择WIFI驱动1.1 选型:确定网卡的VID,P ...