首先说下什么是我所谓的连续调用,假设有一个类person:
person a; a.set("kangzj").get().set("abc"); |
加红的部分即为本文要说的连续调用。
怎么实现呢,很简单,只要让成员函数返回一个指向当前对象的引用即可,于是,我这样定义这个类:
class person{ private: string name; public: const person& get() const; person& set(string n); }; const person& person::get(){ cout<<name; return *this; } person& person::set(string t){ name=t; return *this; } |
Ok,可以使用了。这样的句子还是编译不会成功:
a.set("kangzj").get().set("abitno"); |
因为调用const型成员函数的this指针是const型,指向的对象也是const型,无法改变对象的成员变量。也就是说没法执行set操作,而出错。
怎样来解决这个问题呢?把get()重载,在单独调用get的时候调用const型的方法,在连续调用的时候调用非const的方法(当然都是自动的),基于这种思想可以这样来设计类(下面代码可以直接编译运行):
#include <iostream> #include <string> using namespace std; class person{ private: string name; public: const person& get() const; person& get(); person& set(string n); }; const person& person::get() const{ cout<<name<<" -constn"; return *this; } person& person::get(){ cout<<name<<" -not constn"; return *this; } person& person::set(string t){ name=t; return *this; } int main() { person a; a.set("kangzj").get().set("ddd").get(); a.get(); const person b; b.get(); } |
全文完,欢迎讨论。
参考资料:《C++ Primer(第三版)》
我飘我飘,我得意的飘~~~C++的技术贴,看不明白,无视无视~~ 💡
@阿修, 呵呵,欢迎飘过啊~
const person& get() const;
一下就限制死了 又是常函数 还要返回常引用!!!
@houkai, 语言就是这样要求的,const函数只能返回const的引用
@houkai, 因为调用const型函数的this指针本身就是const,返回类型也必须是const,否则编译都不通过的
@kangzj, 也是 因为常对象只能调用常函数 所以返回的this必须是常对象
@houkai, 我觉得也不一定非要返回是const的,你去掉返回的const,注销掉另个重载的试试 看编译能否通过。
我觉得之前编译不能通过可能是两个函数参数和返回值一样 不能构成重载吧
@houkai, 我说的编译不能过的时候是没有重载的时候,只有那一个函数的时候,你可以试下~ 😉
@houkai, const成员调用者是const的this指针,但对象本身并不一定是const;只是为了保证const的成员不会改变对象数据采取的策略,这是我的理解