首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

C++面试基础系列-double_colon(::)

  • 25-02-19 04:41
  • 2247
  • 8316
blog.csdn.net

系列文章目录

总目录链接


文章目录

  • 系列文章目录
    • 总目录链接
  • C++面试基础系列-double_colon(::)
    • Overview
    • 1.double_colon(::)关键点
    • 2.double_colon(::)使用示例
      • 2.1.访问类成员
      • 2.2.静态成员访问
      • 2.3.命名空间中的实体
      • 2.4.全局变量和函数
      • 2.5.友元类
      • 2.6.类型转换
      • 2.7.枚举类成员访问
      • 2.8.模板参数
    • 关于作者


C++面试基础系列-double_colon(:?

Overview

  • 全局作用域符(::name):用于类型名称(类、类成员、成员函数、变量等)前,表示作用域为全局命名空间
  • 类作用域符(class::name):用于表示指定类型的作用域范围是具体某个类的
  • 命名空间作用域符(namespace::name):用于表示指定类型的作用域范围是具体某个命名空间的

1.double_colon(::)关键点

在C和C++中,双冒号 :: 被称为作用域解析运算符(scope resolution operator),但它在两种语言中的使用和含义略有不同:

  • C语言中的::
    • 在C语言中,:: 几乎不被使用,因为它主要用于指定全局作用域,而C语言中大部分变量和函数默认就是全局作用域的。不过,:: 可以用来明确指出全局变量或函数,尤其是在与静态成员函数一起使用时。
  • C++中的::
    • 在C++中,:: 的使用要普遍得多,因为它用于解决作用域的问题,尤其是在类(class)和命名空间(namespace)中。
    • 用于访问类的静态成员变量或静态成员函数:ClassName::staticMember。
    • 用于访问命名空间中的成员:NamespaceName::member。
    • 用于在类内部访问全局变量或函数,避免与局部变量或成员变量的名称冲突:::globalVariable。
    • 用于在派生类中访问基类的成员:BaseClassName::member。
  • 全局作用域:
    • 在C++中,如果需要明确指出某个实体属于全局作用域,可以使用 ::。例如,在一个函数内部,如果你想要访问全局变量,可以使用 ::globalVariable。
  • 类型转换:
    • 在C++中,:: 也用于类型转换,称为静态类型转换或类类型转换,例如 Type::pointer。
  • 模板参数:
    • 在C++模板编程中,:: 用于指定模板参数的命名空间或类作用域,例如 std::vector。
  • 匿名空间:
    • 在C++中,:: 还可以用于匿名命名空间,这是一种特殊的命名空间,它提供了文件内唯一的作用域。
  • C++11中的统一初始化:
  • 从C++11开始,:: 不再是统一初始化(Uniform Initialization)的一部分。统一初始化使用花括号 {} 而不是 ::。

总结来说,:: 在C++中是一个关键的运算符,用于处理作用域相关的问题,而在C语言中,由于作用域规则的不同,:: 的使用相对较少。

2.double_colon(::)使用示例

在C++中,双冒号 :: 是作用域解析运算符(scope resolution operator),用于明确指出我们访问的是特定作用域内的实体。以下是 :: 的一些主要用途和示例:

2.1.访问类成员

使用 :: 来访问类的成员变量和成员函数。

class MyClass {
public:
    int memberVar;
    void memberFunc() {
        // ...
    }
};

int main() {
    MyClass myObj;
    myObj.memberVar = 10; // 访问成员变量
    myObj.memberFunc();   // 访问成员函数
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

2.2.静态成员访问

使用 :: 来访问类的静态成员,因为静态成员不属于类的任何特定对象。

class MyClass {
public:
    static int staticMember;
};

int MyClass::staticMember = 20; // 定义静态成员

int main() {
    cout << MyClass::staticMember << endl; // 访问静态成员
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

2.3.命名空间中的实体

使用 :: 来访问命名空间中的实体。

namespace MyNamespace {
    int myVar = 5;
}

int main() {
    cout << MyNamespace::myVar << endl; // 访问命名空间中的变量
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2.4.全局变量和函数

在局部作用域中,使用 :: 来访问全局变量和函数。

int globalVar = 10;

void globalFunc() {
    // ...
}

int main() {
    int localVar = 5;
    ::globalVar = localVar; // 访问全局变量
    ::globalFunc();       // 调用全局函数
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

2.5.友元类

当一个类声明了另一个类为友元时,可以使用 :: 来访问友元类的私有或保护成员。

class FriendClass {
public:
    void friendFunc() {
        // ...
    }
};

class MyClass {
public:
    void accessFriend() {
        FriendClass::friendFunc(); // 访问友元类的成员函数
    }
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

2.6.类型转换

:: 也用于静态类型转换,即 static_cast。

class Base {
public:
    virtual void func() {
        // ...
    }
};

class Derived : public Base {
public:
    void func() override {
        // ...
    }
};

void func(Base* basePtr) {
    Derived* derivedPtr = static_cast<Derived*>(basePtr); // 类型转换
    derivedPtr->func();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

2.7.枚举类成员访问

当枚举被定义在类中时,使用 :: 来访问枚举成员。

class MyClass {
public:
    enum MyEnum { A, B, C };
};

int main() {
    int value = MyClass::A; // 访问枚举成员
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2.8.模板参数

使用 :: 来指定模板参数的命名空间或类作用域。

template <typename T>
void myFunc(T param) {
    // ...
}

int main() {
    myFunc<std::vector<int>>(10); // 使用 :: 指定模板参数的命名空间
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

:: 是C++中一个非常有用的运算符,它帮助我们明确地访问作用域内的实体,提高代码的可读性和清晰度。


关于作者

  • 微信公众号:WeSiGJ
  • GitHub:https://github.com/wesigj/cplusplusboys
  • CSDN:https://blog.csdn.net/wesigj
  • 微博:
  • -版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
WeSiGJ
微信公众号
共同分享,共同交流, 共同学习!
注:本文转载自blog.csdn.net的WeSiGJ的文章"https://blog.csdn.net/wesigj/article/details/141347400"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top