以下是一个奇特的代码:
class B
{
private:
int sum;
public:
B ()
{
sum = 0;
}
B& add (int number)
{
sum =+ number;
return *this;
}
};
int main ()
{
B obj;
obj.add (1).add (2).add (3). add (4);
}
很好,从函数调用中返回this指针的“严重”用途是什么?
答案 0 :(得分:4)
一个例子是;
class basic_ostream
: ...
{
basic_ostream& operator<<(bool n);
你真的想要返回这个以便能够链接到;
std::cout << boolValue << std::endl;
答案 1 :(得分:2)
mycode $ fgrep -r 'return *this' /usr/include/c++/4.4.3 | wc -l
592
mycode $
答案 2 :(得分:2)
这是Named Parameter Idiom的一个用途。这取决于方法链。
class Person;
class PersonOptions
{
friend class Person;
string name_;
int age_;
char gender_;
public:
PersonOptions()
: age_(0), gender_('U')
{}
PersonOptions& name(const string& n) { name_ = n; return *this; }
PersonOptions& age(int a) { age_ = a; return *this; }
PersonOptions& gender(char g) { gender_ = g; return *this; }
};
class Person
{
string name_;
int age_;
char gender_;
public:
Person(const PersonOptions& opts)
: name_(opts.name_), age_(opts.age_), gender_(opts.gender_)
{}
};
Person p = PersonOptions().name("George").age(57).gender('M');
Person p = PersonOptions().age(25).name("Anna");
答案 3 :(得分:1)
最初的原因是为了链接数学运算,如下所示:
class mynumberclass {
int internal;
public:
mynumberclass(int);
mynumberclass operator+(const mynumberclass&) const;
mynumberclass operator-(const mynumberclass&) const;
mynumberclass operator*(const mynumberclass&) const;
mynumberclass operator/(const mynumberclass&) const;
mynumberclass operator%(const mynumberclass&) const;
mynumberclass& operator+=(const mynumberclass&);
mynumberclass& operator-=(const mynumberclass&);
mynumberclass& operator*=(const mynumberclass&);
mynumberclass& operator/=(const mynumberclass&);
mynumberclass& operator%=(const mynumberclass&);
};
int main() {
mynumberclass a(3);
mynumberclass b(4);
mynumberclass c = (a * b + b) / 2; //this chains 3 of the above operators
}
没有链接,代码必须如下所示:
int main() {
mynumberclass a(3);
mynumberclass b(4);
mynumberclass c(a);
c *= b;
c += b;
c /= 2;
}
FredLarson还提到了命名参数成语,这当然是一个很棒的东西,你可以使用链接。
答案 4 :(得分:0)
首先想到的是链接函数以对同一对象执行操作。 jQuery虽然不是C ++,但已经表明这可能是一个非常有用的范例。