2015-04-12 38 views
1

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

+1

你可以后缀一个'_'作为参数名称。 –

+1

带'm_'或's_'的前缀成员(用于静态) –

+1

您可以使用'this'来消除歧义。 – tux3

回答

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_前缀样式(或同等学历)的原因之一。

3

你刚才初始化它们在初始化列表:

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

如果使用初始化列表,你可以简单地使用相同的名称,编译器会明白你的意思。

实施例:

Book::Book(std::string title, int year) 
: title(title), year(year) 
{} 
1

最简单的方法是使用MEM-初始化列表。例如

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; 
    } 
}; 
+0

除现在你的会员有三倍的所需价值。不好。 –

1

该方法正式名称并不具有很高的价值,考虑的范围是多么有限。但应该仍然是能够立即区分这些项目的“起源”的动机。

它已经成为我的做法,既

一)前缀我的数据属性与“M_的名字,

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) ... 

目标 - 更容易阅读

动机 - 代码写一次,读多次

我了解的构造函数初始化列表的特殊情况。但我也确信使用前缀(您选择的)有助于防止在开发和维护期间发生的几种错误。