一个类中的声明顺序是否重要?

时间:2010-06-17 10:29:39

标签: c++

有人可以在课堂上解释私人和公共秩序。是否重要?

例如:

class Account{
public:
    Account(string firstName, string lastName, int id);
    void printAccount();
private:
    string strLastName;     
    string strFirstName;    
};

它是否与:

相同
class Account{
private:
    string strLastName;     
    string strFirstName; 
public:
    Account(string firstName, string lastName, int id);
    void printAccount();
};

7 个答案:

答案 0 :(得分:5)

它不会影响程序行为,但可能会影响可读性。有一个约定(当然你可以自由地遵循),必须首先列出公共内容,以便读者可以更早地看到类接口(其他类和函数可以对类做什么)。

答案 1 :(得分:4)

在您的具体示例中,订单并不重要。但请记住,成员按声明的顺序进行初始化。

答案 2 :(得分:4)

对于班级成员的可见性非常重要

class Account{
public:
    Account(string firstName, string lastName, int id);
    void printAccount();

    Foo makeFoo(); // invalid! Foo not declared yet
    typedef Foo foo_type; // invalid! Foo not declared yet

private:
    string strLastName;     
    string strFirstName;
    class Foo { };    
};

您只能在类中的参数,默认参数,函数体或构造函数初始化列表(或嵌套类中的此类内容)中引用尚未声明的名称。在其他情况下,您不能并且您必须安排声明以使它们可见。

答案 3 :(得分:2)

虽然在一般情况下它更像是一种风格问题,但如果您的成员属性具有多个访问级别,则存在细微差别:

  • 成员的初始化顺序
  • (可能)对象的内存布局

构造函数初始化列表中成员的初始化顺序与属性在类定义中的显示顺序相同,因此如果在public属性之前放置private属性,则所有公共属性都将是在任何私有属性之前初始化(仅当您使用某个属性作为不同属性的构造函数的参数时,这才会真正影响代码。)

对象的内存布局可能会有所不同。具有相同访问级别的所有字段在内存中的排列顺序与它们在类中声明的顺序相同。编译器可以根据需要自由重新排序不同的访问级别(即在私有之前在受保护之前在内存中公开...)但许多人没有。如果重新排序访问级别并且有多个访问级别中的字段,则对象的内存布局将不同 - 编译器无需重新排序成员属性。

答案 4 :(得分:1)

两者表达相同。

答案 5 :(得分:1)

如果明确指定辅助功能,则顺序不重要。如果不这样做会变得很重要,因为默认是“私人”。

答案 6 :(得分:0)

这只是一个品味问题,制定一些惯例,因此在您的应用中使用。

不是私有是默认的,所以你可以省略私有关键字,你首先声明私有变量。

class Account{
/*private:*/ // can be left out since private is default
    string strLastName;     
    string strFirstName; 
public:
    Account(string firstName, string lastName, int id);
    void printAccount();
};