专业编程基础技术教程

网站首页 > 基础教程 正文

C++|作用域限定符(:)的七种使用场合和用法

ccvgpt 2024-10-12 13:56:58 基础教程 8 ℃

在不同作用域内声明的变量或函数可以同名,但如果在同一个作用域内同时存在局部变量(函数)和全局变量(函数)时,通常局部(或内部)变量(或函数)会覆盖掉全局(或外部)的变量(或函数)。如何在这个作用域内访问外部作用域中同名的变量(函数)?使用作用域限定符。另外,在类中也用作用域限定符来表明类成员属于某个类。

1 区分同名的全局变量和局部变量

C++|作用域限定符(:)的七种使用场合和用法

#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-

最近发表
标签列表