繁体   English   中英

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

[英]C++: when we should use “this->” PLUS parameters by reference

假设我们有一堂课

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()变量中的哪一个是正确的? &符号可确保仅将Graph对象的引用传递给初始化函数? 在CI中可以简单地执行诸如some_function(Graph * G)之类的操作,但是在C ++中,我们同时具有&和*类型的变量,但从未理解它们之间的区别...

谢谢。

当你的成员函数中的局部变量,那么你必须要使用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

您可以使用this->解决从属名称问题,而不必显式拼写基础名称。 如果基地的名字很大,那无疑可以提高可读性。

仅当编写模板并且仅当它们是成员函数时才使用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
    }
};

howBig()变量中的哪一个是正确的?

两种情况下,编译器都会产生相同的代码

&符号可确保仅将Graph对象的引用传递给初始化函数? 在CI中可以简单地执行诸如some_function(Graph * G)之类的操作,但是在C ++中,我们同时具有&和*类型的变量,但从未理解它们之间的区别...

在方法中使用变量没有什么区别(语法除外)-在引用(&)的情况下,假设好像已经传递了一个不可见的指针即可使用,而无需取消引用它(&)让客户更轻松地使用

  1. 两种形式的Foo::howBig()都是正确的。 我一般倾向于使用第二个,但是在某些情况下,涉及模板的情况下需要使用第一个。
  2. 引用和指针之间的主要区别是缺少“空引用”。 当您不想复制整个对象但要强制调用者传递一个对象时,可以使用引用参数。
  1. 两者都是正确的。 通常更短的代码更容易阅读,所以只能用this->如果你需要它来消除歧义(见其他答案),或者如果你原本无法理解其中符号从何而来。

  2. 引用不能反弹,也不能(轻松)绑定为NULL,因此:

    1. 最好使用可以使用它们的指针的引用。 由于它们不能为null且不能删除,因此在使用使用引用的代码时,您不必担心太多事情。
    2. 使用const引用而不是值来传递较大的对象(超过16或20个字节),或者使用复杂的复制构造函数来节省复制开销,同时将其视为按值传递。
    3. 尝试完全避免通过指针或引用返回参数。 而是返回复杂对象或std::pairboost::tuplestd::tuple (仅C ++ 11或TR1)。 更具可读性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM