What are the serious uses of returning the this pointer from a function?
下面是一个花哨的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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); } |
好的,从函数调用返回这个指针的"严重"用途是什么?
型
一个例子是:
1 2 3 4 | class basic_ostream : ... { basic_ostream& operator<<(bool n); |
你真的想把这个还回去就能链到;
1 | std::cout << boolValue << std::endl; |
号
型
它的一个用途是用于命名参数习语。这取决于方法链接。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | 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"); |
。
型
1 2 3 | mycode $ fgrep -r 'return *this' /usr/include/c++/4.4.3 | wc -l 592 mycode $ |
型
最初的原因是链接数学运算,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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 } |
如果不链接,该代码必须如下所示:
1 2 3 4 5 6 7 8 | int main() { mynumberclass a(3); mynumberclass b(4); mynumberclass c(a); c *= b; c += b; c /= 2; } |
。
Fredrarson还提到了命名参数习语,这无疑是一个很棒的东西,您可以使用链接。
型
首先想到的是链接函数以在同一对象上执行操作。jQuery,虽然不是C++,已经表明这是一个非常有用的范例。