[英]Constructor and variable names in C++ vs. Java
我正在学习来自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 ++中执行此操作?
是的,您可以使用this
来引用成员变量。 也就是说,您经常会发现您的代码在惯用的C ++中看起来如下:
class Blabla {
private:
int a_;
int b_;
public:
Blabla(int a, int b) : a_(a), b_(b) {}
};
如您所见,您通常不会将访问控制说明符( public
, protected
或private
)应用于每个成员,但您可以将它们分组。
此外,如果您使用上面使用的初始化类型,成员将初始化两次 - 创建对象时使用默认构造函数(基本上,在执行大括号内的代码之前),以及在分配期间第二次使用默认构造函数this->a
。
是的,你用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)
应该提到的是,初始化列表应该按照它们在类定义中出现的顺序初始化成员变量。 如果不这样做,一个好的编译器会给你警告。
因为在C ++中this
是一个指针,所以使用this->var
访问其成员变量。
请注意,C ++往往有不同的约定比Java,这是通常使用_var
为私有变量,而不是通常的Java方法this.var
。 当然,这取决于您要使用的约定。
只是总结一下并把它归结为一个答案。
如果您想使用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)
{
}
而且我个人认为这个 - > a导致比匈牙利符号示例更可读的代码,这些示例将字母放在前面,如m_a或更多c样式_a。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.