本文共 1412 字,大约阅读时间需要 4 分钟。
(1)作用域符号::
前面一般是类名称,后面一般是该类的成员名称,C++为例避免不同的类有名称相同的成员而采用作用域的方式进行区分
如:A,B表示两个类,在A,B中都有成员member。那么 A::member就表示类A中的成员member B::member就表示类B中的成员member(2)::是C++里的“作用域分解运算符
比如声明了一个类A,类A里声明了一个成员函数voidf(),但没有在类的声明里给出f的定义,那么在类外定义f时,就要写成voidA::f(),表示这个f()函数是类A的成员函数。例如
01 class CA { 02 public: 03 int ca_var; 04 int add(int a, int b); 05 int add(int a); 06 }; 07 08 //那么在实现这个函数时,必须这样书写: 09 int CA::add(int a, int b) 10 { 11 return a + b; 12 } 13 14 //另外,双冒号也常常用于在类变量内部作为当前类实例的元素进行表示,比如: 15 int CA::add(int a) 16 { 17 return a + ::ca_var; 18 } 19 20 //表示当前类实例中的变量ca_var。(3)全局作用域符号:当全局变量在局部函数中与其中某个变量重名,那么就可以用::来区分如:
char zhou; //全局变量 void sleep() { char zhou; //局部变量 char(局部变量) = char(局部变量) *char(局部变量) ; ::char(全局变量) =::char(全局变量) *char(局部变量); }
==============================================================
补充:
今天在看贺老师的博客时,一个同学写的代码编译出错就是这个原因。
下面为出错代码:
#include咋一看,代码没什么问题,但是编译就会出现下图的一大堆错误:#include using namespace std;class CPoint{private: double x; double y;public: CPoint(double xx=0,double yy=0):x(xx),y(yy){} friend void distance(CPoint &,CPoint &);};void distance(CPoint &p1,CPoint &p2){ double l; l=sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)); cout<
错误延伸到了系统提供的文件中。
实际上,自己的程序中22行调用的distance(t1,t2);,和命名空间中已经定义的distance冲突了。
解决办法有两个:(1)把distance函数名换为其他名字就ok
(2)在主函数调用distance时前面加上“::”,意思是,不管其他地方有没有distance,这儿用的就我自己的。
编译,错误完美消除!