C ++私有成员变量与ctor params同名

时间:2015-04-12 13:25:33

标签: c++ initialization initializer-list

我知道许多peoplpe使用私有成员变量名的前缀或后缀。对于那些不知道但只是使用名称的人 - 如果你想拥有同名的构造函数参数,你如何初始化它们?

5 个答案:

答案 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初始化列表的特殊情况。但我也相信,使用前缀(您选择的)有助于防止在开发和维护过程中出现的各种错误。