class Persion
{
public:
int age;
string name;
Persion(int age, string name)
{
this->age = age;
this->name = name;
}
Persion* addAge(int age)
{
this->age += age;
return this;
}
};
void text()
{
Persion p = Persion(0, "sdfds");
//这种编程的思想叫链式编程
p.addAge(10)->addAge(10)->addAge(10);
cout << "年龄累加:" << p.age << endl;
}
代码所示:addAge函数返回值是一个Persion的类型,this作为返回值,this是一个指针,指向当前的对象。
当定义一个对象调用addAge时,返回值是一个指针,指向的还是本对象,调用完毕之后,返回值this仍然指向p对象,所以连续的调用可以做累加操作。
再看下边这段代码:
class Persion
{
public:
int age;
string name;
Persion(int age, string name)
{
this->age = age;
this->name = name;
}
Persion& addAge(int age)
{
this->age += age;
return *this;
}
};
void text()
{
Persion p = Persion(0, "sdfds");
//这种编程的思想叫链式编程
p.addAge(10).addAge(10).addAge(10);
cout << "年龄累加:" << p.age << endl;
}
这段和上边那个是一样的,就是把指针改成了引用,众所周知,引用即指针,没有区别,当做扩展
咱们再来看一段代码:
class Persion
{
public:
int age;
string name;
Persion(int age, string name)
{
this->age = age;
this->name = name;
}
Persion addAge(int age)
{
this->age += age;
return *this;
}
};
void text()
{
Persion p = Persion(0, "sdfds");
//这种编程的思想叫链式编程
p.addAge(10).addAge(10).addAge(10);
cout << "年龄累加:" << p.age << endl;
}
看:这段代码把引用去掉了,输出为啥从30变成10了呢??
在第一次调用完毕之后,addAge返回一个类对象*this没错,但是这个对象不再是p本身,而是p的一个拷贝,只要不是指针或者引用的赋值,都会去调用系统提供的默认拷贝构造函数,此时p变成了P‘,所以以值的方式返回必定会创建一个新的对象,年龄是不可能累加的。