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

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

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

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

28.10.2011, 15:38. Просмотров 3025. Ответов 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".Как это понимать?
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...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
iluxa1810
12 / 12 / 5
Регистрация: 03.09.2011
Сообщений: 1,022
28.10.2011, 19:10  [ТС] #16
А как вообще программисты передают классы клиентам?Их можно отдельно сохранить и дать клиентам,а после открытия класса клиентом,там где у функции есть параметр Private,будет просто отображаться название,а как она выполняется не будет отображаться?
aeshes
440 / 203 / 13
Регистрация: 07.10.2011
Сообщений: 462
28.10.2011, 19:14 #17
iluxa1810, под клиентом класса имеется в виду другой класс или программа, его использующая
Например, когда ты используешь средства STL в своих программах, твоя программа является клиентом классов vector, list и т.д. И она их использует через интерфейс, т.е. специальные методы, предоставленные классами. А как они устроены внутри твою программу не волнует.

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


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

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

Например,

C++
1
2
3
4
5
struct A
{
   enum { size = 10 };
   int a[size];
};
Здесь нельзя, как вы пишите, в любом порядке указывать члены класса! Так что не вводите в заблуждение начинающих программистов!
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
28.10.2011, 20:30 #21
Сыроежка, а можно ещё пример?
Bers
Заблокирован
28.10.2011, 20:33 #22
C++
1
2
3
4
5
[quote=Сыроежка;2114418]struct A
{
* *enum { size = 10 };
* *int a[size];
};[/quote]
Ни в каком порядке не компилируется. Если только енум за рамки класса вытащить.
с другой стороны, если класс уже знает все те типы, с которыми будут оперировать его данные-члены или методы, то объявлять последние можно в любом порядке. Ага.



аааа.. скомпилировалось. Да
Сыроежка
Заблокирован
28.10.2011, 20:36 #23
Цитата Сообщение от Bers Посмотреть сообщение
C++
1
 
Ни в каком порядке не компилируется. Если только енум за рамки класса вытащить.
с другой стороны, если класс уже знает все те типы, с которыми будут оперировать его данные-члены или методы, то объявлять последние можно в любом порядке. Ага.
Почему у вас не компилируется? Что за ошибка выскакивает? Может быть где-то опечатка?

Добавлено через 2 минуты
Цитата Сообщение от silent_1991 Посмотреть сообщение
Сыроежка, а можно ещё пример?
Если на эту тему, то пожалуйста.

C++
1
2
3
4
5
6
7
const int i = 10;
 
struct A
{
   int a[i];
   static const int i = 5;
};
C++
1
2
3
4
5
6
7
const int i = 10;
 
struct A
{
   static const int i = 5;
   int a[i];
};
Хотя этот класс , как говорится, ill-formed, но тем не менее компиляторы спокойно пропускают этот код, и результат будет разным в зависимости от следования членов класса.
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
28.10.2011, 20:39 #24
Сыроежка, а вот глобальные переменные сюда вмешивать не надо, задача зачастую меняется при введении дополнительных условий. Да и в самом начале я говорил несколько о другом, подразумевал скорее взаимодействие полей-данных с методами.
Bers
Заблокирован
28.10.2011, 20:40 #25
Сыроежка, вы осознаете что объявляете новый тип данных на основе уже существующего типа данных?

Ну то есть, вы не используете в классе существующие типы данных, а создаете новые типы прям в объявлении класса. Ничего удивительного, что при таком подходе появляются левые зависимости между типами, а сам класс легко может пофейлится
Сыроежка
Заблокирован
28.10.2011, 20:42 #26
Цитата Сообщение от silent_1991 Посмотреть сообщение
Сыроежка, а вот глобальные переменные сюда вмешивать не надо, задача зачастую меняется при введении дополнительных условий. Да и в самом начале я говорил несколько о другом, подразумевал скорее взаимодействие полей-данных с методами.
Ни в начале, ни сейчас вы ничего правильного в соответствии со стандартом не говорите, а лишь фантазируете! Нужно корректно формулировать утверждения. Стандарт ясно говорит, когда неквалифицированное имя ищется в области имени класса. Я по памяти не помню, но это относится к определениям функций-членов класса, к определению их параметров, к определению аргументов по умолчанию, к ctor-инициализации конструктора, к определениям статических членов класса. Тем не менее порядок следования объявлений членов-данных класса внутри класса очень важен, если опредедение одного члена-данного зависит от определения другого члена-данного.!
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
28.10.2011, 20:44 #27
Сыроежка, вы, конечно, всё сформулировали очень внятно, спасибо вам от всех нас за это.

Цитата Сообщение от Сыроежка Посмотреть сообщение
если опредедение одного члена-данного зависит от определения другого члена-данного.!
Ключевая фраза.
Сыроежка
Заблокирован
28.10.2011, 20:45 #28
Цитата Сообщение от Bers Посмотреть сообщение
Сыроежка, вы осознаете что объявляете новый тип данных на основе уже существующего типа данных?

Ну то есть, вы не используете в классе существующие типы данных, а создаете новые типы прям в объявлении класса. Ничего удивительного, что при таком подходе появляются левые зависимости между типами, а сам класс легко может пофейлится
Я не совсем понял вашу тирпаду, но я вам привел второй пример, где никакие новые типы не объявляются внутри класса. Можно привести более интересеные примеры, когда есть наследование классов. Так как новое имя члена будет скрывать имя члена базового класса. Поэтому порядок объявления членов производного класса будет важен, если они зависимы между собой.
Bers
Заблокирован
28.10.2011, 20:50 #29
Цитата Сообщение от Сыроежка Посмотреть сообщение
int a[i];
обявление нового типа данных.
И этот новый тип данных - масив целых чисел зависит от i

возникает зависимость между массивом a и переменой i

при СОЗДАНИИ нового типа, компилятору нужно знать всю информацию о том, при помощи чего новый тип создаётся.

Если сделать так:

C++
1
2
3
4
5
6
 struct A
    {
        
        int a[i]; // error C2065: i: необъявленный идентификатор
        static const int i = 5;
    };
Что бы не иметь таких проблем, весь необходимый классу тулс должен быть приинклюден перед объявлением класса. Сам же класс только ОБЪЯВЛЯЕТ данные члены (а не создаёт)

Определение же методов никак не зависит от порядка объявления данных-членов

/зы вы ступали понятие "объявления" типа, с понятием "создание" типа
Сыроежка
Заблокирован
28.10.2011, 20:54 #30
Цитата Сообщение от Bers Посмотреть сообщение
обявление нового типа данных.
И этот новый тип данных - масив целых чисел зависит от i

возникает зависимость между массивом a и переменой i

при СОЗДАНИИ нового типа, компилятору нужно знать всю информацию о том, при помощи чего новый тип создаётся.

Если сделать так:

C++
1
2
3
4
5
6
 struct A
    {
        
        int a[i]; // error C2065: i: необъявленный идентификатор
        static const int i = 5;
    };
Что бы не иметь таких проблем, весь необходимый классу тулс должен быть приинклюден перед объявлением класса. Сам же класс только ОБЪЯВЛЯЕТ данные члены (а не создаёт)

Определение же методов никак не зависит от порядка объявления данных-членов

/зы вы ступали понятие "объявления" типа, с понятием "создание" типа
Увы, я не знаю, что такое "создание типа". Проблема на самом деле лежит в том, что вы не знаете станадарта, а фантазируете! Я уже написал, в каких случаях неквалифицированное имя ищется в области видимости класса. Вы же по-прежнему безграмотно пытаетесь что-то там нафантазировать!

Читайте внимательно то, что пишет Сыроежка, и будет вам счастье!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2011, 20:54
Привет! Вот еще темы с ответами:

Наследование, спецификаторы доступа - 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++
Прошу Вас пояснить реальный смысл ключевых слов, перечисленных в теме. С уважением


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
28.10.2011, 20:54
Ответ Создать тему
Опции темы

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