我知道许多peoplpe使用私有成员变量名的前缀或后缀。对于那些不知道但只是使用名称的人 - 如果你想拥有同名的构造函数参数,你如何初始化它们?
答案 0 :(得分:3)
简单地写下来。语言规则可以防止出现问题。
struct Foo
{
Foo(int x) : x(x) {};
int x;
};
在()
之外,只有数据成员在范围内;在内部,函数参数隐藏成员,就像在普通函数体中一样:
int x = 2;
void foo(int x)
{
// any access to `x` means the argument
}
这是我在命名数据成员时不使用m_
前缀样式(或等效)的众多原因之一。
答案 1 :(得分:2)
您只需在初始化列表中初始化它们:
struct foo
{
foo(int bar) : bar(bar) {}
private:
int bar;
};
请注意,初始化列表是在构造函数中显式初始化成员的唯一方法。一旦你进入构造函数的主体,该成员就已经初始化了。
顺便说一下,C ++允许你在声明点初始化一个成员,在这种情况下它被初始化为该值,除非在构造函数中另外初始化:
struct foo
{
foo(int bar) : bar(bar) {}
foo() {} // bar initialized to 42
private:
int bar = 42;
};
答案 2 :(得分:2)
如果您使用初始化列表,您只需使用相同的名称,编译器就会理解您的意思。
示例:
Book::Book(std::string title, int year)
: title(title), year(year)
{}
答案 3 :(得分:1)
最简单的方法是使用mem-initializer列表。例如
class A
{
private:
int data;
public:
A( int data ) : data( data ) {}
};
如果要在构造函数体内使用数据成员,则有两种方法可以区分数据成员和参数
class A
{
private:
int data;
public:
A( int data ) : data( data )
{
A::data *= data;
this->data *= data;
}
};
答案 4 :(得分:1)
方法正式名称的价值不高,考虑到它的范围有限。然而,应仍然是动力,能够立即区分这些项目的起源。
这是我的惯例
a)使用'm_',
为我的数据属性名称添加前缀AND
b)使用'a_'或'an_'作为方法/函数参数名称的前缀,始终努力争取语法正确性。
LMBM::Node::Node(uint8_t a_max) : m_max (a_max) ...
void* LMBM::Node::threadEntry(void* an_objPtr) ...
void DV1::processDirent(const std::string& a_dirPath) ...
void DV1::handleDT_REG (DV::Dirent* an_ent,
const std::string& a_path) ...
FInfo (const std::string& aPfn, const int64_t& aFileSz) :
m_pfn (aPfn),
m_fileSz (aFileSz) ...
目标 - 更易于阅读
动机 - 代码写入一次,多次读取
我理解ctor初始化列表的特殊情况。但我也相信,使用前缀(您选择的)有助于防止在开发和维护过程中出现的各种错误。