:: 是作用域运算符,
- A::B表示作用域A中的-名称B;
- A可以是命名空间、类、结构体;
1、类作用域操作符
“::”:指明了成员函数所属的类。如:M::f(s) 就表示函数 f(s) 是类 M 的成员函数。
- 如果想在类的外部引用静态成员函数,或在类的外部定义成员函数都要用到 “::”。
- 使用命名空间里的类型或函数也要用到 “::”(如:std::cout, std::cin, std::string 等等)
例:声明了一个类A,类A里声明了一个成员函数void f(),但没有在类的声明里给出f的定义,
demo01.h(在头文件demo01.h中声明类A)
// 声明类 A
class A{
public:
void f();
};
那么在类外定义 f 时, 就要写成 void A::f(){...},表示这个 f() 函数是类A的成员函数。
demo01.cpp(在源文件demo01.cpp中定义类A的成员函数)
void A::f(){
std::cout<<"hello world"<<std::endl;
}
2、作用域成员运算符
表示引用成员函数及变量
例:System::Math::Sqrt() 相当于System.Math.Sqrt()
3、命名空间操作符
namespace ns1 {
const double RATE = 0.08; //常量
double pay; //变量
double tax() { //函数
return a * RATE;
}
namespace_ns2 { //嵌套的命名空间
int age;
}
}
如果想输出命名空间nsl中成员的数据,可以采用下面的方法:
cout<<ns1::RATE<<endl;
cout<<ns1::pay<<endl;
cout<<ns1::tax()<<endl;
cout<<ns1::ns2::age<<endl; //需要指定外层的和内层的命名中间名
可以看到命名空间的定义方法和使用方法与类差不多。但它们之间有一点差别:
- 在声明类时在右花括号的后面有一分号;
- 而在定义命名空间时,花括号的后面没有分号;