C++中成员函数的连续调用

首先说下什么是我所谓的连续调用,假设有一个类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(第三版)》

9 Replies to “C++中成员函数的连续调用”

        1. @houkai, 我觉得也不一定非要返回是const的,你去掉返回的const,注销掉另个重载的试试 看编译能否通过。
          我觉得之前编译不能通过可能是两个函数参数和返回值一样 不能构成重载吧

        2. @houkai, const成员调用者是const的this指针,但对象本身并不一定是const;只是为了保证const的成员不会改变对象数据采取的策略,这是我的理解

Leave a Reply

Your email address will not be published. Required fields are marked *