Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.79
iluxa1810
13 / 13 / 11
Регистрация: 03.09.2011
Сообщений: 1,026
#1

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

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

Читаю Дейтлов...
Дошел до объяснения спецификаторов и не могу понять 2 предложения:
http://www.cyberforum.ru/cpp-beginners/thread1202015.html
Доступ по умолчанию к элементам класса-закрытый(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++):

private, protected, public
class test { public: test(); int getPrivate(); int vpublic; protected:...

Protected Private Public
Возник вопрос, немного наверное бредовый и на практике наврятли применимый, но...

Private и public члены класса
Привет! Есть такой класс: class CDateTime{ private: qint16 year_; ...

Перевод class из public в private
Помогите пожалуйста, требуется перевести в данной программе классы из public в...

LNK2019: о private и public в классе
Всем суп, есть беда: // &quot;NAbstractNumber.h&quot; class NAbstractNumber{ ...

42
silent_1991
Эксперт С++
5007 / 3065 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 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 / 11
Регистрация: 03.09.2011
Сообщений: 1,026
28.10.2011, 16:57  [ТС] #3
Спасибо,вроде все ясно

Добавлено через 41 минуту
P.S А зачем нужен тип доступа Private ?Разе Public обойтись нельзя,если все правильно сделать?
0
silent_1991
Эксперт С++
5007 / 3065 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
28.10.2011, 17:01 #4
iluxa1810, нет. Интересно, почему - гуглим "инкапсуляция" (или читаем соответствующую главу в книге).
0
iluxa1810
13 / 13 / 11
Регистрация: 03.09.2011
Сообщений: 1,026
28.10.2011, 17:18  [ТС] #5
Написано,для того ,что-бы пользователь взаимодействовал с программой только через интерфейс,для сокрытия жизненно важных компонентов,при локальности переменной.
Про локальность переменной мне ясно.
Но если программа откомпилирована в exe,то как пользователь может что-нибудь испортить ?
0
silent_1991
Эксперт С++
5007 / 3065 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
28.10.2011, 17:22 #6
iluxa1810, пользователь в данном случае не пользователь программы, а пользователь вашего класса. ООП рассчитано на повторное использование кода, и не факт, что код будете использовать только вы. Возьмём библиотечный класс вектор. Что бы было, если бы всем разрешили непосредственно обращаться к памяти, в которой вектор хранит свои элементы?
0
Chelioss
181 / 181 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
28.10.2011, 17:24 #7
Вроде как в книге написано не пользователь, а клиент. Клиент класса. В 5ом издании точно.
0
iluxa1810
13 / 13 / 11
Регистрация: 03.09.2011
Сообщений: 1,026
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
442 / 205 / 21
Регистрация: 07.10.2011
Сообщений: 462
28.10.2011, 17:40 #10
Цитата Сообщение от iluxa1810 Посмотреть сообщение
Я скачал Microsoft Visual Studio 2010 и там ничего подобного нет.
iluxa1810, есть, просто тип проекта нужно выбирать соответствующий. Например, MFC или Windows Forms
0
silent_1991
Эксперт С++
5007 / 3065 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
28.10.2011, 17:43 #11
iluxa1810, хотите формочки - лучше смотрите в сторону Qt.
0
Bers
Заблокирован
28.10.2011, 17:50 #12
Цитата Сообщение от silent_1991 Посмотреть сообщение
iluxa1810, хотите формочки - лучше смотрите в сторону Qt.
Это конечно здорова. Только кьют - это мощная библиотека. прежде чем пользоваться инструментами (даже если это такие красивые инструменты, как кьют), человеку бы не мешало понять сам язык.

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

Хотя, как написал silent_1991 ниже, ты вполне в исходниках можешь ознакомится с их внутренним устройством, но не пользоваться им напрямую
0
silent_1991
Эксперт С++
5007 / 3065 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
28.10.2011, 19:15 #18
iluxa1810, да нет же! Это не защита авторских прав. Это защита от дурака, на уровне написания кода. Вы вполне можете открыть исходники той же STL и посмотреть, как там всё реализовано. Но при написании кода вы можете опираться только на публичную часть, хоть и знаете (возможно) устройство приватной. Для защиты авторских прав пользуются другими методами.
0
Bers
Заблокирован
28.10.2011, 19:15 #19
Цитата Сообщение от iluxa1810 Посмотреть сообщение
А как вообще программисты передают классы клиентам?Их можно отдельно сохранить и дать клиентам,а после открытия класса клиентом,там где у функции есть параметр Private,будет просто отображаться название,а как она выполняется не будет отображаться?
Вам нужно читать книжки для самых маленьких.
1
Сыроежка
Заблокирован
28.10.2011, 20:22 #20
Цитата Сообщение от silent_1991 Посмотреть сообщение


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

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

Например,

C++
1
2
3
4
5
struct A
{
   enum { size = 10 };
   int a[size];
};
Здесь нельзя, как вы пишите, в любом порядке указывать члены класса! Так что не вводите в заблуждение начинающих программистов!
0
28.10.2011, 20:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2011, 20:22
Привет! Вот еще темы с решениями:

Перевод class из public в private
Помогите пожалуйста, требуется перевести в данной программе классы из public в...

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

Не могу разобраться. public/private/protected
#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;time.h&gt; using...

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


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

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

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