C++核心准则C.4:只有直接访问表达的函数,才应该成为成员
C.4: Make a function a member only if it needs direct access to the representation of a class
C.4:只有直接访问表达的函数,才应该成为成员。
Reason(原因)
Less coupling than with member functions, fewer functions that can cause trouble by modifying object state, reduces the number of functions that needs to be modified after a change in representation.
和使用成员函数相比普通函数耦合性略低,一方面可以通过修改对象状态带来麻烦的函数会变少,另一方面可以减少改变类表达时需要修改的函数的数量。
Example(示例)
class Date {
// ... relatively small interface ...
};
// helper functions:
Date next_weekday(Date);
bool operator==(Date, Date);
The "helper functions" have no need for direct access to the representation of a Date
.
“帮助函数”没有需求要直接访问Data的表达。
Note(注意)
This rule becomes even better if C++ gets "uniform function call".
如果C++可以导入“统一函数调用”这条准则甚至会变得更完美。
译者注:“uniform funcation call”是C++之父本人提出的C++语法建议。核心是对于一个形如f(x,y)的函数调用,如果不存在函数f(x,y),可以转而调用x.f(y)。有了这个语法,编写非成员帮助函数的灵活性将会进一步加大。
Exception(例外)
The language requires virtual
functions to be members, and not all virtual
functions directly access data. In particular, members of an abstract class rarely do.
(C++)语言要求虚函数必须是成员,而且不是所有的虚函数都会直接访问数据。通常抽象类的成员很少直接访问数据。
Note multi-methods.
多方法
链接:
https://parasol.tamu.edu/~yuriys/papers/OMM10.pdf)
Exception(类外)
The language requires operators =
, ()
, []
, and ->
to be members.
语言要求=,(),[]和->运算符作为成员存在。
Exception(列外)
An overload set may have some members that do not directly access private
data:
一组重载函数中也许会有某个成员不会直接访问私有数据。
class Foobar {
public:
void foo(long x) { /* manipulate private data */ }
void foo(double x) { foo(std::lround(x)); }
// ...
private:
// ...
};
Exception(例外)
Similarly, a set of functions may be designed to be used in a chain:
类似地,一组函数可能被设计用来串联使用。
x.scale(0.5).rotate(45).set_color(Color::red);
Typically, some but not all of such functions directly access private
data.
通常,有些但不是所有这样的函数都会直接访问私有数据
Enforcement(实施建议)
Look for non-
virtual
member functions that do not touch data members directly. The snag is that many member functions that do not need to touch data members directly do.寻找没有直接接触数据成员的非虚成员函数。讽刺的是存在许多不需要直 接访问数据成员的成员函数。
Ignore
virtual
functions.忽略虚函数。
Ignore functions that are part of an overload set out of which at least one function accesses
private
members.
如果一组重载函数中至少有一个函数访问了私有成员,那么忽略其他函数。
Ignore functions returning
this
.忽略返回this指针的函数。
英文原文地址:
https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c3-represent-the-distinction-between-an-interface-and-an-implementation-using-a-class
觉得本文有帮助?欢迎点赞并分享给更多的人。
更新文章,请关注微信公众号【面向对象思考】
C++核心准则C.4:只有直接访问表达的函数,才应该成为成员相关推荐
- c 函数多次声明_C++核心准则C.132:不要没有理由就将函数声明为虚函数
岫玉 C.132: Don't make a function virtual without reason C.132:不要没有理由就将函数声明为虚函数 Reason(原因) Redundant v ...
- php 语法 条件变量,C ++核心准则:注意条件变量的陷阱
今天,我写了一篇关于条件变量的恐怖文章.您应该意识到条件变量的这一问题.C ++核心准则CP 42仅声明:"不要无条件等待". 等待!条件变量支持一个非常简单的概念.一个线程准备一 ...
- modbus软件开发实战指南_C++核心准则?GSL:指南支持库
GSL: Guidelines support library GSL:指南支持库 The GSL is a small library of facilities designed to suppo ...
- 开源压缩算法brotli_Google的Brotli压缩算法,C ++核心准则以及更多新闻
开源压缩算法brotli 在本周的开源新闻综述中,我们将介绍Google的Brotli压缩算法,适用于GitHub的Classroom,C ++ Core Guidelines等! 2015年9月20 ...
- tailwindcss 官网(五)核心概念:添加新的功能类、函数与指令(@tailwind、@apply、!important、@layer、@variants、 theme())、px、em、rem
tailwindcss 官网(五)核心概念:添加新的功能类.函数与指令(@tailwind.@apply.!important.@layer.@variants.@responsive. theme( ...
- php 访问url curl,推荐PHP一个用CURL访问URL的函数
推荐PHP一个用CURL访问URL的函数 其实,php访问url的方式有好几种,这里只介绍其中一种curl方式,觉得有用的就收藏. /** * curl发送HTTP请求方法 * @param $url ...
- C++学习笔记(十)成员变量和成员函数分开存储、this指针、空指针访问成员函数、const修饰成员函数、友元
1.成员变量和成员函数分开存储 //1.在C++中,类内的成员变量和成员函数分开存储 //2.只有非静态成员变量才属于类的对象上 //空对象占用内存空间为:1 //C++编译器会给每个空对象也分配一个 ...
- C++核心准则CP.1: 设想你的代码会成为多线程程序的一部分
CP.1: Assume that your code will run as part of a multi-threaded program CP.1: 设想你的代码会成为多线程程序的一部分 Re ...
- 使用说明 vector_C++核心准则编译边学-F.20 输出结果时应该使用返回值
F.20: For "out" output values, prefer return values to output parameters(输出结果时更应该使用返回值而不是输 ...
最新文章
- java B2B2C springmvc mybatis电子商务平台源码-Consul服务发现原理...
- IPhone 设备状态、闪光灯状态
- 应该怎么做一个登录功能?
- 俯瞰云原生,这便是供应层
- gz解压命令 linux_Linux日常篇-解压缩命令
- css碎步测量,CORS系统控制点点位可靠性研究.doc
- Cubic interpolation立方插值
- Jvm(29),理解升级----C语言中的堆和栈的区别 (可以借鉴)
- 戴尔笔记本怎么重装系统win11,win11系统安装方法
- GDAL使用DEM数据计算山体阴影(Hillshade)
- DevExpress v15.1:Reporting控件功能增强(二)
- JBoss下载与JBoss安装
- 用户登录,前后端如何交互判断是否登录超时!
- 2013年企业邮箱的发展:任重而道远
- css属性:min-height是什么意思?
- KMPlayer怎么加速播放 KMPlayer加速播放方法
- 通过路由器SF上网设置方法.....
- 关于依赖注入和依赖属性
- C++实现高质量游戏游戏!!!不点开你会后悔的!!!包括 买彩票游戏 勇者游戏 等 5个游戏
- 项目管理 | 怎么开项目启动会?
热门文章
- 软件测试基础-测试用例设计方法(等价类+边界值)
- 漫谈软件测试的心理学和经济学
- 刀片服务器故障信息可以从哪些获取,Cisco B200 M3刀片服务器Discovery失败故障处理...
- 计算机里没有游戏文件共享,共享文件联机游戏有Win7电脑一切简单
- “行业寒冬”,字节10年测试工程师给在座的测试人一些涨薪建议
- 曝光机与曝光能量_曝光机能量转换卡,适合川宝,志圣全自动机
- CAD2012二次开发-导航栏的实现
- [技术翻译]9个可以让你在2020年成为前端专家的项目
- 【批量删除仓库】GitHub 如何使用Python调用接口批量删除GitHub仓库
- 《IDENTITY-BASED CRYPTOSYSTEMS AND SIGNATURE SCHEMES 》-1984_Adi Shamir(中文翻译)