类作用域
五种作用域
① 块作用域 ②文件作用域 ③函数原型作用域 ④函数作用域 ⑤类作用域
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)
概念: 定义在函数体内的类
① 只在定义它的函数内部有效,对外不可见
② 成员函数只能在类体内实现
③ 局部类中不能定义静态成员 因为 静态成员初始化需要在文件作用域外部;
示例代码见上一代码块;