从函数返回this指针的严重用途是什么?

时间:2012-03-13 16:23:20

标签: c++ pointers this

以下是一个奇特的代码:

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指针的“严重”用途是什么?

5 个答案:

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