8

我在社区内外阅读了一些关于嵌套类的帖子,我很困惑。

据我了解,在C++ 中,嵌套类与单独/独立的类没有任何不同。

当我试图更好地理解 conecpt 时,我编写了一个简单的代码,我发现内部类可以访问外部类而无需与外部类建立友谊。

例如:

class Outer {
private : // default access modifier
    int x;
    static int sx;
public:
    class Inner {
    public:
        void changeOuterDataMemberValues(int value) {
            sx = value; // changes the private static data member of Outer.

            Outer out;
            out.x = value; // changes the private data member via object (not via class!)
        }
        void printMyOuterDataMember()  {
            cout << sx; // prints the private data member of Outer.
        }
    };
};


class Lonesome {
    void tryingToChangeDataMemberValue(int value) {
        Outer::sx = value; // cannot change the private static data member of Outer.
    }
};

int Outer::sx;

您可以看到嵌套在 Outer 类中的 Inner 类可以访问其(Outer 类)数据成员,而 Lonesome 作为独立类无法访问 Outer 类数据成员。

如果这是一个重复或愚蠢的问题,我深表歉意,但我只想与你们确认嵌套类和独立类(两个没有内部/外部关系的不同类)之间存在差异。

谢谢大家,辛迪加=]

4

3 回答 3

22

在这方面,C++03 和 C++11 是有区别的。因此,答案取决于您使用的编译器。

如果您使用的是符合 C++03 的编译器,则:

嵌套类不能访问封闭类的所有成员。

如果您使用的是符合 C++11 的编译器,则:

嵌套类可以访问封闭类的所有成员。嵌套类被视为该类的另一个成员。

C++03 标准 11.8 嵌套类:
§1

嵌套类的成员对封闭类的成员没有特殊的访问权限,也没有对已授予封闭类友谊的类或函数的特殊访问权限;应遵守通常的访问规则。

C++11 标准 11.7 嵌套类:

嵌套类是成员,因此具有与任何其他成员相同的访问权限。

于 2013-01-30T15:20:34.507 回答
3

从标准的第 11.7 节:

1 - 嵌套类是成员,因此具有与任何其他成员相同的访问权限。封闭类的成员对嵌套类的成员没有特殊的访问权限 [...]

所以嵌套(“内部”)类实际上是封闭类的朋友。

于 2013-01-30T15:17:02.507 回答
2

你自己回答了你的问题:

您可以看到嵌套在 Outer 类中的 Inner 类可以访问其(Outer 类)数据成员,而 Lonesome 作为独立类无法访问 Outer 类数据成员。

注意与 C++ 中的 Java 相反,您不能访问Outer类的非静态成员。

Outer对班级进行引用是一种常见的做法Inner

class Outer {
    private : // default access modifier
    int x;
    static int sx;
public:
    class Inner {
    public:
        Inner( Outer & o ) : m_outer( o ) {}
        void changeOuterDataMemberValues(int value) {
            sx = value; // changes the private static data member of Outer.

            //Outer out;
            //out.x = value; // changes the private data member via object (not via class!)
            m_outer.x = value; // <---------
        }
        void printMyOuterDataMember()  {
            cout << sx; // prints the private data member of Outer.
            cout << m_outer.x;
        }
    private:
        Outer & m_outer;
    };
};
于 2013-01-30T15:29:32.687 回答