条款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();
分享到:
相关推荐
条款22: 尽量用“传引用”而不用“传值” 条款23: 必须返回一个对象时不要试图返回一个引用 条款24: 在函数重载和设定参数缺省值间慎重选择 条款25: 避免对指针和数字类型重载 条款26: 当心潜在的二义性 条款27: ...
条款22: 避免对set和multiset的键值进行修改 条款23: 考虑用排序的vector代替关联容器 条款24: 当效率很关键时尽量用map::insert代替map::operator 条款25: 让自己熟悉非标准的hash容器 迭代器 条款26: 尽量...
尽量使用vector和string来代替动态分配的数组 条款14:使用reserve来避免不必要的重新分配 条款15:小心string实现的多样性 条款16:如何将vector和string的数据传给传统的API 条款17:使用“交换技巧”...
·条款二:尽量使用C++风格的类型转换 ·条款三:不要使用多态性数组 ·条款四:避免无用的缺省构造函数 ·条款五:谨慎定义类型转换函数 ·条款六:自增(increment)、自减(decrement)操作符前缀...
**条款22:尽量用“传引用”而不用“传值”** - **目的**: 提升性能并减少内存占用。 - **解释**: 当传递较大的对象或资源时,使用传引用可以避免不必要的拷贝操作,从而提高性能并减少内存占用。 - **应用场景**: ...
**条款22:尽量用“传引用”而不用“传值”** - **背景**:传递对象时应尽量使用引用而非值传递。 - **原因**:引用传递可以避免复制开销,提高性能。 - **示例**: ```cpp void process(MyClass &obj); // 引用...
条款22:类之间的关系——之一 99 条款23:类之间的关系——之二 103 条款24:继承的使用和滥用 110 条款25:面向对象程序设计 121 4 编译器防火墙和pimpl惯用法 123 条款26:将编译期依赖性降到最低——之一 ...
条款22:将成员变量声明为private declare data members private. 条款23:宁以non-member、non-friend替换member函数 prefer non-member non-friend functions to member functions. 条款24:若所有参数皆需类型...
条款22: 将成员变量声明为private 条款23: 宁以non-member、non-friend替换member函数 条款24:若有所参数皆需类型转换,请为此采用non-member函数 条款25:考虑写出一个不抛异常的swap函数 5.实现 条款26:尽...
9. **条款9:优先使用引用来传递大型对象** - 对于大对象,传递引用比复制更高效,因为不会进行实际的数据拷贝。 10. **条款10:考虑使用const成员函数** - const成员函数允许在不修改对象状态的情况下操作对象,有...
3. **条款3:区别`const`引用和非`const`引用** - `const`引用可以用作只读访问,而非`const`引用必须初始化,并且在生命周期内不能更改其绑定的值。 4. **条款4:了解`const`对象的生命周期** - `const`对象可以在...
3. **条款3:尽可能使用引用而非指针** - 引用没有空值,且强制关联到一个对象,提供了更安全的接口。 - 使用引用作为函数参数,可以确保函数不会接收到空指针。 4. **条款4:尽量不使用原始指针,除非你真的需要...
EFFECTIVE C++ 条款03 尽量使用const 思维导图 在 C++ 编程中,使用 const 关键字可以提高代码的可读性、可维护性和安全性。本文将详细介绍 EFFECTIVE C++ 的第三条款:尽量使用 const 思维导图。 一、const ...
#### 条款22:避免原地修改set和multiset的键 - **核心概念**:直接修改`set`和`multiset`中的元素可能导致容器状态不一致。 - **应用场景**: - 修改元素时,采用正确的策略以避免破坏容器结构。 #### 条款23:...
- **条款22:避免就地修改`std::set`和`std::multiset`的键** - 修改`std::set`或`std::multiset`中元素的键可能导致容器行为异常。 - 如果需要修改键,应先删除旧元素,再插入新元素。 - **条款23:考虑使用有序...
8. **条款8:使用`std::bind1st`和`std::bind2nd`固定函数参数** —— 这些工具可以创建偏函数对象,固定传给函数的第一个或第二个参数,便于在STL算法中使用。 9. **条款9:考虑使用`std::equal_range`而非`std::...