Обмен слова класса и структуры в C++

Я читал об одной странной функции C++, называемой Injected class name.

Я попробовал следующую простую программу

#include <iostream>
class test
{
    int s{3};
    public:
    int get_s()
    { return s; }
};
int main() {
    class test::test s;  // struct test::test s; also allowed. Why???
    std::cout<<s.get_s();
}

Если я заменил ключевое слово class на struct в первой строке main(), программа все равно скомпилируется и будет работать нормально. Смотрите живое демо здесь. Зачем? Я не должен получить ошибку компилятора? Почему он хорошо компилируется?

4 ответа

Решение

Я полагаю, что соответствующий стих находится в 7.1.6.3/3 (выделение моего, цитируемого здесь из проекта стандарта C++17):

Таким образом, в любом разработанном спецификаторе типа enum ключевое слово должно использоваться для ссылки на перечисление (7.2), union ключ-класс должен использоваться для ссылки на объединение (раздел 9), а также class или же struct ключ-класс должен использоваться для ссылки на класс (раздел 9), объявленный с использованием class или же struct ключ класса.

Таким образом, любое ключевое слово может использоваться для определения области действия, в которой существует введенное имя класса, независимо от того, какое из них использовалось для объявления / определения. test,

Структура и класс почти идентичны в C++. Единственное отличие состоит в том, что члены структур по умолчанию являются открытыми, а члены классов по умолчанию являются закрытыми.

полный ответ см. здесь: C / C++ Struct vs Class

Извините, может быть, я неправильно понял ваш пост, но в C++ нет больших различий между классом и структурой. Основные отличия, которые я знаю, в том, что по умолчанию в структуре все поля public.

Существует сообщение о различиях между структурой и классом: каковы различия между структурой и классом в C++?

class test s;или жеstruct test s; тоже работает

Классы и структуры в C++ - это практически одно и то же.

Разница в том, что:

struct A{
};

как

class A{
public:
};

а также

class B{
};

как

struct B{
private:
};

Позволяет вам использовать struct Префикс для совместимости с C, и я думаю, что он распространяется на class потому что "почему бы и нет?"

Другие вопросы по тегам