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<<" -const\n";
	return *this;
}
person& person::get(){
	cout<<name<<" -not const\n";
	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(第三版)》

© 2009, kangzj. 版权所有.

Tags: , , , , ,
| 十月 5th, 2009 | Posted in 编程算法 |

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

  1. houkai Says:

    const person& get() const;
    一下就限制死了 又是常函数 还要返回常引用!!!

    [回复]

    kangzj 回复:

    @houkai, 语言就是这样要求的,const函数只能返回const的引用

    [回复]

    kangzj 回复:

    @houkai, 因为调用const型函数的this指针本身就是const,返回类型也必须是const,否则编译都不通过的

    [回复]

    houkai 回复:

    @kangzj, 也是 因为常对象只能调用常函数 所以返回的this必须是常对象

    [回复]

    houkai 回复:

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

    [回复]

    kangzj 回复:

    @houkai, 我说的编译不能过的时候是没有重载的时候,只有那一个函数的时候,你可以试下~ :wink:

    [回复]

    kangzj 回复:

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

    [回复]

  2. 阿修 Says:

    我飘我飘,我得意的飘~~~C++的技术贴,看不明白,无视无视~~ :idea:

    [回复]

    kangzj 回复:

    @阿修, 呵呵,欢迎飘过啊~

    [回复]

Leave a Reply