假设我们有一个班级
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;和*型变量,永远不会理解 差异......
谢谢。
答案 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)
Foo::howBig()
都是正确的。我倾向于使用第二种,但有些情况涉及需要第一种模板的模板。答案 4 :(得分:0)
两者都是正确的。通常较短的代码更容易阅读,因此只有在需要消除歧义时才能使用this->
(请参阅其他答案),否则您将无法理解符号的来源。
引用不能反弹,不能(容易)绑定到NULL,所以:
std::pair
或boost::tuple
或std::tuple
(仅限C ++ 11或TR1)。它更具可读性。