Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.79
iluxa1810
12 / 12 / 5
Регистрация: 03.09.2011
Сообщений: 1,022
28.10.2011, 15:38     Вопрос про Спецификаторы доступа Public и Private #1
Читаю Дейтлов...
Дошел до объяснения спецификаторов и не могу понять 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".Как это понимать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2011, 15:38     Вопрос про Спецификаторы доступа Public и Private
Посмотрите здесь:

C++ Protected Private Public
C++ private, protected, public
C++ Private и public члены класса
Public и Private C++
C++ LNK2019: о private и public в классе
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
28.10.2011, 15:58     Вопрос про Спецификаторы доступа Public и Private #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 Посмотреть сообщение
Как это понимать?
Как комментарий)))
iluxa1810
12 / 12 / 5
Регистрация: 03.09.2011
Сообщений: 1,022
28.10.2011, 16:57  [ТС]     Вопрос про Спецификаторы доступа Public и Private #3
Спасибо,вроде все ясно

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

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

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

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

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

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

А то человек не в полне курит, как классы проектировать/конструировать. Рановато ему.. о формочках думать)
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
28.10.2011, 17:56     Вопрос про Спецификаторы доступа Public и Private #13
Bers, я разве советовал сломя голову качать кьют и начинать формошлёпать? Это так, совет на будущее.
iluxa1810
12 / 12 / 5
Регистрация: 03.09.2011
Сообщений: 1,022
28.10.2011, 18:09  [ТС]     Вопрос про Спецификаторы доступа Public и Private #14
Цитата Сообщение от silent_1991 Посмотреть сообщение
Что бы было, если бы всем разрешили непосредственно обращаться к памяти, в которой вектор хранит свои элементы?
Наверное значения выдавались не верными т.к один запрос поглощает другой...
Получается наверное,что для такого что-бы класс глючил при использовании Public ,программа с классом должна располагаться на сервере и private сделает каждый запрос уникальным и будет выдавать правильные данные ?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
28.10.2011, 18:20     Вопрос про Спецификаторы доступа Public и Private #15
iluxa1810, вы не в ту степь лезете. Здесь вам не защита информации. Суть разбиения на области доступа в том, чтобы можно было независимо от клиентского кода менять внутреннюю реализацию класса. Т.е. если мы сразу закроем всё внутреннее устройство, то клиент заведомо не сможет построить свой код вокруг закрытых (и в перспективе изменяемых) частей.
Например, раньше наш вектор хранил явно количество элементов (в виде публичной переменной). И был у вектора метод size. Но клиенты же самые умные, зачем им затраты на вызов метода? Поэтому они во всех своих циклах использовали эту самую открытую переменную. Но тут вдруг нам захотелось поменять метод вычисления размера, не хранить его в переменной, а вычислять как разность адресов начала и конца (и хранить эти адреса). Т.е. мы вообще изъяли из кода класса переменную m_size. Что будет? А ничего особенного, просто весь клиентский код полетит к чертям, его придётся переписывать.
Но закрой мы изначально эту переменную, клиенты были бы вынуждены использовать метод size. И после изменения внутреннего представления размера они бы об этом даже не узнали (они и раньше не знали, как класс устроен изнутри, с чего бы им теперь вдруг что-то заметить?)
Вот зачем (вкратце) нужны спецификаторы доступа.
iluxa1810
12 / 12 / 5
Регистрация: 03.09.2011
Сообщений: 1,022
28.10.2011, 19:10  [ТС]     Вопрос про Спецификаторы доступа Public и Private #16
А как вообще программисты передают классы клиентам?Их можно отдельно сохранить и дать клиентам,а после открытия класса клиентом,там где у функции есть параметр Private,будет просто отображаться название,а как она выполняется не будет отображаться?
aeshes
 Аватар для aeshes
437 / 200 / 13
Регистрация: 07.10.2011
Сообщений: 462
28.10.2011, 19:14     Вопрос про Спецификаторы доступа Public и Private #17
iluxa1810, под клиентом класса имеется в виду другой класс или программа, его использующая
Например, когда ты используешь средства STL в своих программах, твоя программа является клиентом классов vector, list и т.д. И она их использует через интерфейс, т.е. специальные методы, предоставленные классами. А как они устроены внутри твою программу не волнует.

Хотя, как написал silent_1991 ниже, ты вполне в исходниках можешь ознакомится с их внутренним устройством, но не пользоваться им напрямую
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
28.10.2011, 19:15     Вопрос про Спецификаторы доступа Public и Private #18
iluxa1810, да нет же! Это не защита авторских прав. Это защита от дурака, на уровне написания кода. Вы вполне можете открыть исходники той же STL и посмотреть, как там всё реализовано. Но при написании кода вы можете опираться только на публичную часть, хоть и знаете (возможно) устройство приватной. Для защиты авторских прав пользуются другими методами.
Bers
Заблокирован
28.10.2011, 19:15     Вопрос про Спецификаторы доступа Public и Private #19
Цитата Сообщение от iluxa1810 Посмотреть сообщение
А как вообще программисты передают классы клиентам?Их можно отдельно сохранить и дать клиентам,а после открытия класса клиентом,там где у функции есть параметр Private,будет просто отображаться название,а как она выполняется не будет отображаться?
Вам нужно читать книжки для самых маленьких.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2011, 20:22     Вопрос про Спецификаторы доступа Public и Private
Еще ссылки по теме:

Перевод class из public в private C++
Избавиться от public, заменив его на private C++
Наследование, спецификаторы доступа C++

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

Или воспользуйтесь поиском по форуму:
Сыроежка
Заблокирован
28.10.2011, 20:22     Вопрос про Спецификаторы доступа Public и Private #20
Цитата Сообщение от silent_1991 Посмотреть сообщение


Здесь это не работает, у класса единая область видимости. Поэтому всё, что объявлено в любом месте класса, видно так же в любом месте класса.

Как комментарий)))
Это не соответствует действительности!

Например,

C++
1
2
3
4
5
struct A
{
   enum { size = 10 };
   int a[size];
};
Здесь нельзя, как вы пишите, в любом порядке указывать члены класса! Так что не вводите в заблуждение начинающих программистов!
Yandex
Объявления
28.10.2011, 20:22     Вопрос про Спецификаторы доступа Public и Private
Ответ Создать тему
Опции темы

Текущее время: 05:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru