C++编程(8)

Pi table tableoperatorconst table t ifthis

Info iconThis preview shows page 1. Sign up to view the full content.

View Full Document Right Arrow Icon
This is the end of the preview. Sign up to access the rest of the document.

Unformatted text preview: 似没有改变其对象 的状态,然而,它却可能更新了某些用户不能 直接访问的细节,这通常被称为逻辑的常量性 例如:Date类可能有一个函数,返回日期的字 符串表示,构造字符串是相对费时的,实现中 可以为其保留一个副本,重复需要时返回该副 本即可 Beijing University of Posts & Telecommunications Beijing young@buptnet.edu.cn 逻辑的常量性 class Date{ string Date::string_rep() const bool cache_valid; { string cache; if(cache_valid == false){ void compute_cache_value(); Date* th = // … const_cast<Date*>(this); public: th->compute_cache_value(); string string_rep() const; th->cache_valid = true; //但是第一次调用string_rep时 } //需要构造cache字符串 return cache; } } 以上解决方式一点不优美,也无法保证总能工作,例如 Date d1; const Date d2; string s1 = d1.string_rep(); // ok string s2 = d2.string_rep(); //无定义行为 Beijing University of Posts & Telecommunications Beijing young@buptnet.edu.cn 10.2.7.2 可变的-mutable 为了解决上述显式“强制去掉const”的问题,可以 将所涉及的数据声明为mutable class Date{ string Date::string_rep() const mutable bool cache_valid; { mutable string cache; if(cache_valid == false){ void compute_cache_value(); compute_cache_value(); // … cache_valid = true; public: } string string_rep() const; return cache; } } Date d1; const Date d2; string s1 = d1.string_rep(); // ok string s2 = d2.string_rep(); // ok 以上技术使得前面 string_rep()的所有使用都 合理化了 Beijing University of Posts & Telecommunications Beijing young@buptnet.edu.cn 延迟求值(lazy evaluation) 若在某个表示中只有一部分允许改变,将这些成员声明为 mutable式最合适的,但是如果有大批量都需要修改,最好 将这些数据放入另外一个独立的对象里,并间接的访问它 struct cache{ bool valid; string rep; }; class Date{ cache* c; void cache_value() const; public: string string_rep() const; }; string Date::string_rep() const { if(!c->valid) { cache_value(); c->valid = true; } return c->rep; } 这种技术可以推广到各种方式的延迟求值 Beijing University of Posts & Telecommunications Beijing young@buptnet.edu.cn 10.2.8 结构和类 按照定义,一个struct就是一个类,但其成员默认为公用的, 也即:struct s{ … 是class s { public: … 的简写形式 一般情况下,struct被用于所有成员都是公用的那些类 这样的类并不是完整的类型,不过是个数据结构 结构中也可以有构造函数 class Date1 { struct Date2{ int...
View Full Document

Ask a homework question - tutors are online