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 2 * (x + y);}
private:
    int x, y;
};

从逻辑接口上看,我们可以认为这个类有四个状态(width(), height(), Area(), totalLength()),尽管实际上我们并不是这么表示的。

有一点特别需要注意的是,当我们决定一个成员函数是不是const的时候,我们考虑的是它会不会导致逻辑状态的变更。

可以考虑这样一个容器类:

template<typename T>
class CacheVector
{
public:
    T lookup(int i ) const
    {
             assert(i >= 0 && 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成员函数里面修改特定成员,事实上也表明这个成员与类的逻辑状态没有关系。

时间: 2024-12-31 06:16:15

The constness of a method should makes sense from outside the object的相关文章

017: class, objects and instance: class method

类的方法 所谓类的方法,也就是,这个方法会绑定到一个类上面,实例化一个instance的时候,这个方法不会再重新生成 一份,它只有访问类级别的变量 它用@classmethod标签来标注这是一个class method. class Book(object): num = 10 # instance method, will be bound to an object def __init__(self, title, price): self.title = title self.price

jQuery基础教程-第8章-003Providing flexible method parameters

一.The options object 1.增加阴影效果 1 (function($) { 2 $.fn.shadow = function() { 3 return this.each(function() { 4 var $originalElement = $(this); 5 for (var i = 0; i < 5; i++) { 6 $originalElement 7 .clone() 8 .css({ 9 position: 'absolute', 10 left: $ori

018: class, objects and instance: static method

静态方法 使用@staticmethod来标记,该方法与某一个class或者某一个实例无关系,但可以用类名或者实例来调用,实际上这种写法应该一般只是为了组织代码. 实例方法的调用需要一个实例,声明时需要用self参数,调用时隐式传入该实例 类的方法调用需要一个类,其实该类本质上也是一个对象,声明时需要class参数,调用时隐式传入该类 静态方法调用不需要实实例也不需要类,其实该方法本质上与该类毫无关系,唯一的关系就是名字会该类有些关系, 用途应该只是为了组织一些代码,本质上和面向对象无关 cla

Method and system for providing security policy for linux-based security operating system

A system for providing security policy for a Linux-based security operating system, which includes a template policy module configured to set an authority using policy information of a downloaded application so that the template policy module can set

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 contained inside a class. its scope is limited to that class, and cannot affect variables outside that class, even global variables. if you need to affec

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 developer to easily work around the limitation set in place by the Same Origin Policy, in turn making it easy to communicate and expose javascript API's acros

iOS开发-mutating method sent to immutable object错误

今天干活的时候,遇到了这样一个问题.. 实在是太粗心了.mark下, 2014-01-05 11:44:34.762 softwareApp[1435:c07] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '*** -[JKDictionary setObject:forKey:]: mutating method sent to immutable objec

Java 反射机制[Method反射]

Java 反射机制[Method反射] 接着上一篇Java 反射机制[Field反射],通过调用Person类的setName方法将obj的name字段的Value设置为"callPersonSetNameMethod"来了解什么是Method反射.示例代码很简单,很容易理解. 可以看到Method.invoke()实际上并不是自己实现的反射调用逻辑,而是委托给sun.reflect.MethodAccessor来处理. 真正的反射是调用MethodAccessor.invoke()真

java反射机制之Method invoke执行调用方法例子

昨天在群里跟大家讨论了下java反射调用可变参数的问题,这个问题起因是我们需要反射调用另一个部门提供的方法,我同事说java不能反射调用可变参数的方法,于是我写了个demo证明了他这个观点的错误.但是测试过程中,有一点我不明白,就是反射调用可变参数的方法时,为什么一定要保证传入的参数数组长度为1,在群里跟大家讨论了很多,没有得到确切的答案,参照网上大牛写的东西和我自己跟源码的过程,记录如下: 1.两个类,一个父类,一个子类 [java] view plain copy print? packag