C++中通过“::”符号来区分变量等的作用域。::作用域包括三种:全局作用域符,类作用域符,命名空间作用域符
命名空间
“::”是作用域限定符或者称作用域运算符或者作用域操作符(scope operator),例如命名空间。
“::”作用:namespace::name
:: 的另一种用法
直接用在全局函数前,表示是全局函数。当类的成员函数跟类外的一个全局函数同名时,在类内定义的时候,用此函数名默认调用的是本身的成员函数;如果要调用同名的全局函数时,就必须打上::以示区别。
#include <stdio.h>
namespace First
{
int i = 0;
}
namespace Second
{
int i = 1;
namespace Internal
{
struct P
{
int x;
int y;
};
}
}
int main()
{
using namespace First;
using Second::Internal::P;
printf("First::i = %d\n", i);
printf("Second::i = %d\n", Second::i);
P p = {2, 3};
printf("p.x = %d\n", p.x);
printf("p.y = %d\n", p.y);
return 0;
}
类作用域符号
类作用域符号::的前面一般是类名称,后面一般是该类的成员名称,C++为了避免不同的类有名称相同的成员而采用作用域的方式进行区分。
例如A,B表示两个类,在A,B中都有成员member,那么
A::member就表示类A中的成员member
B::member就表示类B中的成员member
#ifndef _INTARRAY_H_
#define _INTARRAY_H_
class IntArray
{
private:
int m_length;
int* m_pointer;
public:
IntArray(int len);
int length();
bool get(int index, int& value);
bool set(int index ,int value);
void free();
};
#endif
#include "IntArray.h"
IntArray::IntArray(int len)
{
m_pointer = new int[len];
for(int i=0; i<len; i++)
{
m_pointer[i] = 0;
}
m_length = len;
}
int IntArray::length()
{
return m_length;
}
bool IntArray::get(int index, int& value)
{
bool ret = (0 <= index) && (index < length());
if( ret )
{
value = m_pointer[index];
}
return ret;
}
bool IntArray::set(int index, int value)
{
bool ret = (0 <= index) && (index < length());
if( ret )
{
m_pointer[index] = value;
}
return ret;
}
void IntArray::free()
{
delete[]m_pointer;
}
全局作用
全局作用域符号:当全局变量与局部函数中的变量名一样时,就可以通过::来区分如究竟是哪一个变量:
int i ; //全局变量
void function()
{
int i; //局部变量
i(局部变量) = i(局部变量) *i(局部变量) ;
::i(全局变量) =::i(全局变量) *i(局部变量);
}