类作用域:
☞作用域可分为类作用域、类名的作用域以及对象的作用域几部分内容。
☞在类中定义的成员变量和成员函数的作用域是整个类,这些名称只有在类中(包含类的定义部分和类外函数实现部分)是可见的,在类外是不可见的,因此,可以在不同类中使用相同的成员名。另外,类作用域意味着不能从外部直接访问类的任何成员,即使该成员的访问权限是public,也要通过对象名来调用,对于static成员,要指定类名来调用。
☞如果发生“屏蔽”现象,类成员的可见域将小于作用域,但此时可借助this指针或“类名::”形式指明所访问的是类成员,这有些类似于使用“::”访问全局变量。
|
类定义的作用域与可见域:
● 和函数一样,类的定义没有生存期的概念,但类定义有作用域和可见域。
● 使用类名创建对象时,首要的前提是类名可见,类名是否可见取决于类定义的可见域,该可见域同样包含在其作用域中,类本身可被定义在3种作用域内,这也是类定义的作用域:
|
||
(1)全局作用域
在函数和其他类定义的外部定义的类称为全局类,绝大多数的C++类是定义在该作用域中,我们在前面定义的所有类都是在全局作用域中,全局类具有全局作用域。
|
||
(2)类作用域(类中类、嵌套类)
一个类可以定义在另一类的定义中,这是所谓嵌套类,举例来说,如果类A定义在类B中,如果A的访问权限是public,则A的作用域可认为和B的作用域相同,不同之处在于必须使用B::A的形式访问A的类名。当然,如果A的访问权限是private,则只能在类内使用类名创建该类的对象,无法在外部创建A类的对象。
|
||
(3)块作用域
类的定义在代码块中,这是所谓局部类,该类完全被块包含,其作用域仅仅限于定义所在块,不能在块外使用类名声明该类的对象。
|
||
(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配对的编程习惯,及时释放已经无用的内存。
|