作用域操作符的不同用法

Different use of scope operator

本文关键字:用法 操作符 作用域      更新时间:2023-10-16

要将字符串转换为小写,我们可以这样做:

#include <iostream>
#include <algorithm>
#include <string>
#include <cctype>
using namespace std;
int main()
{
    string str("Sample STRING");
    cout << str << endl;
    std::transform(str.begin(), str.end(), str.begin(), ::tolower);
    cout << str << endl;
    return 0;
}

我知道std::transform是什么;但是作用域操作符::在函数tolower前面做什么呢?

如果我删除了作用域操作符,那么编译器会报错函数不匹配。如果我在::操作符前面添加std,那么编译器也会抱怨函数不匹配。tolower前面的作用域操作符的目的是什么?我不知道它叫什么,我到处寻找解释,但无济于事。

  1. 你应该#include <algorithm>使用std::transform
  2. 需要的tolower函数在ctype.hcctype中定义。您应该包含这些头文件中的一个。前者在全局命名空间中声明tolower;后者在std命名空间中声明它。如果没有::,您可能会选择在<locale>头文件中声明的函数模板std::tolower。当然,这只会发生,因为你有using namespace std;。这是using namespace std;如何危险的一个特殊例子。
  3. 左边没有任何内容的::意味着右边的名称将"在全局范围内查找",并将找到全局tolower而不是std::tolower。(因此,您应该#include <ctype.h>以确保您获得全局声明。)

没有左侧的::绕过查找所有可访问的子作用域,并强制使用根(或全局)作用域。