C++的“::”作用(解决C++调用C函数同名问题)

本文介绍C++的"::"作用,以及据此如何解决C++调用C函数同名问题。

1."::"的功能

"::"运算符在C++运算符中优先级最高。下面介绍"::"在C++的功能。

1)作用域符号

作为作用域符号主要用于我们定义了类静态成员变量或类静态成员函数时使用,通常都必须添加"::"以指示是哪个类的静态函数。

cpp 复制代码
A::Test(a, b);

2)全局作用域符号

作为全局作用域符号主要用于我们定义了全局变量或全局函数时使用,以区别类成员变量和成员函数。

cpp 复制代码
int a = 3;

int main(void)
{
    ::a = 5;

    std::cout << a << std::endl;

    return 0;
}

3)作用域分解符

作为作用域分解符主要用于函数的定义,通常我们在类的头文件中对函数作了声明,在".cpp"文件中定义此类的成员函数时需指定哪个类的成员函数。

头文件:

cpp 复制代码
class Test {

public:
    Test()
    ~Test();
    void open(void);

};

".cpp"文件:

cpp 复制代码
Test::Test()
{

}

Test::~Test()
{

}

void Test::open(void)
{

}

4)命名空间作用域符号

作为命名空间作用域符号主要用于注明所使用的类,函数属于哪一个命名空间,如我们常用的"std"命名空间。这一点注意体会与"1)作用域符号"的区别。

cpp 复制代码
int main(void)
{
    std::cout << "hello,world" << std::endl;

    return 0;
}

2.解决C++调用C函数同名问题

我们在写C++类时,有时候需要调用C程序接口,这涉及到C++本身定义的成员函数名和C函数名重名的问题,如:

cpp 复制代码
Test::Test()
{

}

int Test::open()
{
    int fd;

    fd = open("dev/i2c-1", O_RDWR);

    return 0;
}

其中Test::open()函数中调用的时系统open()函数,这样定义编译器就会报错,因为编译器认为你调用的是Test类的成员函数open(),当然解决方法有多种,比如我们把类的成员函数open()换个名称即可,但有时候为了函数命名规则及调用的明确化,我们可以这样(用到上述"2)全局作用域符号"的功能),如:

cpp 复制代码
Test::Test()
{

}

int Test::open()
{
    int fd;

    fd = ::open("dev/i2c-1", O_RDWR);

    return 0;
}

在被调用的C函数open()前加"::",把C函数当作全局函数调用即可。

总结:本文介绍了C++的"::"作用,以及据此如何解决C++调用C函数同名问题。

相关推荐
啊森要自信2 小时前
【QT】常⽤控件详解(四)常用显示类控件类 Label && LCDNumber && ProgressBar && Calendar Widget
开发语言·数据库·c++·qt·qt6.3
幽迷狂6 小时前
AFSIM入门教程03.03:更新所有依赖库版本
c++·qt·仿真·osgearth·osg·军事·afsim
勇闯逆流河7 小时前
【C++】Stack and Queue and Functor
开发语言·c++
TravisBytes9 小时前
gRPC C++ 从 0 到 1 → 到线上:**超详细** 环境搭建、编码范式、性能调优与 DevOps 全攻略
开发语言·c++·devops
CUC-MenG11 小时前
2025牛客多校第六场 D.漂亮矩阵 K.最大gcd C.栈 L.最小括号串 个人题解
c语言·c++·算法·矩阵
2401_8762213412 小时前
Tasks and Deadlines(Sorting and Searching)
c++·算法
啊阿狸不会拉杆14 小时前
《算法导论》第 2 章 - 算法基础
数据结构·c++·算法·排序算法
啊阿狸不会拉杆14 小时前
《算法导论》第 4 章 - 分治策略
开发语言·数据结构·c++·算法·排序算法
白葵新14 小时前
C#案例实战
c++·python·算法·计算机视觉·c#
一只余弦函数14 小时前
《C++》继承完全指南:从入门到精通
c++