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(第三版)》


Posted

in

by

Comments

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

  1. 阿修 Avatar

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

    1. kangzj Avatar

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

  2. houkai Avatar

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

    1. kangzj Avatar

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

    2. kangzj Avatar

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

      1. houkai Avatar

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

        1. houkai Avatar

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

          1. kangzj Avatar

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

        2. kangzj Avatar

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

Leave a Reply

%d bloggers like this: