Когда вы должны использовать класс против структуры в C ++? - PullRequest
836 голосов
/ 10 сентября 2008

В каких случаях лучше использовать struct против class в C ++?

Ответы [ 24 ]

7 голосов
/ 10 сентября 2008

Чтобы ответить на мой собственный вопрос (беззастенчиво), как уже упоминалось, привилегии доступа - единственное различие между ними в C ++.

Я склонен использовать структуру только для хранения данных. Я позволю ему получить несколько вспомогательных функций, если это облегчит работу с данными. Однако, как только данные требуют управления потоком (т. Е. Методы получения / установки, которые поддерживают или защищают внутреннее состояние) или начинают приобретать какие-либо основные функциональные возможности (в основном более объектоподобные), они будут «обновлены» до класса, чтобы лучше передавать намерения.

4 голосов
/ 10 сентября 2008

Они в значительной степени одно и то же. Благодаря магии C ++ структура может содержать функции, использовать наследование, созданные с использованием «new» и так далее, как класс

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

На практике я всегда использовал структуры как носители данных, а классы - как объекты.

3 голосов
/ 08 ноября 2017

Класс.

Члены класса по умолчанию являются личными.

class test_one {
    int main_one();
};

эквивалентно

class test_one {
  private:
    int main_one();
};

Так что, если вы попробуете

int two = one.main_one();

Мы получим ошибку: main_one is private, потому что она недоступна. Мы можем решить его, инициализировав его, указав его общедоступный, т. е.

class test_one {
  public:
    int main_one();
};

Struct.

Структура - это класс, члены которого по умолчанию являются публичными.

struct test_one {
    int main_one;
};

Значит main_one является частным, то есть

class test_one {
  public:
    int main_one;
};

Я использую структуры для структур данных, где члены могут принимать любое значение, это так проще.

2 голосов
/ 28 июля 2009

Структуры по умолчанию имеют открытый доступ, а классы по умолчанию имеют частный доступ.

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

2 голосов
/ 28 июля 2009

это одно и то же с разными значениями по умолчанию (частными по умолчанию для class и общедоступными по умолчанию для struct), поэтому теоретически они полностью взаимозаменяемы.

Итак, если я просто хочу упаковать некоторую информацию для перемещения, я использую структуру, даже если я поместил там несколько методов (но не много). Если это в основном непрозрачная вещь, где основное использование было бы через методы, а не напрямую членам данных, я использую полный класс.

2 голосов
/ 15 ноября 2017

Преимущество struct перед class заключается в том, что он сохраняет одну строку кода, если придерживается «сначала открытых участников, затем частных». В этом свете я нахожу ключевое слово class бесполезным.

Вот еще одна причина использования только struct и никогда class. В некоторых рекомендациях по стилю кода для C ++ предлагается использовать строчные буквы для макрокоманд функций. Обоснование заключается в том, что при преобразовании макроса во встроенную функцию имя менять не нужно. Тоже самое. У вас есть хорошая структура в стиле C, и однажды вы обнаружите, что вам нужно добавить конструктор или какой-то удобный метод. Вы меняете его на class? Везде

Различение между struct s и class es - это слишком много хлопот, мешающих сделать то, что мы должны делать - программирование. Как и многие другие проблемы C ++, он возникает из-за сильного желания обратной совместимости.

1 голос
/ 29 июля 2009

Когда вы решите использовать структуру а когда использовать класс в C ++?

Я использую struct, когда определяю functors и POD. В противном случае я использую class.

// '()' is public by default!
struct mycompare : public std::binary_function<int, int, bool>
{
    bool operator()(int first, int second)
    { return first < second; }
};

class mycompare : public std::binary_function<int, int, bool>
{
public:
    bool operator()(int first, int second)
    { return first < second; }
};
1 голос
/ 28 июля 2009

Технически оба одинаковы в C ++ - например, для структуры возможно иметь перегруженные операторы и т. Д.

Однако:

Я использую структуры, когда хочу передать информацию нескольких типов одновременно Я использую классы, когда имею дело с «функциональным» объектом.

Надеюсь, это поможет.

#include <string>
#include <map>
using namespace std;

struct student
{
    int age;
    string name;
    map<string, int> grades
};

class ClassRoom
{
    typedef map<string, student> student_map;
  public :
    student getStudentByName(string name) const 
    { student_map::const_iterator m_it = students.find(name); return m_it->second; }
  private :
    student_map students;
};

Например, я возвращаю студенту struct здесь методы get ... () - наслаждайтесь.

1 голос
/ 15 сентября 2016

Я использую структуры, когда мне нужно создать тип POD или функтор.

1 голос
/ 15 октября 2018

Все члены класса по умолчанию закрыты, а все члены структуры по умолчанию общедоступны. Класс имеет частные базы по умолчанию, а Struct имеет открытые базы по умолчанию. Struct в случае C не может иметь функции-члены, тогда как в случае C ++ мы можем добавлять функции-члены в структуру. Кроме этих различий, я не нахожу в них ничего удивительного.

...