第三课:类与对象(类作用域、前向声明、嵌套类、局部类)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_30278319/article/details/79201120

类作用域

五种作用域

① 块作用域 ②文件作用域 ③函数原型作用域 ④函数作用域 ⑤类作用域

class Test
{
    int num_;
}

int  num_ = 20;    //文件作用域  在任何一个代码之外  从定义的地方到结束有效;
int add(int a,int b);  //声明 中 a,b函数原型作用域;括号内有效;a,b可省略;

int main (void)
{
    int num_ = 30;   //块作用域
    {
    int num_  = 100;    //块作用域
    }
    cout<<num_<<endl;     //30
    cout<<::num_<<endl;   //20


    int add(int a, int b)   //块作用域
    {
        return a+b;
    }
    int test()
    {
    LABEL1:  //三个标识符的作用域为 函数作用域,在函数内部有效;
        cout<<"lable1"<<endl; 
        goto LABEL3;
    LABEL2: //三个标识符的作用域为 函数作用域,在函数内部有效;
        cout<<"lable2"<<endl;
        goto LABEL1;
    LABEL3: //三个标识符的作用域为 函数作用域,在函数内部有效;
        cout<<"lable3"<<endl;   
        goto LABEL2;
    }
    return 0;
}

1、作用域符号::的前面一般是类名称,后面一般是该类的成员名称,C++为例避免不同的类有名称相同的成员而采用作用域的方式进行区分
如:A,B表示两个类,在A,B中都有成员member。那么
A::member就表示类A中的成员member
B::member就表示类B中的成员member
2、全局作用域符号:当全局变量在局部函数中与其中某个变量重名,那么就可以用::来区分
3、函数内定义一个本地变量与成员变量重名则本地变量起作用(就近原则)。
4、成员变量作用域为类的作用域。

前向声明

两个类需要相互引用形成一个“环形引用”时 ,无法先定义使用。这时需要用前向声明。
前向声明的类不能实例化。


class A ;  //前向声明;
class B()
{
 A* a_;  //前向声明的类不能实例化对象;只能定义指针或引用;因为此时还不知道A,不知道为它分配多大内存;
 void fun(A& a)  //在参数中也只能为指针或引用;
 {
 *******
 }
}

嵌套类

① 作用域: 嵌套类只能在外围类中使用(对外不可见); 如果在外围类之外的作用域使用该类名时,需要加名字限定;
② 成员函数实现: 可以在类体外定义;
③ 嵌套类的成员函数对外围类的私有成员没有访问权,反之亦然;
④ 嵌套类仅仅是语法上的嵌入,即Inner 与 Outer是平行关系,可以在外部实例化Inner对象(需要加限定名)和访问Inner的public成员;

class Outer
{
    class Inner
    {
    public :
        void Fun();    //若嵌套类的方法在外部来实现,需要加限定名,详见下文实现
        //{
        // cout <<"Inner::Fun..."<<endl;
        //}
    }
public:
    Inner obj_;
    void Fun();  //嵌套类为外围类提供服务    
    {
        cout <<"Outer::Fun..."<<endl;
        obj_.Fun();
    }
}
void Outer::Inner::Fun()    //外部实现嵌套类的方法
{
    cout <<"Inner::Fun..."<<endl;
}

int Fun()
{
    class LocalClass   //局部类 只在定义它的函数内部有效,对外不可见
    {
    public :
        int num_;
        void Init(int num)  // 成员函数只能在类体内实现
        {
            num_=num;
        }       
        void Display()
        {
            cout <<nun_<<;
        }
    //   static int num2_;  //局部类中不能定义静态成员  因为 静态成员初始化需要在文件作用域外部;
    }
    LocalClass lc;  //在函数内部使用局部类
    lc.Init(10);
    lc.Display;
}

int main (void)
{
    Outer o;
    o.Fun();

    Outer::Inner  i;  //外部可实例化嵌套类
    i.Fun();

return 0;
}

局部类 (local class)

概念: 定义在函数体内的类
① 只在定义它的函数内部有效,对外不可见
② 成员函数只能在类体内实现
③ 局部类中不能定义静态成员 因为 静态成员初始化需要在文件作用域外部;
示例代码见上一代码块;

猜你喜欢

转载自blog.csdn.net/qq_30278319/article/details/79201120