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的更多相关文章

  1. 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 ...

  2. inside when() you don't call method on mock but on some other object

    错误原因:调用静态方法,要事先引入静态类,否则mock的时候会默认为测试的类 解决方法:@PrepareForTest({SecurityContextHolder.class})引入静态类 注:@P ...

  3. 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 ...

  4. 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 ...

  5. 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 ...

  6. Java 反射机制[Method反射]

    Java 反射机制[Method反射] 接着上一篇Java 反射机制[Field反射],通过调用Person类的setName方法将obj的name字段的Value设置为"callPerso ...

  7. 【java】method.invoke(方法底层所属对象/null,new Object[]{实际参数})

    反射调方法时无论是静态/非静态,固定/可变参数,都有Object对象数组对参数进行包装. package com.tn.clas; import java.lang.reflect.Method; i ...

  8. method.invoke()s

    在框架中经常会会用到method.invoke()方法,用来执行某个的对象的目标方法.以前写代码用到反射时,总是获取先获取Method,然后传入对应的Class实例对象执行方法.然而前段时间研究inv ...

  9. java中Method.invoke方法参数解析

    通过发射的机制,可以通过invoke方法来调用类的函数.invoke函数的第一个参数是调用该方法的实例,如果该方法是静态方法,那么可以用null或者用类来代替,第二个参数是变长的,是调用该方法的参数. ...

随机推荐

  1. DispatcherServlet

    <servlet> <servlet-name>chapter2</servlet-name> <servlet-class>org.springfra ...

  2. validate插件:验证密码没有空格 用户名是5-10位 至少包含数字和大小写字母中的两种字符

    //校验密码是否含有空格 jQuery.validator.addMethod("notblank", function(value, element) { var pwdblan ...

  3. hdu 1710 二叉树的遍历

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1710 大意:给出一个二叉树的前序和中序,求其后序遍历 ps:1.在写链表时,需要写明typedef str ...

  4. bootstrap的弹出框

    data-toggle="popover";//以弹出框事件触发 data-content="弹出框中内容"; data-placement="弹出框 ...

  5. [saiku] 集成单点登录

    思路: 自定义一个loginCallbackFilter用于单点登录成功后执行模拟用户认证授权登录的操作. 当授权成功后所有配置需要授权才能访问的url就再也不会被任何filter拦截,可随意访问了. ...

  6. python中urllib和urllib2的简单用法

    import urllib #引入urllib模块,这里用urllib2也可以 fpage = urllib.urlopen( url ) #打开网页:例如url=‘http://www.xxx.co ...

  7. c++表达式的一些小小的注意事项

    3+12>>1 = 7; 12>>1+3 =0; 3+(12>>1)=9;

  8. 模拟器的tableView的分割线不显示

    只有iOS9和iPhone6 plus模拟器上TableView分割线不会显示. 原因: 由于iPhone6 plus的分辨率较高,开发的时候同常都使用command + 3 或者 command + ...

  9. 【堆栈应用一】一个数divided=几个最小质因数的乘积

    /******************************************堆栈:一个数divided几个质因数(质因数的乘积为N)***************************** ...

  10. 线性渐变--linear-gradient

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head>    < ...