`

条款22: 尽量用“传引用”而不用“传值”

阅读更多
条款22: 尽量用“传引用”而不用“传值”
这章讲的东西基本都在掌握范围内,简单概括下
首先是效率问题
比如
class person {
public:
  person();                         // 为简化,省略参数
                                    // 
  ~person();

  ...

private:
  string name, address;
};

class student: public person {
public:
  student();                        // 为简化,省略参数
                                    // 
  ~student();

  ...

private:
  string schoolname, schooladdress;
};


现在定义一个简单的函数returnstudent,它取一个student参数(通过值)然后立即返回它(也通过值)。定义完后,调用这

个函数:
student returnstudent(student s) { return s; }

student plato;                      // plato(柏拉图)在
                                    // socrates(苏格拉底)门下学习

returnstudent(plato);               // 调用returnstudent


简单地说就是:首先,调用了student的拷贝构造函数用以将s初始化为plato;然后再次调用student的拷贝构造函数用以将函

数返回值对象初始化为s;接着,s的析构函数被调用;最后,returnstudent返回值对象的析构函数被调用。所以,这个什么也

没做的函数的成本是两个student的拷贝构造函数加上两个student析构函数。当然还包括里面的成员变量的构造。。引起一连

串的蝴蝶效应。


第二个比较重要,就是对派生类到基类转换的丢失
class window {
public:
  string name() const;             // 返回窗口名
  virtual void display() const;    // 绘制窗口内容
};

class windowwithscrollbars: public window {
public:
  virtual void display() const;
};

void printnameanddisplay(window w)
{
  cout << w.name();
  w.display();
}

windowwithscrollbars wwsb;

printnameanddisplay(wwsb);



在void printnameanddisplay(window w)这个接口上,由于会形成一种高向低的转换,基类+派生类的内存布局里, 派生类被

砍掉了,然后构造一个w的对象。如果这时候我去调用display(),会调成windows类里的display(),而不是我们希望的动态调

用windowwithscrollbars里的display();
1
0
分享到:
评论

相关推荐

    Effective C++

    条款22:尽量用传引用而不用传值 条款23:必须返回一个对象时不要试图返回一个引用 条款24:在函数重载与设定参数默认值间慎重选择 条款25:避免对指针与数字类型的重载 条款26:当心潜在的二义性 条款27:如果不想使用...

    Effective.C++.中文第二版.50条款doc文档.chm

    条款22: 尽量用“传引用”而不用“传值” 条款23: 必须返回一个对象时不要试图返回一个引用 条款24: 在函数重载和设定参数缺省值间慎重选择 条款25: 避免对指针和数字类型重载 条款26: 当心潜在的二义性 条款27: ...

    effective stl 中文 pdf

    条款22: 避免对set和multiset的键值进行修改 条款23: 考虑用排序的vector代替关联容器 条款24: 当效率很关键时尽量用map::insert代替map::operator 条款25: 让自己熟悉非标准的hash容器 迭代器 条款26: 尽量...

    Effictive STL CHM中文版

    条款22: 避免对set和multiset的键值进行修改 条款23: 考虑用排序的vector代替关联容器 条款24: 当效率很关键时尽量用map::insert代替map::operator 条款25: 让自己熟悉非标准的hash容器 迭代器 条款26: 尽量...

    effective stl stl 技巧

    条款22:避免原地修改set和multiset的键 条款23:考虑使用有序vector代替关联容器 条款24:当关乎效率时应该在map::operator[]和map-insert之间仔细选择 条款25:熟悉非标准散列容器 迭代器 条款26:尽量用...

    Effective STL(中文)

    尽量使用vector和string来代替动态分配的数组 条款14:使用reserve来避免不必要的重新分配 条款15:小心string实现的多样性 条款16:如何将vector和string的数据传给传统的API 条款17:使用“交换技巧”...

    EffectiveC++ and more Effective C++

     ·条款二:尽量使用C++风格的类型转换  ·条款三:不要使用多态性数组  ·条款四:避免无用的缺省构造函数  ·条款五:谨慎定义类型转换函数  ·条款六:自增(increment)、自减(decrement)操作符前缀...

    Effective c++

    提高编程效率的50条建议 条款1:尽量用const和inline而不用#define 条款2:尽量用而不用 条款3:尽量用new和delete而不用malloc和free 内存管理的建议 设计与说明的建议 继承与面向对象的设计 杂项

    exceptional c++:47个c++工程难题、编程问题和解决方案(英文版)

    条款22:类之间的关系——之一 99 条款23:类之间的关系——之二 103 条款24:继承的使用和滥用 110 条款25:面向对象程序设计 121 4 编译器防火墙和pimpl惯用法 123 条款26:将编译期依赖性降到最低——之一 ...

    Effective C++(第三版)

    条款22:将成员变量声明为private declare data members private. 条款23:宁以non-member、non-friend替换member函数 prefer non-member non-friend functions to member functions. 条款24:若所有参数皆需类型...

    Effective C++ 中文版

    条款22: 将成员变量声明为private 条款23: 宁以non-member、non-friend替换member函数 条款24:若有所参数皆需类型转换,请为此采用non-member函数 条款25:考虑写出一个不抛异常的swap函数 5.实现 条款26:尽...

    More Effective C++

    条款22:考虑以操作符复合型式(op=)取代其独身型式(op)107 Consider using op= instead of stand-alone op 条款23:考虑使用其它程序库 110 Consider alternative libraries 条款24:了解 virtual functions、...

    EFFECTIVE C++ 条款03 尽量使用const 思维导图

    EFFECTIVE C++ 条款03 尽量使用const 思维导图

    c++ Effective STL(中文+英文)

    条款5: 尽量使用范围成员函数代替他们的单元素兄弟 条款6: 警惕C++的及其令人恼怒的分析 条款7: 当使用new得指针的容器时,切记在容器销毁前delete那些指针 条款8: 千万不要把auto_ptr放入容器中 条款9: 小心...

    ROHS豁免条款:ROHS豁免项清单及ROHS最新豁免条例.pdf

    ROHS豁免条款:ROHS豁免项清单及ROHS最新豁免条例.pdf

    Effective_C++_笔记

    1.2 条款02:尽量以const,enum,inline替换#define 这个条款或许可以改为“宁可用编译器替换预处理器”。 通常C++要求你对所使用的任何东西提供一个定义式,但如果它是个class专属常量 又是static且为整数类型...

    Effective Modern C++英文版及中文翻译

    Effective Modern C++英文版及中文翻译. 第一章 类型推导 条款1: 理解模板类型推导 条款2: 理解auto类型推导 ...条款5: 优先使用auto而非显式类型声明 条款6: 当auto推导出非预期类型时应当使用显式的类型初始化

    ISO9001:2015标准条款测试题参考答案.pdf

    ISO9001:2015标准条款测试题参考答案.pdf

    MKS22X:apcs条款2

    MKS22X apcs条款2

    最新合同条款怎么写建筑施工合同应包含那些条款WORD文件格式.docx

    最新合同条款怎么写建筑施工合同应包含那些条款WORD文件格式.docx

Global site tag (gtag.js) - Google Analytics