C++回顾之前向声明、嵌套类、局部类

来源:互联网 发布:jquery.qrcode.js下载 编辑:程序博客网 时间:2024/04/30 15:50

        先看看什么是前向声明。在C++中,类需要先定义,而后才能被实例化,但是实际存在一种场景是:两个类需要相互引用或相互成为类中的子对象成员时,就无法先定义使用,在编译环节就出现错误导致编译失败,这时就需要用到前向声明,此外,前向声明的类不能被实例化。下面是例子:

        

//此段代码在A.h文件中#ifndef  _A_H#define _A_H#include "B.h"class A{public:    A(void);    ~A(void);    B b_; //A类中包含B类对象};#endif//下面代码在B.h文件中#ifndef  _B_H#define _B_H/*B类包含A类对象,A类又包含B类对象时,头文件也互相包含,这是不允许的,需要前向声明:在B.h中将A类前向声明,此时就不再需要包含A.h头文件,且B中不能有A类的对象,因为前向声明的类不能被实例化,但是可以是A类的指针或者引用*///#include "A.h"  class A;class B{public:    B(void);    ~B(void);    //A a_;  //前向声明后,B类中不能含有A的对象    A *a_;   //可以是指针    void Fun(A &a )  //可以是引用     {    }};#endif

        嵌套类

        顾名思义,嵌套类就是在类体中再定义另外一个类,形成类中类的情况。我们将最外层定义的类称为外围类,外围类内部再定义的类称为嵌套类。嵌套类的主要作用是为外围类提供服务的,外围类可以使用嵌套类对象作为外围类的底层实现,同时可以对用户隐藏该底层的实现。

        嵌套类需要注意的几点:

        (1) 作用域上,嵌套类是定义在外围类内部的,所以该类名只能在外围类内部使用,如果在外围类外部使用该类名时,需要加名字限定,如Out::Inner i;

        (2) 嵌套类中的成员函数可以在它的外部定义。

        (3) 嵌套类的成员函数对外围类的数据成员没有访问权,反之亦然。因为嵌套类仅仅是语法上的嵌入,它与外围类实际上是平级的。

        下面是嵌套类的简单例子:

        

class Outer  //外围类{public:    class Inner    {    public:        void Fun()  //也可以定义在外部        //{        //    cout << "Inner::Fun()"<<endl;        //}    };public:    Inner obj_;    void Fun()    {        cout << "Outer::Fun() "<<endl;        obj_.fun(); //嵌套类为外围类提供服务,对用户隐藏。    }};//Inner::Fun() //Error, 注意作用域。Inner对外部不可见void Outer::Inner::Fun(){    cout << "Inner::Fun() << endl;}int main(){    Outer o;    Outer::Inner i; //注意作用域,可以像使用其它类一样使用嵌套类,它仅仅是语法上的嵌入.    o.Fun();    i.Fun();    return 0;}

        局部类.

        局部类是指在函数内部定义的类,这样的类称为局部类local class.局部类只在定义它的局部域内是可见的。此外,局部类的成员函数必须定义在类体中,并且不能有静态成员。下面是例子:

void Fun(){    //局部类,只在函数内部有效    class LocalClass    {    public:        int a_;        void Init(int &a ) //只能在类体中定义.        {            a_ = a;        }         //static int b_;  //Error,局部类不能定义static静态数据成员.    };    LocalClass lc;    lc.Init(10);}int main(){    Fun();    LocalClass lc; //Error, 局部类在函数外部不可用。}

0 0
原创粉丝点击