С++: что такое:: for?
Если вы перейдете к принятому ответу этого сообщения
Может кто-нибудь прокомментировать, почему он использует:
double temp = ::atof(num.c_str());
а не просто
double temp = atof(num.c_str());
Также, считается хорошей практикой использовать этот синтаксис, когда вы используете "чистые" глобальные функции?
Ответы
Ответ 1
В нем говорится, что используется глобальная версия, а не заявленная в локальной области. Поэтому, если кто-то объявил atof
в вашем классе, это обязательно будет использовать глобальный.
Посмотрите Википедия на эту тему:
#include <iostream>
using namespace std;
int n = 12; // A global variable
int main() {
int n = 13; // A local variable
cout << ::n << endl; // Print the global variable: 12
cout << n << endl; // Print the local variable: 13
}
Ответ 2
::
- оператор разрешения области. Его использование в этом сценарии, как унарный оператор, заключается в том, что имя (atof
) всегда просматривается в глобальной области - - это может быть полезно для предотвращения скрытия имени от вмешательства в поиск.
Ответ 3
::func()
означает, что эта функция не связана с каким-либо конкретным классом. Он используется, когда существует много функций с одним и тем же именем, и во избежание путаницы между тем, который вы хотите, и конкретными функциями-членами вы предшествуете имени функции оператором области.
Из С++ Primer, 4-е издание, раздел 17.2.1:
"Имена, определяемые глобальными именами областей, объявленными вне любого класса, функции или пространства имен, определяются внутри глобального пространства имен. Глобальное пространство имен объявлено неявно и существует в каждой программе. Каждый файл, который определяет сущности в глобальной области, добавляет те имена в глобальное пространство имен.
Оператор области может использоваться для обращения к членам глобального пространства имен. Поскольку глобальное пространство имен неявно, оно не имеет имени; обозначение
::member_name
относится к члену глобального пространства имен. "
Ответ 4
Предположим, что у вас есть две версии функции f()
, определенные за пределами пространства имен, и одна из них определена внутри. Теперь предположим, что у вас есть еще одна функция g()
в том же пространстве имен. Теперь, если вы сделаете f()
внутри g()
, он вызовет тот, который определен в том же пространстве имен. Но если вы хотите вызвать глобальную версию, вам нужно сделать ::f()
Ответ 5
Оператор:: оператор - оператор разрешения области.
когда используется с спецификатором класса как A:: a, он должен получить доступ к memeber a a класса A.
при использовании без какого-либо спецификатора, он получает глобальную переменную.
Он используется главным образом в следующих конкурсах.
- Чтобы ссылаться на глобальные переменные.
- Чтобы ссылаться на статические члены класса
- Чтобы избежать двусмысленности, когда класс наследуется от нескольких [не виртуальных
базовые] классы.
- С помощью директивы использовать функции базового класса в производном классе, когда в базовом классе есть функция с именем, аналогичным имени производного класса, но для другого типа.
- Чтобы получить доступ к функциям, определенным в глобальной области, когда у вас есть функция, определенная с той же сигнатурой, что и в double temp =:: atof (num.c_str());
- Чтобы создать объекты вложенных классов.