《Effective C++》——条款20:宁以pass-by-reference-to-const替换pass-by-value
2024-09-04 09:33:03
切割(slicing)问题
请看下面代码:
class Window
{
public:
...
std::string name()const; //返回窗口名称
virtual void display()const; //显示窗口和其内容
};
class WindowWithScrollBars:public Window
{
public:
...
virtual void display()const;
};
现在假设你希望写个函数打印窗口名称,然后显示该窗口,代码如下所示:
void printNameAndDisplay(Window w)//不正确,参数可能被切割
{
std::cout << w.name();
w.display();
}
WindowWithScrollBars wwsb;
printNameAndDisplay(wwsb);//将调用Window::display();
在调用printNameAndDisplay函数时,参数永远都会被构造成一个Window对象。
解决的办法是以常引用的方式传递w:
void printNameAndDisplay(const Window& w)
{
std::cout << w.name();
w.display();
}
WindowWithScrollBars wwsb;
printNameAndDisplay(wwsb);//将调用WindowWithScrollBars::display();
因为references往往以指针实现出来,因此传递引用通常意味着真正传递的是指针。
最新文章
- 用Log Parser Studio分析IIS日志
- [转] Java序列化与反序列化
- python 安装pillow
- INSERT INTO .. ON DUPLICATE KEY更新多行记录
- SQL SERVER分区表
- JS面向对象组件(一) ---包装对象与原型链
- HeadFirst设计模式之观察者模式
- JavaFX 开发是遇到一些问题记录
- 海量数据存储之Key-Value存储简介
- IT痴汉的工作现状16-职业发展
- 在SurfaceView中自由书写和擦除
- C++中内存泄漏的检测方法介绍
- noip 2016 提高组总结(不是题解)
- 高橋君とカード / Tak and Cards
- 【js实例】js中的5种基本数据类型和9种操作符
- hive学习03-求一年中的最大温度
- [转] js前端解决跨域问题的8种方案(最新最全)
- bypy 用法
- shell命令行执行python(解析json)
- DOS和批处理基本命令
热门文章
- node.js, node-debug, node-inspector, npm 等等的使用问题解决
- github 上 python 的优秀库推荐列表
- BGP Basic Knowledge
- Maven- 使用Maven构建一个可执行jar
- 模版抽离 优化url
- PHP/Yii2操作Cookie,常见问题以及注意事项
- mysql库安装
- $Java-json系列(二):用JSONObject解析和处理json数据
- $《第一行代码:Android》读书笔记——第2章 Activity
- [原创]spring及springmvc精简版--IOC