本文参考资料 : 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; };
函数调用部分:spa
bool validateStudent(Student s); Student plato; bool platoIsOk = validateStudent(plato);
经过以上代码,分析得:对象
一、基类Student的构造函数调用,以plato 为蓝本为s初始化;结束时调用一次析构函数。blog
基类Student中有两个String对象,此时又有两次构造函数和析构函数。继承
基类Student共有三次构造、三次析构开发
二、每次构造Student对象必须构造一次Person对象。由于Student继承自Person对象。string
同理,Person也有三次构造、三次析构。it
推论:这种按值传参的方式,效率有点低啊。同时若是采用按引用传递,那么没有任何构造函数或析构函数被调用,由于没有任何对象被建立
Class Window { public: std::string name() const; virtual void display() const; } Class WindowWithScrollBars:public Window { public: virtual void display() const; }
观察代码得知:
一、子类WindowWithScrollBars继承自基类Windows
二、基类、子类中均有函数 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就是那种类型
3、再说说,为何采用const这个参数进行限定
按引用传递后,在函数内部会改变传过来的数值。而改动函数的返回值历来就不是合法的。因此咱们加个限定词 const,这样就解决这个问题了。