C++嵌套类

本文介绍了C++中嵌套类的基本概念及其用途,解释了如何定义和使用嵌套类,以及嵌套类与外围类之间的关系。通过实例展示了嵌套类的声明与定义过程,帮助读者理解嵌套类的实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 在一个类的内部定义另一个类,我们称之为嵌套类(nested class),或者嵌套类型。之所以引入这样一个嵌套类,往往是因为外围类需要使用嵌套类对象作为底层实现,并且该嵌套类只用于外围类的实现,且同时可以对用户隐藏该底层实现。
 
 
   虽然嵌套类在外围类内部定义,但它是一个独立的类,基本上与外围类不相关。它的成员不属于外围类,同样,外围类的成员也不属于该嵌套类。嵌套类的出现只是告诉外围类有一个这样的类型成员供外围类使用。并且,外围类对嵌套类成员的访问没有任何特权,嵌套类对外围类成员的访问也同样如此,它们都遵循普通类所具有的标号访问控制。
 
 
 
   若不在嵌套类内部定义其成员,则其定义只能写到与外围类相同的作用域中,且要用外围类进行限定,不能把定义写在外围类中。例如,嵌套类的静态成员就是这样的一个例子。
 
 
   前面说过,之所以使用嵌套类的另一个原因是达到底层实现隐藏的目的。为了实现这种目的,我们需要在另一个头文件中定义该嵌套类,而只在外围类中前向声明这个嵌套类即可。当然,在外围类外面定义这个嵌套类时,应该使用外围类进行限定。使用时,只需要在外围类的实现文件中包含这个头文件即可。
 

   另外,嵌套类可以直接引用外围类的静态成员、类型名和枚举成员(假定这些成员是公有的)。类型名是一个typedef名字、枚举类型名、或是一个类名。


实例如下:
 

#ifndef NESTCLASS_H_ 
#define NESTCLASS_H_ 

class A
{
public:
     A();
     ~A();
 
     void operate();
private:
     class B;
     B* m_b;
};
 
#endif 

 
#include "nestclass.h" 
#include <iostream> 
using namespace std;
 
class A::B
{
public:
     B(){}
     ~B(){}
 
     void operate()
     {
         cout<<"B operate!"<<endl;
     }
};
 
A::A()
{
 
}
 
A::~A()
{
 
}
 
void A::operate()
{
    m_b = new B;
    cout<<"A operate!"<<endl;
    m_b->operate();
}

#include "nestclass.h" 

void main()
{
     A a;
     a.operate();
}
 
        在嵌套类的定义被看到之前我们只能声明嵌套类的指针和引用,如上面在A中定义为B m_b而不是B* m_b将会引发一个编译错误。

       关于C++嵌套类的详细用法请参考《C++ Primer 第三版》P551。

### ### C++ 嵌套类的定义 在 C++ 中,嵌套类是指在一个类的内部定义的另一个类。这种定义方式允许将类的实现细节封装在外部类中,从而提高代码的模块化和可维护性。嵌套类的语法与普通类的定义类似,但其作用域被限制在外围类内部。例如: ```cpp class Outer { class Inner { // Inner 类的成员和方法 }; }; ``` 嵌套类可以访问外部类的私有成员,这使得嵌套类在封装实现细节方面非常有用[^2]。 ### ### 使用方法 嵌套类的实例化通常需要先实例化外部类。嵌套类的对象可以访问外部类的成员,包括私有成员。例如,在以下代码中,`NestedClass` 可以访问 `OuterClass` 的私有成员 `outerPrivate`: ```cpp class OuterClass { private: int outerPrivate; public: class NestedClass { public: void accessOuter(OuterClass &outer) { outer.outerPrivate = 10; // 访问外部类的私有成员 } }; }; int main() { OuterClass outer; OuterClass::NestedClass nested; nested.accessOuter(outer); // 通过嵌套类访问外部类的私有成员 return 0; } ``` ### ### 注意事项 在使用嵌套类时,需要注意以下几点: - 嵌套类的作用域仅限于其外部类的内部。这意味着嵌套类的成员函数只能访问外部类的成员,如果需要访问外部类的成员,必须通过外部类的对象或指针来访问。 - 在局部域中定义的嵌套类,其定义必须出现在包含外围局部类定义的局部域内。在局部域定义中的嵌套类的名字必须由其外围类名限定修饰,在外围类中,该嵌套类的声明不能被省略。 - 嵌套类不能直接访问外部类的成员,除非通过外部类的对象或指针。因此,嵌套类通常需要一个指向外部类对象的指针或引用,以便能够访问外部类的成员[^3]。 ### ### 示例代码 下面是一个简单的示例,展示了如何在 `OuterClass` 中定义一个嵌套类 `NestedClass`,并使用它来访问 `OuterClass` 的私有成员: ```cpp #include <iostream> class OuterClass { private: int outerPrivate; public: class NestedClass { public: void accessOuter(OuterClass &outer) { outer.outerPrivate = 10; // 访问外部类的私有成员 std::cout << "Accessed private member: " << outer.outerPrivate << std::endl; } }; }; int main() { OuterClass outer; OuterClass::NestedClass nested; nested.accessOuter(outer); // 通过嵌套类访问外部类的私有成员 return 0; } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值