C ++:什么时候应该使用“this->” PLUS参数通过引用

时间:2011-11-02 15:01:33

标签: c++

假设我们有一个班级

class Foo {
private:
        int PARTS;
public:
        Foo( Graph & );
        int howBig();
}

int Foo::howBig() { return this->PARTS; }
int Foo::howBig() { return PARTS;       }
Foo::Foo( Graph &G ) {
    <Do something with G.*>
}

howBig()中哪一个变种是正确的? &amp; -sign确保只有Graph对象的引用 传递给初始化函数? 在C中我只会做类似some_function(Graph * G)的事情, 但是在C ++中我们有&amp;和*型变量,永远不会理解 差异......

谢谢。

5 个答案:

答案 0 :(得分:3)

当您在成员函数中使用局部变量时,必须才能使用this

 Foo::MemberFunction(int a)
 {
      int b = a;  //b is initialized with the parameter (which is a local variable)
      int c = this->a; //c is initialized with member data a
      this->a = a; //update the member data with the parameter
 }

但是当你没有这种情况时,this是隐含的;你需要明确地写它,这意味着在你的代码中,howBig的两个版本都是正确的。

但是,在成员初始化列表中,规则是不同的。例如:

struct A
{
   int a;
   A(int a) : a(a) {}
};

在此代码中,a(a)表示使用参数a初始化成员数据a。您不必编写this->a(a)。只需a(a)即可。直观地理解这一点:

   A(int a) : a ( a ) {}
   //         ^   ^
   //         |   this is the parameter
   //         this is the member data

答案 1 :(得分:3)

您可以使用this->来解决dependent name问题,而无需明确说明基地的名称。如果基础的名称很大,这可以说可以提高可读性。

只有在编写模板时才会出现此问题,并且仅在成员函数使用this->时才适用,例如:

template <typename T>
struct bar {
    void func();
};

template <typename T>
struct foo : public bar {
    void derived()
    {
        func(); // error
        this->func(); // fine
        bar<T>::func(); // also fine, but potentially a lot more verbose
    }
};

答案 2 :(得分:0)

  

howBig() - 哪个变种是正确的?

在您的情况下,编译器将生成相同的代码

  

&amp; -sign确保只将Graph对象的引用传递给初始化函数?在C中我会简单地执行类似some_function(Graph * G)的操作,但在C ++中我们同时使用&amp;和*型变量,从不理解差异......

在方法中使用变量(语法除外)没有区别 - 在引用(&amp;)的情况下,想象你已经传递了一个不可取消引用的不可见指针 它(&amp;)可能会“更容易”供客户使用

答案 3 :(得分:0)

  1. 两种形式的Foo::howBig()都是正确的。我倾向于使用第二种,但有些情况涉及需要第一种模板的模板。
  2. 引用和指针之间的主要区别是缺少“空引用”。如果您不想复制整个对象但希望强制调用者传递一个参数,则可以使用引用参数。

答案 4 :(得分:0)

  1. 两者都是正确的。通常较短的代码更容易阅读,因此只有在需要消除歧义时才能使用this->(请参阅其他答案),否则您将无法理解符号的来源。

  2. 引用不能反弹,不能(容易)绑定到NULL,所以:

    1. 首选引用可以使用它们的指针。由于它们不能为空且无法删除,因此在使用使用引用的代码时,您可以减少担忧。
    2. 使用const引用而不是值来传递大的对象(超过16或20个字节),或者使用复杂的复制构造函数来节省复制开销,同时将其视为传递值。
    3. 尽量避免返回参数,无论是通过指针还是引用。返回复杂对象或std::pairboost::tuplestd::tuple(仅限C ++ 11或TR1)。它更具可读性。