The constness of a method should makes sense from outside the object
C++的encapsulation机制使得我们可以使得一个类的逻辑接口和内部表示有很大的差异,比如下面这个矩形类:
class Rectangle
{
public:
int width() const {return x;}
int height() const {return y;}
int Area() const {return x * y;}
int totalLength() const {return * (x + y);}
private:
int x, y;
};
从逻辑接口上看,我们可以认为这个类有四个状态(width(), height(), Area(), totalLength()),尽管实际上我们并不是这么表示的。
有一点特别需要注意的是,当我们决定一个成员函数是不是const的时候,我们考虑的是它会不会导致逻辑状态的变更。
可以考虑这样一个容器类:
template<typename T>
class CacheVector
{
public:
T lookup(int i ) const
{
assert(i >= && i < size);
cache = _data[i];
return _data[i];
}
private:
T* _data;
size_t _size;
mutable T cache;
};
这段代码有两点值得关注:为什么lookup方法被设计成const的?mutable起什么作用?
因为lookup并没有改变CacheVector<T>的逻辑状态,尽管我们更新了缓存,但这个对于类的使用者而言是不可见的。
mutable关键字的作用就是在const成员函数里面修改特定成员,事实上也表明这个成员与类的逻辑状态没有关系。
The constness of a method should makes sense from outside the object的更多相关文章
- Error:(23, 0) Could not find method implementation() for arguments [directory 'libs'] on object of t
Error:(28, 0) Could not find method implementation() for arguments [com.android.support:appcompat-v7 ...
- inside when() you don't call method on mock but on some other object
错误原因:调用静态方法,要事先引入静态类,否则mock的时候会默认为测试的类 解决方法:@PrepareForTest({SecurityContextHolder.class})引入静态类 注:@P ...
- What is the difference between routine , method , procedure , function ? please explain it with example?
a method is named and attached to an object. so, for example, a method is like a function but is con ...
- Core Java Volume I — 4.5. Method Parameters
4.5. Method ParametersLet us review the computer science terms that describe how parameters can be p ...
- A javascript library providing cross-browser, cross-site messaging/method invocation. http://easyxdm.net
easyXDM - easy Cross-Domain Messaging easyXDM is a Javascript library that enables you as a develope ...
- Java 反射机制[Method反射]
Java 反射机制[Method反射] 接着上一篇Java 反射机制[Field反射],通过调用Person类的setName方法将obj的name字段的Value设置为"callPerso ...
- 【java】method.invoke(方法底层所属对象/null,new Object[]{实际参数})
反射调方法时无论是静态/非静态,固定/可变参数,都有Object对象数组对参数进行包装. package com.tn.clas; import java.lang.reflect.Method; i ...
- method.invoke()s
在框架中经常会会用到method.invoke()方法,用来执行某个的对象的目标方法.以前写代码用到反射时,总是获取先获取Method,然后传入对应的Class实例对象执行方法.然而前段时间研究inv ...
- java中Method.invoke方法参数解析
通过发射的机制,可以通过invoke方法来调用类的函数.invoke函数的第一个参数是调用该方法的实例,如果该方法是静态方法,那么可以用null或者用类来代替,第二个参数是变长的,是调用该方法的参数. ...
随机推荐
- JavaScript ——闭包理解
昨天晚上听别人谈起闭包这个东西,虽然对js有一点了解但却丝毫没有印象,今天也没什么事就顺便研究了一下满足好奇宝宝.整合于网上的理解,记录一下. 一.闭包的作用域 要理解闭包,首先必须理解Javascr ...
- python 练习 17
#!/usr/bin/python # -*- coding: UTF-8 -*- f1 = 1 f2 = 1 for i in range(1,21): print '%12d %12d' % (f ...
- selenium+python笔记10
#!/usr/bin/env python # -*- coding: utf-8 -*- """ 我们多添加一些测试场景,比如:删除邮件,查找邮件,发送邮件等等 &qu ...
- [Java] Java 获取数据库所有表基本信息和表中的所有列基本信息代码
废话不多说.上代码 import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import ...
- [redis] redis 存取键值对常用的三种使用方式 - Jedis、JedisPool、Jedis分布式
|-Jedis 普通方式 |-JedisPool 连接池方式(需要引入pool相关jar) |-Jedis 分布式 (需要引入pool相关jar) 引入jedis2.7.0和commons.pool2 ...
- SQL SERVER数据库索引、外键查找
1.索引查找 select a.name as tabname ,h.name as idname,h.type_descfrom sys.objects as a right join sys.in ...
- KVC与KVO的进阶使用
本篇主要介绍键-值编码KVC,键值观察KVO的进阶使用的一些技巧主要是一下两个方面: KVC的集合操作符 KVO的手动实现方式 KVC集合操作符 关于集合操作符在苹果官方文档搜索Collection ...
- Qt之QSequentialAnimationGroup
简述 QSequentialAnimationGroup类提供动画的串行组. QSequentialAnimationGroup是一个串行运行动画的QAnimationGroup,在另一个动画播放结束 ...
- 直接取HANA数据库数据,动态QUERY
"COPY别人的TYPE-POOLS:ADBC. DATA LV_SQL TYPE STRING. DATA LV_FROM TYPE STRING. DATA LV_WHERE TYPE ...
- ANGULAR JS PROMISE使用
Promise是一种模式,以同步操作的流程形式来操作异步事件,避免了层层嵌套,可以链式操作异步事件. 我们知道,在编写javascript异步代码时,callback是最最简单的机制,可是用这种机制的 ...