此代码是否含糊不清或完全正常(标准认可/对于现有的编译器是否具有一致的行为)?
struct SCustomData {
int nCode;
int nSum;
int nIndex;
SCustomData(int nCode, int nSum, int nIndex)
: nCode(nCode)
, nSum(nSum)
, nIndex(nIndex)
{}
};
修改
是的,我指的是成员变量与构造函数的形式参数具有相同的名称。
答案 0 :(得分:6)
不,在这种情况下没有歧义,但请考虑以下事项:
struct SCustomData {
//...
void SetCode(int nCode)
{
//OOPS!!! Here we do nothing!
//nCode = nCode;
//This works but still error prone
this->nCode = nCode;
}
};
您应该关注现有的编码风格之一。例如General Naming Rule in Google C++ Coding Styles或阅读Herb Sutter和Andrei Alexandrescu撰写的优秀书籍“C++ Coding Standards: 101 Rules, Guidelines, and Best Practices”。
答案 1 :(得分:4)
你的例子对我来说是明确的(但对我来说),但这并不是一种好的做法,因为它很快就会像地狱一样模糊不清。
自从我在愤怒中编写任何C ++以来,已经有很长一段时间了,所以我猜测以下内容会做什么。
你知道它会做什么?你确定吗?
class Noddy
{
int* i;
Noddy(int *i)
: i(i)
{
if(i == NULL)
i = new int;
}
};
答案 2 :(得分:1)
如果您指的是对成员和构造函数参数使用相同的名称,那么这绝对没问题。但是,您可能会发现一些人坚持认为这是出于某种原因的不良做法。
如果您需要访问构造函数体中的成员,那么您需要注意 - 要么为参数指定不同的名称,要么使用this->
来访问成员。
如果您指的是使用伪匈牙利疣来提醒人们整数是整数,那么这在技术上是允许的,但绝对没有任何好处并且使代码更难以阅读。请不要这样做。
答案 3 :(得分:1)
一般情况下,我在构造函数中使用下划线和命名参数作为前缀实例变量,没有任何前缀。至少,这将消除您的实例变量参数的歧义。如果在构造函数体内初始化,它也会使生命变得不那么繁忙。
struct SCustomData {
int _nCode;
int _nSum;
int _nIndex;
SCustomData(int nCode, int nSum, int nIndex)
: _nCode(nCode), _nSum(nSum), _nIndex(nIndex)
{}
};
// Alternatively
struct SCustomData {
int _nCode;
SCustomData(int nCode)
{
this->_nCode = nCode;
}
};
我不喜欢按照问题中的方式堆叠变量。我喜欢节省垂直空间,而且我也更容易从左到右阅读。 (这是我的个人偏好,不是强制性规则或类似的规则。)
答案 4 :(得分:1)
我会说这完全没问题。
使用初始化列表但没有任何代码的构造函数是我的首选样式。我认为它减少了混淆,因为很明显哪个构造函数参数属于哪个成员。
答案 5 :(得分:0)
它完全符合标准,但是编译器,不会接受与构造函数参数同名的成员变量。事实上,由于这个原因,我不得不改变我的开源库。见this patch