| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> 《Effective C++》学习笔记(条款28:避免返回handles指向对象内部成分) -> 正文阅读 |
|
[C++知识库]《Effective C++》学习笔记(条款28:避免返回handles指向对象内部成分) |
最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!! 假如我们写一个表示矩形的类
为了矩形类尽可能小,把两个点放在一个 struct 内,再让
这样的设计可以通过编译,但确实错误的。实际上它是自我矛盾的。因为
这带给我们两个教训: 第一,成员变量的封装性最多只等于“返回其引用”的函数的访问级别。本例中的 第二,如果一个函数返回了指向储存在对象外部的数据成员的引用,即使这个函数声明为了const,调用这个函数的人也能修改这个成员(见条款3 bitwise constness 的局限性) 除了引用,返回指针和迭代器的结果也是一样的,原因也一样。引用,指针,迭代器都是所谓的"句柄"(handle),即接触对象的某种方式。直接返回句柄总会带来破坏封装的风险,这也导致声明为 const 的函数并不是真正的 const。 还要注意的是,"内部成员"除了内部数据还包括内部函数,即声明为私有(private)或保护(protected)的函数,因此对于内部函数也是一样,不要返回它们的句柄,否则用户也可以通过返回的函数指针来调用它们,这样私有的成员函数也相当于变成了公有。(虽然返回指针指向某个成员函数的情况很少,但也需要注意) 回到刚才的例子上,我们刚才遇到的问题,只要对它们的返回类型加上 const 即可:
这样用户就只能读取矩形的 即使这样,返回句柄仍然会带来问题——野句柄(dangling handles)。这种句柄所指东西(的所属对象)不复存在。这种“不复存在的对象”最常见的就是函数返回值。例如某个函数返回 GUI 对象的矩形外框:
用户可能会这样使用代码:
对 这就是为什么函数返回指向内部成员"句柄"的总是危险的,不管你的"句柄"是指针,引用还是迭代器,不管你的返回值是不是 const,也不管那个返回句柄的成员函数是不是 const。这里唯一的关键是,有个句柄被传出去了,这时你就暴露在句柄比其所指对象更长寿的风险中。 但这不代表要杜绝这种做法,有时候必须得这样做,例如索引[]操作符,用来拿出容器(比如std::vector)里的个别元素,它返回的是指向容器里的数据的引用(见条款3),那些数据会随着容器被销毁而销毁。尽管如此,这样的函数毕竟是例外,不是常态。
|
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 8:00:30- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |