MST
星途 面试题库

面试题:C++中类嵌套类的作用域问题

在C++中,假设有一个外层类Outer,其内部嵌套了一个内层类Inner。请说明Inner类成员函数如何访问Outer类的私有成员?同时,请举例说明Inner类对象的作用域界定在哪些场景下。
31.2万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

Inner类成员函数访问Outer类私有成员

  1. 友元关系:可以在Outer类中将Inner类声明为友元类,这样Inner类的成员函数就可以访问Outer类的私有成员。例如:
class Outer {
private:
    int privateMember;
public:
    class Inner;
    friend class Inner;
};

class Outer::Inner {
public:
    void accessOuterPrivate(Outer& outer) {
        outer.privateMember = 42; // 可以访问Outer类的私有成员
    }
};
  1. 通过Outer类的公有接口间接访问Inner类成员函数可以通过调用Outer类的公有成员函数来间接访问Outer类的私有成员。例如:
class Outer {
private:
    int privateMember;
public:
    void setPrivateMember(int value) {
        privateMember = value;
    }
    int getPrivateMember() {
        return privateMember;
    }
    class Inner;
};

class Outer::Inner {
public:
    void accessOuterPrivate(Outer& outer) {
        outer.setPrivateMember(42); // 通过公有接口间接访问私有成员
        int value = outer.getPrivateMember();
    }
};

Inner类对象的作用域界定场景

  1. 在Outer类成员函数内:可以直接创建Inner类对象并使用。例如:
class Outer {
public:
    class Inner {
    public:
        void print() {
            std::cout << "Inner class print" << std::endl;
        }
    };
    void createInner() {
        Inner inner;
        inner.print();
    }
};
  1. 在Outer类的友元函数或友元类中:例如上述将Inner类声明为Outer类友元类的例子,在Inner类成员函数内可以创建Inner类对象使用。
  2. 在全局作用域(需要完整的作用域限定):如果要在全局作用域创建Inner类对象,需要使用完整的作用域限定。例如:
class Outer {
public:
    class Inner {
    public:
        void print() {
            std::cout << "Inner class print" << std::endl;
        }
    };
};

int main() {
    Outer::Inner inner;
    inner.print();
    return 0;
}