Обмен слова класса и структуры в 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
потому что "почему бы и нет?"