C++编程入门(二) 互动版

在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器

类的作用域

类的作用域是指类的成员的定义范围,就是说一个类的所有成员都在一个范围之内。 一个类好比就是悟空画的一个圈,这个类的成员函数和数据成员都在这个圈内,这个圈就是类的作用域。 这种思想就是要把一个类的数据结构封装起来,使得除类的成员函数之外的其他函数访问类的数据成员 时有一定的限制。看如下例子:

class A{
    public:
        void func1();
        void func2();
    private:
        int x;
};
void A::func1(){
    x=8;
}
void A::func2(){
    int x;
    x=7;    //这里的x并非是类A的数据成员x
}

类A的数据成员x的作用域是整个类的定义范围,但是成员函数中定义了同名的局部变量后,就把类A的数据成员x隐藏起来了

局部类

这里介绍一个特殊的类:在一个函数体内定义的类叫做局部类。要注意:局部类中不能声明静态成员函数,所有成员函数都必须定义在类体内。局部类只能通过他的外围作用域中的对象和函数进行联系。

嵌套类

还有一种特殊的类:在另一个类中定义的类叫做嵌套类,另一个类称为外围类。嵌套类是外围类的一个成员,所以就有public、private、protected三种权限。嵌套类中的数据成员的名字,如果与外围类中数据成员的名字相同,互不影响。

局部类和嵌套类举例如下:

#include <iostream>
using namespace std;
//局部类
void funcj()
{
    int m=6;
    class M{
        public:
            void Setm(int x){m=x;}
            void printm(){cout<<"m= "<<m<<endl;}
        private:
            int m;
    };
    M mObj;
    mObj.Setm(8);
    mObj.printm();
    cout<<"m= "<<m<<endl;
}
//嵌套类
class L
{
    public:
        class N{
            public:
                N(int x,int y){a=x;b=y;}
                void Print(){cout<<"a= "<<a<<" b= "<<b<<endl;}
            private:
                int a,b;
        };
        L(int x){a=x;}
        void Print(){cout<<"a= "<<a<<endl;}
    private:
        int a;
};
void main()
{
    funcj();
    L l1(5);
    L::N n1(7,8);
    l1.Print();
    n1.Print();
}

第4到18行定义了函数funcj,其中第7到13行定义了局部类M,第14行声明类M的对象mObj,第15和16行调用成员函数。主函数中第37行调用函数funcj。注意如果在main函数中试图定义类M的对象,将会报错。类M的作用域在函数funcj范围内。注意输出结果为:

m= 8

m= 6

第20到34行定义类L,第23到29行定义嵌套类N。类M和类N有同名的成员函数Print和同名的数据成员a,两种互不影响。注意主函数中可以直接创建类N的对象,这与局部类不同,声明方式在类N前面加M::,输出如下:

a= 5

a= 7 b= 8