深入解析C++编程中范围解析运算符的作用及使用

范围解析运算符 :: 用于标识和消除在不同范围内使用的标识符。
语法

代码如下:

:: identifier class-name :: identifier namespace :: identifier enum class :: identifier enum struct :: identifier

备注
identifier 可以是变量、函数或枚举值。
具有命名空间和类
以下示例显示范围解析运算符如何与命名空间和类一起使用:

namespace NamespaceA{
  int x;
  class ClassA {
  public:
    int x;
  };
}

int main() {

  // A namespace name used to disambiguate
  NamespaceA::x = 1;

  // A class name used to disambiguate
  NamespaceA::ClassA a1;
  a1.x = 2;

}

没有范围限定符的范围解析运算符表示全局命名空间。

namespace NamespaceA{
  int x;
}

int x; 

int main() {
  int x;

  // the x in main()
  x = 0;
  // The x in the global namespace
  ::x = 1; 

  // The x in the A namespace
  NamespaceA::x = 2;
}

你可以使用范围解析运算符来标识命名空间的成员,还可标识通过 using 指定成员的命名空间的命名空间。在下面的示例中,你可以使用 NamespaceC 限定 ClassB(尽管 ClassB 已在 NamespaceB 中声明),因为已通过 using 指令在 NamespaceC 中指定 NamespaceB。

namespace NamespaceB {
  class ClassB {
  public:
    int x;
  };
}

namespace NamespaceC{
  using namespace B;

}
int main() {
  NamespaceB::ClassB c_b;
  NamespaceC::ClassB c_c;

  c_b.x = 3;
  c_c.x = 4;
}

可使用范围解析运算符链。在以下示例中,NamespaceD::NamespaceD1 将标识嵌套的命名空间 NamespaceD1,并且 NamespaceE::ClassE::ClassE1 将标识嵌套的类 ClassE1。

namespace NamespaceD{
  namespace NamespaceD1{
    int x;
  }
}

namespace NamespaceE{

  class ClassE{
  public:
    class ClassE1{
    public:
      int x;
    };
  };
}

int main() {
  NamespaceD:: NamespaceD1::x = 6;
  NamespaceE::ClassE::ClassE1 e1;
  e1.x = 7 ;
}

具有静态成员
必须使用范围解析运算符来调用类的静态成员。

class ClassG {
public:
  static int get_x() { return x;}
  static int x;
};

int ClassG::x = 6;

int main() {

  int gx1 = ClassG::x;
  int gx2 = ClassG::get_x();
}

具有区分范围的枚举
区分范围的解析运算符还可以与区分范围的枚举枚举声明的值一起使用,如下例所示:

enum class EnumA{
  First,
  Second,
  Third
};

int main() {

  EnumA enum_value = EnumA::First;
}
(0)

相关推荐

  • 讲解C++编程中Address-of运算符&的作用及用法

    语法 & cast-expression 备注 一元 address-of 运算符 (&) 采用其操作数的地址.address-of 运算符的操作数可以是函数指示符,也可以是指定不是位域且不使用 register 储存类说明符声明的对象的左值. address-of 运算符仅适用于具有基本.结构.类或在文件范围级别声明的联合类型的变量,或仅适用于下标数组引用.在这些表达式中,可在 address-of 表达式中添加或提取不包括 address-of 运算符的常数表达式. 当应用于函数或左值

  • 深入解析C++中的动态类型转换与静态类型转换运算符

    dynamic_cast 运算符 将操作数 expression 转换成类型为type-id 的对象. 语法 dynamic_cast < type-id > ( expression ) 备注 type-id 必须是一个指针或引用到以前已定义的类类型的引用或"指向 void 的指针".如果 type-id 是指针,则expression 的类型必须是指针,如果 type-id 是引用,则为左值. 有关静态和动态强制转换之间区别的描述,以及各在什么情况下适合使用,请参见 s

  • 详解C++中new运算符和delete运算符的使用

    C++ 支持使用 new 和 delete 运算符动态分配和释放对象.这些运算符为来自称为"自由存储"的池中的对象分配内存. new 运算符调用特殊函数 operator new,delete 运算符调用特殊函数 operator delete. 在 Visual C++ .NET 2002 中,标准 C++ 库中的 new 功能将支持 C++ 标准中指定的行为,如果内存分配失败,则会引发 std::bad_alloc 异常. 如果内存分配失败,C 运行库的 new 函数也将引发 st

  • 简单了解C++语言中的二元运算符和赋值运算符

    二元运算符 下表显示可重载的运算符的列表. 可重新定义的二进制运算符 运算符 名称 , 逗号 != 不相等 % 取模 %= 取模/赋值 & 按位"与" && 逻辑"与" &= 按位"与"/赋值 * 乘法 *= 乘法/赋值 + 添加 += 加法/赋值 – 减法 –= 减法/赋值 < 小于 << 左移 <<= 左移/赋值 <= 小于或等于 = 赋值 == 相等 > 大于 >

  • 详解C++编程中的sizeof运算符与typeid运算符

    sizeof 运算符 产生与 char 类型的大小有关的操作数大小. 语法 sizeof unary-expression sizeof ( type-name ) 备注 sizeof 运算符的结果为 size_t 类型,它是包含文件 STDDEF.H 中定义的整数类型.利用此运算符,你可以避免在程序中指定依赖于计算机的数据大小. sizeof 的操作数可以是下列项之一: 类型名称.若要将 sizeof 用于类型名称,则该名称必须用括号括起. 一个表达式.当用于表达式时,无论是否使用括号都可指定

  • 详解C++编程中一元运算符的重载

    可重载的一元运算符如下: !(逻辑"非") &(取址) ~(二进制反码) *(取消指针引用) +(一元加) -(一元求反) ++(递增) --(递减) 转换运算符 后缀递增和递减运算符(++ 和 ––)在递增和递减中单独处理,下面会讲到. 以下规则适用于所有其他一元运算符.若要将一元运算符函数声明为非静态成员,则必须用以下形式声明它: ret-type operator op () 其中 ret-type 是返回类型,op 是上表中列出的运算符之一. 若要将一元运算符函数声明为

  • 详解C++中的函数调用和下标以及成员访问运算符的重载

    函数调用 使用括号调用的函数调用运算符是二元运算符. 语法 primary-expression ( expression-list ) 备注 在此上下文中,primary-expression 为第一个操作数,并且 expression-list(可能为参数的空列表)为第二个操作数.函数调用运算符用于需要大量参数的操作.这之所以有效,是因为 expression-list 是列表而非单一操作数.函数调用运算符必须是非静态成员函数. 函数调用运算符在重载时不会修改函数的调用方式:相反,它会在运算

  • 详解C++中const_cast与reinterpret_cast运算符的用法

    const_cast 运算符 从类中移除 const.volatile 和 __unaligned 特性. 语法 const_cast < type-id > ( expression ) 备注 指向任何对象类型的指针或指向数据成员的指针可显式转换为完全相同的类型(const.volatile 和 __unaligned 限定符除外).对于指针和引用,结果将引用原始对象.对于指向数据成员的指针,结果将引用与指向数据成员的原始(未强制转换)的指针相同的成员.根据引用对象的类型,通过生成的指针.引

  • 详解C++中二进制求补运算符与下标运算符的用法

    二进制求补运算符:~  语法 ~ cast-expression 备注 二进制反码运算符 (~)(有时称为"按位反码"运算符)将生成其操作数的按位二进制反码.即,操作数中为 1 的每个位在结果中为 0.相反,操作数中为 0 的每个位在结果中为 1.二进制反码运算符的操作数必须为整型. ~ 的运算符关键字 compl 运算符是 ~ 的文本等效项.访问程序中的 compl 运算符有两种方式:包括头文件 iso646.h,或使用 /Za 进行编译. // expre_One_Compleme

  • 详解C++中对构造函数和赋值运算符的复制和移动操作

    复制构造函数和复制赋值运算符 从 C++ 11 中开始,该语言支持两种类型的分配:复制赋值和移动赋值. 在本文中,"赋值"意味着复制赋值,除非有其他显式声明. 赋值操作和初始化操作都会导致对象被复制. 赋值:在将一个对象的值赋给另一个对象时,第一个对象将复制到第二个对象中. 因此, Point a, b; ... a = b; 导致 b 的值被复制到 a 中. 初始化:在以下情况下将进行初始化:声明新对象.参数通过值传递给函数或值通过值从函数返回. 您可以为类类型的对象定义"

随机推荐