类作用域

类作用域:
☞作用域可分为类作用域名的作用域以及对象的作用域几部分内容。
☞在类中定义的成员变量和成员函数的作用域是整个类,这些名称只有在类中(包含类的定义部分和类外函数实现部分)是可见的,在类外是不可见的,因此,可以在不同类中使用相同的成员名。另外,类作用域意味着不能从外部直接访问类的任何成员,即使该成员的访问权限是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配对的编程习惯,及时释放已经无用的内存。


原文地址:https://www.cnblogs.com/meihao1203/p/8440870.html