`

条款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++.中文第二版.50条款doc文档.chm

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

    Effictive STL CHM中文版

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

    Effective STL(中文)

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

    EffectiveC++ and more Effective C++

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

    Effective_C++

    **条款22:尽量用“传引用”而不用“传值”** - **目的**: 提升性能并减少内存占用。 - **解释**: 当传递较大的对象或资源时,使用传引用可以避免不必要的拷贝操作,从而提高性能并减少内存占用。 - **应用场景**: ...

    高效C++:从C到C++

    **条款22:尽量用“传引用”而不用“传值”** - **背景**:传递对象时应尽量使用引用而非值传递。 - **原因**:引用传递可以避免复制开销,提高性能。 - **示例**: ```cpp void process(MyClass &obj); // 引用...

    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:尽...

    Effective C++

    9. **条款9:优先使用引用来传递大型对象** - 对于大对象,传递引用比复制更高效,因为不会进行实际的数据拷贝。 10. **条款10:考虑使用const成员函数** - const成员函数允许在不修改对象状态的情况下操作对象,有...

    effective c++

    3. **条款3:区别`const`引用和非`const`引用** - `const`引用可以用作只读访问,而非`const`引用必须初始化,并且在生命周期内不能更改其绑定的值。 4. **条款4:了解`const`对象的生命周期** - `const`对象可以在...

    Effective C++.rar

    3. **条款3:尽可能使用引用而非指针** - 引用没有空值,且强制关联到一个对象,提供了更安全的接口。 - 使用引用作为函数参数,可以确保函数不会接收到空指针。 4. **条款4:尽量不使用原始指针,除非你真的需要...

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

    EFFECTIVE C++ 条款03 尽量使用const 思维导图 在 C++ 编程中,使用 const 关键字可以提高代码的可读性、可维护性和安全性。本文将详细介绍 EFFECTIVE C++ 的第三条款:尽量使用 const 思维导图。 一、const ...

    effective stl stl 技巧

    #### 条款22:避免原地修改set和multiset的键 - **核心概念**:直接修改`set`和`multiset`中的元素可能导致容器状态不一致。 - **应用场景**: - 修改元素时,采用正确的策略以避免破坏容器结构。 #### 条款23:...

    Effetive+STL(Word文档)

    - **条款22:避免就地修改`std::set`和`std::multiset`的键** - 修改`std::set`或`std::multiset`中元素的键可能导致容器行为异常。 - 如果需要修改键,应先删除旧元素,再插入新元素。 - **条款23:考虑使用有序...

    Effective STL.zip

    8. **条款8:使用`std::bind1st`和`std::bind2nd`固定函数参数** —— 这些工具可以创建偏函数对象,固定传给函数的第一个或第二个参数,便于在STL算法中使用。 9. **条款9:考虑使用`std::equal_range`而非`std::...

Global site tag (gtag.js) - Google Analytics