Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.79
iluxa1810
13 / 13 / 5
Регистрация: 03.09.2011
Сообщений: 1,022
#1

Вопрос про Спецификаторы доступа Public и Private - C++

28.10.2011, 15:38. Просмотров 3079. Ответов 42
Метки нет (Все метки)

Читаю Дейтлов...
Дошел до объяснения спецификаторов и не могу понять 2 предложения:
Доступ по умолчанию к элементам класса-закрытый(private),поэтому все элементы между заголовком класса и первым спецификатором доступа являются закрытыми .Спецификаторы public и private могут повторяться,хотя в этом нет необходимости и может приводить к путанице
Еще:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class GradeBook
{
public:
  
   void setCourseName( string name )
   {      
      courseName = name; // store the course name in the object
   } 
   
 
   string getCourseName() 
   {
      return courseName;
   } 
 
 
   void displayMessage()
   {
    
      cout << "Welcome to the grade book for\n" << getCourseName() << "!" 
         << endl;
   } 
private:
   string courseName; 
};
А почему строка
C++
1
2
3
4
   } 
private:
   string courseName; 
};
объявлена в самом конце,а не в начале ?Ведь переменная должна объявляться до ее использования.
Еще комментарий к этой же строке написан "Название курса для данного GradeBook".Как это понимать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2011, 15:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вопрос про Спецификаторы доступа Public и Private (C++):

Public и Private - C++
Доброго времени суток! Написал код и понял, что некоторые методы должны быть private, а не public. Если переношу их в private, то...

Protected Private Public - C++
Возник вопрос, немного наверное бредовый и на практике наврятли применимый, но всё же интересно, а возможно поменять модификатор доступа в...

private, protected, public - C++
class test { public: test(); int getPrivate(); int vpublic; protected: int vprotected; private: int vprivate;

Перевод class из public в private - C++
Помогите пожалуйста, требуется перевести в данной программе классы из public в private Вот код: #include &lt;iostream&gt; #include...

Private и public члены класса - C++
Привет! Есть такой класс: class CDateTime{ private: qint16 year_; qint8 month_, day_; qint8 hours_, minutes_,...

LNK2019: о private и public в классе - C++
Всем суп, есть беда: // &quot;NAbstractNumber.h&quot; class NAbstractNumber{ NAbstractNumber(){}; virtual std::string toString(int...

42
silent_1991
Эксперт С++
4986 / 3043 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
28.10.2011, 15:58 #2
Цитата Сообщение от iluxa1810 Посмотреть сообщение
Доступ по умолчанию к элементам класса-закрытый(private)
Если вы явно не задали спецификатор доступа, то по умолчанию все элементы будут закрытыми.


Цитата Сообщение от iluxa1810 Посмотреть сообщение
поэтому все элементы между заголовком класса и первым спецификатором доступа являются закрытыми
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Foo
{
    // Элементы закрыты, поскольку явно не указан спецификатор доступа
    int a;
    int b;
 
// Все элементы до следующего спецификатора доступа будут открытыми
public:
    int c;
    int d;
 
// Снова закрытые элементы
private:
    int e;
};
Цитата Сообщение от iluxa1810 Посмотреть сообщение
Спецификаторы public и private могут повторяться,хотя в этом нет необходимости и может приводить к путанице
Вы можете как угодно перемешивать спецификаторы доступа, хоть писать их перед каждым элементом:
C++
1
2
3
4
5
6
7
8
class Foo
{
private: int a;
private: int b;
public: int c;
protected: int d;
private: int e;
};
Цитата Сообщение от iluxa1810 Посмотреть сообщение
Ведь переменная должна объявляться до ее использования
Здесь это не работает, у класса единая область видимости. Поэтому всё, что объявлено в любом месте класса, видно так же в любом месте класса.
К этому же: рекомендуется все закрытые данные объявлять в конце класса, а все открытые - в начале, так как пользователь, открыв класс, должен видеть в первую очередь интерфейс (открытые методы), а не шестерёнки (закрытые данные) класса.

Цитата Сообщение от iluxa1810 Посмотреть сообщение
Как это понимать?
Как комментарий)))
1
iluxa1810
13 / 13 / 5
Регистрация: 03.09.2011
Сообщений: 1,022
28.10.2011, 16:57  [ТС] #3
Спасибо,вроде все ясно

Добавлено через 41 минуту
P.S А зачем нужен тип доступа Private ?Разе Public обойтись нельзя,если все правильно сделать?
0
silent_1991
Эксперт С++
4986 / 3043 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
28.10.2011, 17:01 #4
iluxa1810, нет. Интересно, почему - гуглим "инкапсуляция" (или читаем соответствующую главу в книге).
0
iluxa1810
13 / 13 / 5
Регистрация: 03.09.2011
Сообщений: 1,022
28.10.2011, 17:18  [ТС] #5
Написано,для того ,что-бы пользователь взаимодействовал с программой только через интерфейс,для сокрытия жизненно важных компонентов,при локальности переменной.
Про локальность переменной мне ясно.
Но если программа откомпилирована в exe,то как пользователь может что-нибудь испортить ?
0
silent_1991
Эксперт С++
4986 / 3043 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
28.10.2011, 17:22 #6
iluxa1810, пользователь в данном случае не пользователь программы, а пользователь вашего класса. ООП рассчитано на повторное использование кода, и не факт, что код будете использовать только вы. Возьмём библиотечный класс вектор. Что бы было, если бы всем разрешили непосредственно обращаться к памяти, в которой вектор хранит свои элементы?
0
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
28.10.2011, 17:24 #7
Вроде как в книге написано не пользователь, а клиент. Клиент класса. В 5ом издании точно.
0
iluxa1810
13 / 13 / 5
Регистрация: 03.09.2011
Сообщений: 1,022
28.10.2011, 17:32  [ТС] #8
Т.е допустим я создал класс,который надо передать какому-нибудь сотруднику,что бы он его использовал и что бы он его не угробил надо на важных переменных поставить Private?
Еще:А класс можно сохранить в отдельном файле ,как я понял?
И еще:Когда занимался изучением Delphi там была форма,на которую наносился интерфейс,а возможно ли такое в С++?Я скачал Microsoft Visual Studio 2010 и там ничего подобного нет.

Добавлено через 1 минуту
Chelioss, Может это дальше написано.В этой книге любят писать,это называется так-то так-то ,но познакомитесь вы с этим в n главе
0
Bers
Заблокирован
28.10.2011, 17:37 #9
Цитата Сообщение от iluxa1810 Посмотреть сообщение
Но если программа откомпилирована в exe,то как пользователь может что-нибудь испортить ?
В уже скомпилированной программе никаких классов, и никаких приватных или публичных зон не существует.

Все эти приваты и паблики нужны не машине, а людям.
Только на этапе проектирования, и конструирования исходного кода.

Идею инкапсуляции, или например почему лучше менять данные-члены через геттеры/сеттеры, а не напрямую - этому посвящены тонны литературы. Читайте, посвящайтесь. Рекомендую к прочтению книгу Макконелла "совершенный код".

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

Так же, рекомендую книгу Джона Роббинсона "ошибки и отладка"
0
aeshes
441 / 204 / 13
Регистрация: 07.10.2011
Сообщений: 462
28.10.2011, 17:40 #10
Цитата Сообщение от iluxa1810 Посмотреть сообщение
Я скачал Microsoft Visual Studio 2010 и там ничего подобного нет.
iluxa1810, есть, просто тип проекта нужно выбирать соответствующий. Например, MFC или Windows Forms
0
silent_1991
Эксперт С++
4986 / 3043 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
28.10.2011, 17:43 #11
iluxa1810, хотите формочки - лучше смотрите в сторону Qt.
0
Bers
Заблокирован
28.10.2011, 17:50 #12
Цитата Сообщение от silent_1991 Посмотреть сообщение
iluxa1810, хотите формочки - лучше смотрите в сторону Qt.
Это конечно здорова. Только кьют - это мощная библиотека. прежде чем пользоваться инструментами (даже если это такие красивые инструменты, как кьют), человеку бы не мешало понять сам язык.

А то человек не в полне курит, как классы проектировать/конструировать. Рановато ему.. о формочках думать)
0
silent_1991
Эксперт С++
4986 / 3043 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
28.10.2011, 17:56 #13
Bers, я разве советовал сломя голову качать кьют и начинать формошлёпать? Это так, совет на будущее.
0
iluxa1810
13 / 13 / 5
Регистрация: 03.09.2011
Сообщений: 1,022
28.10.2011, 18:09  [ТС] #14
Цитата Сообщение от silent_1991 Посмотреть сообщение
Что бы было, если бы всем разрешили непосредственно обращаться к памяти, в которой вектор хранит свои элементы?
Наверное значения выдавались не верными т.к один запрос поглощает другой...
Получается наверное,что для такого что-бы класс глючил при использовании Public ,программа с классом должна располагаться на сервере и private сделает каждый запрос уникальным и будет выдавать правильные данные ?
0
silent_1991
Эксперт С++
4986 / 3043 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
28.10.2011, 18:20 #15
iluxa1810, вы не в ту степь лезете. Здесь вам не защита информации. Суть разбиения на области доступа в том, чтобы можно было независимо от клиентского кода менять внутреннюю реализацию класса. Т.е. если мы сразу закроем всё внутреннее устройство, то клиент заведомо не сможет построить свой код вокруг закрытых (и в перспективе изменяемых) частей.
Например, раньше наш вектор хранил явно количество элементов (в виде публичной переменной). И был у вектора метод size. Но клиенты же самые умные, зачем им затраты на вызов метода? Поэтому они во всех своих циклах использовали эту самую открытую переменную. Но тут вдруг нам захотелось поменять метод вычисления размера, не хранить его в переменной, а вычислять как разность адресов начала и конца (и хранить эти адреса). Т.е. мы вообще изъяли из кода класса переменную m_size. Что будет? А ничего особенного, просто весь клиентский код полетит к чертям, его придётся переписывать.
Но закрой мы изначально эту переменную, клиенты были бы вынуждены использовать метод size. И после изменения внутреннего представления размера они бы об этом даже не узнали (они и раньше не знали, как класс устроен изнутри, с чего бы им теперь вдруг что-то заметить?)
Вот зачем (вкратце) нужны спецификаторы доступа.
2
28.10.2011, 18:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2011, 18:20
Привет! Вот еще темы с ответами:

Наследование, спецификаторы доступа - C++
Всем привет. Подскажите, что я не правильно делаю Код: #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; class...

Избавиться от public, заменив его на private - C++
Добрый всем день. Подскажите как мне можно полностью избавиться от public, заменив его на private? И как избавиться от глобальных...

Ключевые слова private, public, protected - C++
Смысл ключевых слов private, public, protected в списке базовых классов при декларации производного класса?

Public, Private, Protected (смысл применения) - C++
Прошу Вас пояснить реальный смысл ключевых слов, перечисленных в теме. С уважением


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru