2

我正在学习来自 Java 背景的 C++(从多年前了解一点 C)...

在 Java 中,通常的做法是在构造函数中使用“this”来区分作为参数传入构造函数的变量和类中声明的变量:

class Blabla {

    private int a;
    private int b;

    Blabla(int a, int b){
        this.a = a;
        this.b = b;
    }
}

我喜欢这个,因为变量 Blabla.a 和作为参数传入构造函数的变量代表相同的东西,所以它们应该具有相同的名称感觉合乎逻辑......

是否可以在 C++ 中做到这一点?

4

4 回答 4

6

是的,您可以使用this来引用成员变量。也就是说,您经常会发现您的代码在惯用的 C++ 中如下所示:

class Blabla {
  private:
    int a_;
    int b_;

  public:
    Blabla(int a, int b) : a_(a), b_(b) {}
};

如您所见,您通常不会将访问控制说明符(publicprotectedprivate应用于每个成员,而是将它们分组。

此外,如果您使用上面使用的初始化类型,则成员会被初始化两次 - 一次是在创建对象时使用默认构造函数(基本上是在执行大括号内的代码之前),第二次是在分配期间到this->a.

于 2009-12-09T18:08:45.873 回答
4

是的,你使用this->a = a;

另请注意,在 C++ 中,您应该在构造函数中使用初始化列表。

class Blab 
{
    public:
        Blab(int a, int b)
           :m_a(a),
            m_b(b)
        {
        }

    private:
        int m_a;
        int m_b;
};

编辑:

您可以:a(a), b(b)在初始化列表中对数据成员 a 和传递给构造函数的参数 a 使用相同的名称。它们不必不同,但有些人认为对成员变量名称使用不同的命名约定是更好的做法。我在上面的示例中使用了不同的名称来帮助阐明初始化列表实际上在做什么以及它是如何使用的。如果您愿意,可以使用this->a设置另一个成员变量。例如如果成员变量和参数变量都是a和b,

class MyClass
{
    public:
        MyClass(int a, int b);
    private:
        int a;
        int b;
};

// Some valid init lists for the MyClass Constructor would be
:a(a), b(b)       // Init member a with param a and member b with parameter b
:a(a), b(this->a) // Init member a with param a and init member b with member a (ignores param b)
:a(5), b(25)      // Init member a with 5 and init member b with 25 (ignoring both params)

应该提到的是,初始化列表应该按照它们在类定义中出现的顺序来初始化成员变量。当你不这样做时,一个好的编译器会给你警告。

于 2009-12-09T18:03:00.377 回答
1

由于在 C++this中是一个指针,因此您可以使用this->var.

请注意,C++ 往往具有与 Java 不同的约定,并且通常_var用于私有变量,而不是通常的 Java 方式的this.var. 当然,这取决于您要使用的约定。

于 2009-12-09T18:05:12.920 回答
0

只是总结一下并将其放入一个答案中。

如果您想使用 this->a 方法,它看起来像这样

class Blabla 
{
    private:
        int a;
        int b;

    public:
        Blabla(int a, int b);
}

Blabla::Blabla(int a, int b)
{
    this->a = a;
    this->b = b;
}

或者,如果您将 C++ 方式与 :a(a) 一起使用,它看起来像这样

class Blabla 
{
    private:
        int a;
        int b;

    public:
        Blabla(int a, int b);
}

Blabla::Blabla(int a, int b):a(a), b(b)
{
}

并且我个人认为 this->a 导致的代码比将字母放在前面的匈牙利符号示例(如 m_a 或更多 c 样式的 _a)更易读。

于 2012-09-15T09:05:13.913 回答