这是模棱两可还是完全没问题?

时间:2010-01-29 10:55:42

标签: c++ constructor initialization standards coding-style

此代码是否含糊不清或完全正常(标准认可/对于现有的编译器是否具有一致的行为)?

struct SCustomData {
    int nCode;
    int nSum;
    int nIndex;
    SCustomData(int nCode, int nSum, int nIndex)
        : nCode(nCode)
        , nSum(nSum)
        , nIndex(nIndex)
    {}
};

修改
是的,我指的是成员变量与构造函数的形式参数具有相同的名称。

6 个答案:

答案 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