• 类作用域


    类作用域:
    ☞作用域可分为类作用域名的作用域以及对象的作用域几部分内容。
    ☞在类中定义的成员变量和成员函数的作用域是整个类,这些名称只有在类中(包含类的定义部分和类外函数实现部分)是可见的,在类外是不可见的,因此,可以在不同类中使用相同的成员名。另外,类作用域意味着不能从外部直接访问类的任何成员,即使该成员的访问权限是public,也要通过对象名来调用,对于static成员,要指定类名来调用。
    ☞如果发生“屏蔽”现象,类成员的可见域将小于作用域,但此时可借助this指针或“类名::”形式指明所访问的是类成员,这有些类似于使用“::”访问全局变量。

    类定义的作用域与可见域:
    ● 和函数一样,类的定义没有生存期的概念,但类定义有作用域和可见域
    ● 使用类名创建对象时,首要的前提是类名可见,类名是否可见取决于类定义的可见域,该可见域同样包含在其作用域中,类本身可被定义在3种作用域内,这也是类定义的作用域:
    (1)全局作用域
    在函数和其他类定义的外部定义的类称为全局类,绝大多数的C++类是定义在该作用域中,我们在前面定义的所有类都是在全局作用域中,全局类具有全局作用域。 
    (2)类作用域(类中类、嵌套类)
    一个类可以定义在另一类的定义中,这是所谓嵌套类,举例来说,如果类A定义在类B中,如果A的访问权限是public,则A的作用域可认为和B的作用域相同,不同之处在于必须使用B::A的形式访问A的类名。当然,如果A的访问权限是private,则只能在类内使用类名创建该类的对象,无法在外部创建A类的对象。
    (3)块作用域
    类的定义在代码块中,这是所谓局部类,该类完全被块包含,其作用域仅仅限于定义所在块,不能在块外使用类名声明该类的对象。
    #include<iostream>
    using namespace std;
    void Work(int a,int b){
            class point{
                    public:
                            point(int x=0,int y=0){
                                    _x = x;
                                    _y = y;
                            }
                            void print(){     
                                    cout<<"("<<_x<<","<<_y<<")"<<endl;
                            }
                    private:
                            int _x,_y;
            };
            point p(a,b);   //函数内创建point类对象p; 块作用域
            p.print();
    }
    int main()
    {
            Work(5,6);
            //point(2,3);  //可见域不在文件范围
            return 0;
    }
    //(5,6)
    (4)类名也存在覆盖
    和普通变量的覆盖原则一样,类名也存在“屏蔽”和“覆盖”,不过,依旧可使用作用域声明符“::”指定具体使用的类名,如“::类名”访问的是全局类,使用“外部类::嵌套类”访问嵌套类。


    对象的生存期、作用域和可见域:
    ● 类名无生存期,只有作用域和可见域。
    ● 对象有生存期,对象的生存期也是对象中所有非静态成员变量的生存期,这些成员变量都随着对象的创建而创建,随着对象的撤销而撤销。
    ● 对象的生存期作用域可见域取决于对象的创建位置,同样有全局、局部、类内之分,和普通变量没有区别。

    先定义,后实例化:
    class B;      //前向声明,减少循环依赖
    B objectB;    //创建B类的对象。错误
    class B;        //声明
    B* pB=NULL;     //创建B类的对象。正确
    B* pC=new B;    //创建B类的对象。错误


    对象内存释放与堆内存:
    ● 一种普遍的误解是“如果对象被撤销,其占据的内存空间被释放,那么对象创建时和函数执行中通过new和malloc申请的动态内存也会被自动释放”,实际上,除非显式地用delete或free释放,申请的动态内存不会随着对象的撤销而撤销,相反,撤销了对象,却没有释放动态内存反而会引起内存泄露
    ● 当然,在程序结束时,操作系统会回收程序所开辟的所有内存。尽管如此,还是要养成new/delete、malloc/free配对的编程习惯,及时释放已经无用的内存。


  • 相关阅读:
    css flex布局实现后台页面
    html5 css iframe实现后台框架,仅用于学习案例
    nginx 多个网站配置
    nginx 负载 访问时 去掉端口
    nginx 负载
    解标准数独算法
    C++ execute linux cmd and retrieve the output
    C++ generate in Ubuntu
    shell操作典型案例--FTP操作
    PHP7 新写法
  • 原文地址:https://www.cnblogs.com/meihao1203/p/8440870.html
Copyright © 2020-2023  润新知