что значит двойное двоеточие в c

Что означает добавленное двойное двоеточие»::»?

Я нашел эту строку кода в класс, который я должен изменить:

8 ответов

это гарантирует, что разрешение происходит из глобального пространства имен, а не начинается с пространства имен, в котором вы находитесь. Например, если у вас было два разных класса под названием Configuration такие как:

на :: оператор называется оператором разрешения области и делает именно это, он разрешает область. Таким образом, префикс type-name с этим указывает компилятору искать тип в глобальном пространстве имен.

много разумных ответов уже. Я приведу аналогию, которая может помочь некоторым читателям. :: работает очень похоже на разделитель каталогов файловой системы’ / ‘, при поиске вашего пути для программы, которую вы хотели бы запустить. Подумайте:

. одинаково ясно в пространстве имен C++ «дерево».

:: является оператором разрешения области. Он используется для определения области действия чего-либо.

например, :: только глобальная область, вне всех других пространств имен.

some::thing можно интерпретировать любым из следующих способов:

Итак, вернемся к вашему примеру, ::thing может быть только что-то в глобальной области видимости: тип, функция, объект или пространство имен.

способ его использования предполагает (используется в объявлении указателя), что это тип в глобальной области.

Я надеюсь, что этот ответ является полным и достаточно правильным, чтобы помочь вам понять разрешение области.

:: используется для связи чего-либо (переменной, функции, класса, typedef и т. д. ) в пространство имен или в класс.

его называют оператором разрешения области, скрытое глобальное имя можно ссылаться с помощью оператора разрешения области::
Например:

значение «взять имя из глобального пространства имен, а не что-либо еще». Но почему это должно быть написано явно?

использовать case-пространство имен clash

прецедент-подчеркните функцию, не являющуюся членом

когда вы пишете функцию-член (метод), вызовы другой функции-члена и вызовы нечленов (свободных) функций выглядят одинаково:

поэтому, чтобы сделать это более четко, можно либо написать this->Twist показать читателю, что Twist является функцией-членом или write ::Bend чтобы показать, что Bend бесплатно. Или обоих. Это очень полезно, когда вы выполнение или планирование рефакторинга.

например, если вы хотите использовать cout без упоминания using namespace std; в своем коде вы пишете следующее:

когда пространство имен не упоминается, то говорится, что класс принадлежит глобальному пространству имен.

Источник

Двойное двоеточие перед функцией в С++

Операция двойного двоеточия называется операцией разрешения области видимости. Когда мы пишем ::func() (слева от оператора ничего нет), мы уточняем принадлежность к области видимости глобального пространства имён? Зачем?

что значит двойное двоеточие в c. Смотреть фото что значит двойное двоеточие в c. Смотреть картинку что значит двойное двоеточие в c. Картинка про что значит двойное двоеточие в c. Фото что значит двойное двоеточие в c

2 ответа 2

что значит двойное двоеточие в c. Смотреть фото что значит двойное двоеточие в c. Смотреть картинку что значит двойное двоеточие в c. Картинка про что значит двойное двоеточие в c. Фото что значит двойное двоеточие в c

Правила поиска имен (name lookup) в С++ очень сильно отличаются для случая квалифицированных имен (т.е. с явным указанием класса или пространства имен) и неквалифицированных имен (без такого указания). Если вас чем-то не устраивает поведение неквалифицированного поиска, которое сложно, многоэтажно и включает в себя массу нюансов вроде ADL, то вы можете подавить это поведение путем указания квалифицированного имени.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками c++ или задайте свой вопрос.

Похожие

Подписаться на ленту

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

дизайн сайта / логотип © 2021 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2021.11.12.40742

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Источник

двойное двоеточие (: 🙂 перед объявлением метода в определении класса

У меня есть класс, написанный третьей стороной, который имеет что-то вроде этого Foo.h:

И в Foo.cpp, dosomething это:

Что это :: перед именем функции в шапке имеется ввиду? Когда я создаю новый объект

Я не могу получить доступ к функции dosomething, как это:

Как получить доступ к dosomething? Когда я удаляю :: в заголовочном файле перед чем-то вроде этого:

Я могу получить доступ к dosomething из объекта типа Foo.

Решение

В общем то не нелегальный использовать :: Оператор области действия по сравнению с существующей областью класса ссылается на своих собственных членов (даже если это избыточно).

После точки объявления члена класса его имя можно найти в области его действия.
учебный класс. [ Замечания: это верно, даже если класс является неполным классом. Например,
struct X <
enum E < z = 16 >;
int b[X::z]; // ХОРОШО
>;
C ++ 11 §3.3.2 №5

Проблема в том, что определение пункт декларации кажется, исключает использование оператора области действия в объявлении члена, если оно от своего имени.

пункт декларации имя сразу после его полного декларатора (пункт 8) и до его инициализатор (если есть), за исключением случаев, указанных ниже. [ Пример:
int x = 12;
< int x = x; >
Здесь второй x инициализируется своим собственным (неопределенным) значением. — конец примера ] C ++ 11 §3.3.2 №1

Нет никаких исключений для членов класса в параграфах, которые следуют в остальной части §3.3.2.

Даже с учетом вышеуказанного ограничения, синтаксис для членов класса не запрещает использование Квалифицированный-идентификатор для имени участника. Следовательно, синтаксическая ошибка не заключается в принятии показанного кода. Но есть семантическое нарушение, и диагностика должна была быть выдана.

Другие решения

Неправильно (и многие компиляторы считают это ошибкой) добавлять область действия к имени функции в определение класса. Поскольку он уже находится в области видимости класса, вы по существу определяете область действия функций как Foo::Foo::dosomething что неправильно.

Чтобы ответить на ваш вопрос о том, что :: делает, это определяет объем функции. Рассмотрим эти две функции

Первая — это свободная функция, последняя — метод Foo класс и (так как ему не предшествует слово static ) требуется экземпляр Foo быть вызванным из.

Источник

В чем смысл двойного двоеточия с префиксом «::»?

Я нашел эту строку кода в классе, который мне нужно изменить:

8 ответов

Это гарантирует, что разрешение происходит из глобального пространства имен, вместо того, чтобы запускаться в пространстве имен, в котором вы сейчас находитесь. Например, если у вас было два разных класса с именем Configuration как таковые:

Оператор :: называется оператором с разрешающей способностью и делает именно это, он разрешает область действия. Таким образом, путем префикса имени типа этим, он сообщает вашему компилятору посмотреть в глобальном пространстве имен для типа.

Много разумных ответов уже. Я приведу аналогию, которая может помочь некоторым читателям. :: работает так же, как разделитель каталогов файловой системы ‘ / ‘, когда вы ищите в своем пути программу, которую хотите запустить. Рассматривать:

. одинаково явно в пространстве имен C++ «tree».

3) C++ всегда ищет глобальное пространство имен (например, имеет / неявно ваш PATH ).

Общая дискуссия о пространствах имен и явности символов

Использование absolute ::abc::def. «paths» иногда может быть полезно для изоляции вас от любых других пространств имен, которые вы используете, частично, но на самом деле не контролируете содержимое или даже другие библиотеки что код вашей библиотеки клиента также использует. С другой стороны, он также более тесно связывает вас с существующим «абсолютным» расположением символа, и вы упускаете преимущества неявного сопоставления в пространствах имен: меньшая связь, более легкая мобильность кода между пространствами имен и более лаконичный, читаемый исходный код,

Таким образом, ведущий :: является одним из инструментов в наборе инструментов C++ для активной устранения неоднозначности известного столкновения и/или устранения возможности будущей неоднозначности.

Источник

этот вопрос уже есть ответ здесь:

что значит :1 и :8 в смысле?

4 ответов:

это битовые поля. В основном, число после двоеточия описывает, сколько битов использует это поле. Вот это цитата из MSDN описания битовых полей:

константное выражение, задающее ширину поля в битах. Этот спецификатор типа для Декларатора должен быть unsigned int, signed int или int, а константа-выражение должно быть неотрицательным целочисленным значением. Если значение равно нулю, объявление не имеет Декларатора. Массивы битов поля, указатели на битовые поля и функции, возвращающие битовые поля не позволять. Необязательный Декларатор называет битовое поле. Битовое поле может быть объявлен только как часть структуры. Адрес-оператора ( & ) не может быть применен к компонентам битового поля.

безымянные битовые поля нельзя ссылаться, и их содержание в время непредсказуемо. Их можно использовать как «фиктивные» поля, для цели выравнивания. Неименованное битовое поле, ширина которого определяется как 0 гарантирует, что хранение для члена, следующего за ним в struct-declaration-list начинается на границе int.

в этом примере определяется двумерный массив структур с именем screen.

Edit: еще один важный бит из ссылки MSDN:

битовые поля имеют ту же семантику, что и целочисленный тип. Это означает битовое поле используется в выражениях точно так же, как переменная того же базового типа будет используется, независимо от того, сколько бит в битовом поле.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *