Частные структуры С++

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

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


person Dasaru    schedule 10.12.2011    source источник
comment
Вы будете получать доступ к членам частной структуры так же, как вы получаете доступ к членам частного класса. Вопрос имеет смысл только в том случае, если вы считаете структуры и классы разными. Попробуйте думать о них как о почти идентичных.   -  person Mooing Duck    schedule 04.04.2015


Ответы (3)


Да, структуры могут иметь частные члены, вам просто нужно использовать спецификатор доступа для того же.

struct Mystruct
{
    private:
       m_data;

};

Единственная разница между структурой и классом:

  • спецификатор доступа по умолчанию имеет значение private для класса и public для структуры.
  • Наследование по умолчанию является закрытым для класса и общедоступным для структуры.

Как вы можете получить к ним доступ?
Так же, как вы получаете доступ к закрытым членам класса. то есть: к ним можно получить доступ только внутри функций-членов структур, а не в производной структуре и т. д.

person Alok Save    schedule 10.12.2011

Единственная разница между struct и class заключается в доступе по умолчанию (за исключением некоторых странных ситуаций с шаблонами, см. комментарии Альфа ниже). Это означает, что вы можете получить доступ к закрытым членам так же, как и в классе:

struct foo {
  int get_X() { return x; }
  void set_X(int x_) { x = x_; }
private:
  int x;
};

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

person bdonlan    schedule 10.12.2011
comment
ну, что касается ключевых слов, есть также разница в списке параметров шаблона, например. template< template< class Foo > class Bar >. вы не можете написать это с помощью struct. :-) - person Cheers and hth. - Alf; 10.12.2011
comment
@AlfP.Steinbach, интересно. Я всегда пишу шаблоны с typename, поэтому никогда не замечал :) - person bdonlan; 10.12.2011
comment
вы не можете использовать для этого typename (это будет синтаксическая ошибка). Ваше здоровье, - person Cheers and hth. - Alf; 10.12.2011
comment
@ AlfP.Steinbach, а, по сути, это шаблон, принимающий функцию типа в качестве параметра? Интересный. Никогда не знал, что это вообще возможно. - person bdonlan; 10.12.2011
comment
@AlfP.Steinbach Я считаю, что прав, говоря, что нельзя использовать ключевое слово struct в шаблоне любого типа, поскольку нужно использовать либо class, либо typename. Тот факт, что вы сделали пример с использованием параметра шаблона шаблона, на самом деле немного сбивает с толку. - person NeXuS; 10.12.2011
comment
@Nexus: я думаю, вы говорите о списке параметров шаблона, и в этом случае я думаю, что вы правы. Я использовал параметр шаблона шаблона только потому, что в этом случае необходимо использовать ключевое слово class. - person Cheers and hth. - Alf; 10.12.2011
comment
@ AlfP.Steinbach Хорошо, но в вашем примере смущает то, что template<template <typename Foo> class Bar> class MyClass; совершенно законно. Просто хотел указать на это. - person NeXuS; 10.12.2011

Одна вещь, которая делает это полезным, заключается в том, что вы также можете использовать ключевое слово друга в структурах, поэтому частные члены могут использоваться и изменяться только теми конкретными функциями или классами или чем-то еще, что вы хотите иметь возможность изменять. Таким образом, пользователь не может изменять эти разделы самостоятельно. Они даже не будут отображаться в функциях автозаполнения, по крайней мере, в Visual Studio.

person Peter Addy    schedule 03.04.2015