网站首页 > 基础教程 正文
在不同作用域内声明的变量或函数可以同名,但如果在同一个作用域内同时存在局部变量(函数)和全局变量(函数)时,通常局部(或内部)变量(或函数)会覆盖掉全局(或外部)的变量(或函数)。如何在这个作用域内访问外部作用域中同名的变量(函数)?使用作用域限定符。另外,在类中也用作用域限定符来表明类成员属于某个类。
1 区分同名的全局变量和局部变量
#include<iostream> using namespace std; int sum=0; const int N=15; int main() { int n,a[N],sum=0; cin>>n; for(int i=0;i<n;i++) cin>>a[i]; for(int i=0;i<n;i++) { if(i%2==0) sum+=a[i]; ::sum+=a[i]; } cout<<"all="<<::sum<<' '<<"odd="<<sum; return 0; }
2 命名空间限定
当想输出某命名空间(如:namespace ns1)中成员的数据时,可以采用命名空间名和作用域限定符::指向该成员数据。
#include <iostream> using namespace std; namespace ns1 //命名空间ns1 { int a = 3; double b = 4; double tax() { return a * b; } namespace ns2 // 嵌套的命名空间ns2 { int age =11; } } void main() { std:cout<<ns1::a<<endl; // 输出命名空间ns1中成员的数据 cout<<ns1::tax()<<endl; cout<<ns1::ns2::age<<endl; // 需要依次指定外层和内层的命名空间名 cin.get(); }
3 要表明某个函数不属于任何类时
通常是类里有成员函数跟全局函数名字相同时使用。
例如在某个类里这样写
::change(int& i); //表明change函数不属于任何类,通常是一个全局函数
4 类的成员函数在类外定义时,指明该函数的作用域为该类
#include<iostream> using namespace std; int calculate(int x) {return 2*x*x+4*x+6;} class A { private: int a; public: int calculate(); A(int m) {a=m;} }; int A::calculate() {return 2*a*a+4*a+5;} int main() { A b(5); cout<<::calculate(5)<<endl; cout<<b.calculate()<<endl; return 0; }
5 显示调用父类中被子类覆盖的函数
在子类中可用::显式调用父类中的成员函数或成员变量,可以调用到父类被子类覆盖的函数。如子类B和父类A均有void fun();这个函数,因为是函数覆盖,直接调用是调用不了父类中的fun(),这时,只要A::fun()这样显式指明即可调用。
6 在类内使用typedef声明了某类型的别名,在类外使用时
如在类A内有这样的声明:
typedef unsign int UINT;
在类外需要定义一个width类型的变量时可以这样写:
A::UINT i;
7 使用类的静态成员变量或成员函数时使用
静态成员的提出是为了解决数据共享的问题。使用静态数据成员还可以节省内存。
静态成员既可以通过对象名引用,也可以通过类名+::引用。
静态数据成员的使用方法和注意事项如下:
① 静态数据成员在定义或说明时前面加关键字static。//静态变量的定义
② 初始化在类体外进行,而前面不加static,(这点需要注意)以免与一般静态变量或对象相混淆:
<数据类型><类名>::<静态数据成员名>=<值> //静态变量的初始化
③ 初始化时不加该成员的访问权限控制符private,public等。
④ 初始化时使用作用域运算符来标明它所属类,因此,静态数据成员是类的成员,而不是对象的成员。
⑤ 静态数据成员是静态存储的,它是静态生存期,必须对它进行初始化。
⑥ 引用静态数据成员时,采用如下格式:
<类名>::<静态成员名> //静态变量的使用方式
如果静态数据成员的访问权限允许的话(即public的成员),可在程序中,按上述格式来引用静态数据成员。
下面举一例子,说明静态数据成员的应用:
#include <iostream> #include <stdlib.h> using namespace std; class StaTest { public: StaTest(int a, int b, int c); void GetNumber(); void GetSum(); static void f1(StaTest &s); static int sv; private: int A, B, C; static int Sum; }; int StaTest::Sum = 0;//静态成员在此初始化 int StaTest::sv = 23; StaTest::StaTest(int a, int b, int c) { A = a; B = b; C = c; Sum += A + B + C; } void StaTest::GetNumber() { cout << "Number = " << endl; } void StaTest::GetSum() { cout << "Sum = " << Sum <<endl; } void StaTest::f1(StaTest &s) { cout << s.A << endl;//静态方法不能直接调用一般成员,可以通过对象引用实现调用 cout << Sum <<endl; } int main(void) { StaTest M(3, 7, 10), N(14, 9, 11); M.GetNumber(); N.GetSum(); M.GetNumber(); N.GetSum(); StaTest::f1(M); cout<<"使用静态数据成员:"<<StaTest::sv<<endl; system("pause"); return 0; }
-End-
猜你喜欢
- 2024-10-12 C++中override与overload的区别:深入解析与应用
- 2024-10-12 C++中的static_cast #程序代码 c++ static用法
- 2024-10-12 为什么C++ 单例局部static初始化是线程安全的?
- 2024-10-12 编码规范-C++:尽可能使用static_cast而不是reinterpret_cast
- 2024-10-12 C++类对象中的this指针与静态成员:理解与应用
- 2024-10-12 看完就会用的C++17特性总结 c++ 17 新特性
- 2024-10-12 C++|变量的类型系统和属性 c++变量有哪几种作用域
- 2024-10-12 C++友元和静态函数:如何用特殊的方式访问和管理类的成员
- 2024-10-12 C++中的static关健字 c static关键字
- 2024-10-12 C++静态成员变量和静态成员函数使用总结
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)