关于c ++:从函数返回this指针的严重用途是什么?

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++,已经表明这是一个非常有用的范例。