C++中的域作用符::的作用
1. 标识作用域的级别 2. 标识成员属于哪个类 3. 限定成员的作用范围 4. 指出作用域的范围
作用域符号::的前面一般是类名称,后面一般是该类的成员名称,C++为例避免不同的类有名称相同的成员而采用作用域的方式进行区分
如:A,B表示两个类,在A,B中都有成员member。那么
A::member就表示类A中的成员member
B::member就表示类B中的成员member
全局作用域符号(双冒号)例子
#include <stdio.h>
int count = 0; //全局变量 0
void main()
{
int count = 10; //局部变量10
printf("count =%d\n",count);//局部变量屏蔽了全局变量 所以输出结果是10
{
int count = 20;
printf("count =%d\n",::count); //作用域符号指出引用全局变量0
//::sort
}
}
1. ::域作用符,用来引用全局的变量、函数等
比如
int i = 0;
void test()
{
int i = 3;
cout<<i; //输出函数中的局部变量i
cout<<::i; //输出全局变量i
}
比如
int i = 0;
void test()
{
int i = 3;
cout<<i; //输出函数中的局部变量i
cout<<::i; //输出全局变量i
}
2. 域作用符,用来引用特定的函数或变量。比如说对类中的全局变量的引用;引用上一作用域对象(变量)。
3. 作用域运算符,指定某个范围内的成员,比如
class A
{
public:
int bbb();
//可以在类里面定义bbb,当你在类外面定义的时候就要指定他是属于哪个类的成员函数
};
int A::bbb()
{
cout << "类的外部定义";
}
如果没有int A::bbb()只是写了int bbb()的话就会说bbb没有声明,会出错的
class A
{
public:
int bbb();
//可以在类里面定义bbb,当你在类外面定义的时候就要指定他是属于哪个类的成员函数
};
int A::bbb()
{
cout << "类的外部定义";
}
如果没有int A::bbb()只是写了int bbb()的话就会说bbb没有声明,会出错的
4.最重要的一点:名称是作用域解析运算符"::".
下面让我们来了解名字空间的含义
名字空间是一种逻辑分组的机制.也就是说,如果有一些声明按照某种标准在逻辑上属于同一个集团,就可以将它们放入同一名字空间,以表明这个事实,例如,我定义一个名字空间N 将变量a, b 函数f()放入其中
int a;
namespace N{
int a, b;
void f(){
::a=1; //(被屏蔽的)全局a的限定名
a=10; //非限定名访问内层a
}
}
void g()
{
a=10; //全局的a
N::a=7; //名字空间N作用域中的a(限定名)
}
位于作用域解析运算符左边的限定符必须或者是一个名字空间的名字,或者是一个类对象的名字,
这也意味着,局部于某个函数的名字不能通过限定名的方式访问
第一种,就是区分同名的全局变量(或函数)和局部变量(或函数)。
- #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;
- }
全局变量sum用来求数组的全部和,局部变量sum用来求奇数小标元素的和。
第二种,类的成员函数在类外定义时,指明该函数的作用域为该类。
- #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;
- }
第三种,命名空间限定,当想输出某命名空间(如:namespace ns1)中成员的数据时,可以采用命名空间名和作用域限定符::指向该成员数据。
-
<ol start="1" class="dp-cpp" style="font-family: Consolas, 'Courier New', Courier, mono, serif; line-height: 35px; padding: 0px; border: none; color: rgb(92, 92, 92); margin: 0px 0px 1px 45px !important;"><li class="alt" style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal-leading-zero outside; color: inherit; line-height: 18px; margin: 0px !important; padding: 0px 3px 0px 10px !important;">namespace ns1 // 命名空间 ns1
-
{
-
<span style="white-space:pre"> </span>int a=0;
-
<span style="white-space:pre"> </span>double b=1;
-
<span style="white-space:pre"> </span>float tax()
-
<span style="white-space:pre"> </span>{
-
<span style="white-space:pre"> </span>return a*b
-
<span style="white-space:pre"> </span>}
-
<span style="white-space:pre"> </span>
-
-
-
<span style="white-space:pre"> </span>namespace ns2 // 嵌套的命名空间 ns2
-
<span style="white-space:pre"> </span>{
-
<span style="white-space:pre"> </span>int age;
-
-
-
<span style="white-space:pre"> </span>}<span style="white-space:pre"> </span>
-
<span style="white-space:pre"> </span>
-
}
-
-
-
// 如果想输出命名空间 ns1 中乘员的数据,可以采用下面的方法
-
-
-
cout<<ns1::a<<endl;
-
cout<<ns1::tax()<<endl;
-
cout<<ns1::ns2::age<<endl; // 需要依次指定外层和内层的命名空间名
-