Форум программистов, компьютерный форум 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, 20:30     Вопрос про Спецификаторы доступа Public и Private #21
Сыроежка, а можно ещё пример?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bers
Заблокирован
28.10.2011, 20:33     Вопрос про Спецификаторы доступа Public и Private #22
C++
1
2
3
4
5
[quote=Сыроежка;2114418]struct A
{
* *enum { size = 10 };
* *int a[size];
};[/quote]
Ни в каком порядке не компилируется. Если только енум за рамки класса вытащить.
с другой стороны, если класс уже знает все те типы, с которыми будут оперировать его данные-члены или методы, то объявлять последние можно в любом порядке. Ага.



аааа.. скомпилировалось. Да
Сыроежка
Заблокирован
28.10.2011, 20:36     Вопрос про Спецификаторы доступа Public и Private #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
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
28.10.2011, 20:39     Вопрос про Спецификаторы доступа Public и Private #24
Сыроежка, а вот глобальные переменные сюда вмешивать не надо, задача зачастую меняется при введении дополнительных условий. Да и в самом начале я говорил несколько о другом, подразумевал скорее взаимодействие полей-данных с методами.
Bers
Заблокирован
28.10.2011, 20:40     Вопрос про Спецификаторы доступа Public и Private #25
Сыроежка, вы осознаете что объявляете новый тип данных на основе уже существующего типа данных?

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

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

Ну то есть, вы не используете в классе существующие типы данных, а создаете новые типы прям в объявлении класса. Ничего удивительного, что при таком подходе появляются левые зависимости между типами, а сам класс легко может пофейлится
Я не совсем понял вашу тирпаду, но я вам привел второй пример, где никакие новые типы не объявляются внутри класса. Можно привести более интересеные примеры, когда есть наследование классов. Так как новое имя члена будет скрывать имя члена базового класса. Поэтому порядок объявления членов производного класса будет важен, если они зависимы между собой.
Bers
Заблокирован
28.10.2011, 20:50     Вопрос про Спецификаторы доступа Public и Private #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     Вопрос про Спецификаторы доступа Public и Private #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;
    };
Что бы не иметь таких проблем, весь необходимый классу тулс должен быть приинклюден перед объявлением класса. Сам же класс только ОБЪЯВЛЯЕТ данные члены (а не создаёт)

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

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

Читайте внимательно то, что пишет Сыроежка, и будет вам счастье!
Bers
Заблокирован
28.10.2011, 21:01     Вопрос про Спецификаторы доступа Public и Private #31
Цитата Сообщение от Сыроежка Посмотреть сообщение
Увы, я не знаю, что такое "создание типа".

C++
1
2
3
4
5
 struct A  //создание нового типа
    {
       struct B{};  //создание нового типа
       B b;
    };
C++
1
2
3
4
5
6
7
 struct A  //создание нового типа
    {
       
       B b; //нельзя. что бы построить b компилятор УЖЕ должен знать что такое тип B
       struct B{};  //создание нового типа
       
    };

Создавать новые типы внутри создаваемых типов - практика ведущая к ошибкам.
silent_1991
28.10.2011, 21:02
  #32

Не по теме:

Чёрт, почему на форуме нет молящегося смайлика?..

Сыроежка
Заблокирован
28.10.2011, 21:06     Вопрос про Спецификаторы доступа Public и Private #33
Цитата Сообщение от Bers Посмотреть сообщение
C++
1
2
3
4
5
 struct A
    {
       struct B{};  //создание нового типа
       B b;
    };
C++
1
2
3
4
5
6
7
 struct A
    {
       
       B b; //нельзя. что бы построить b компилятор УЖЕ должен знать что такое тип B
       struct B{};  //создание нового типа
       
    };

Создавать новые типы внутри создаваемых типов - практика ведущая к ошибкам.
Вообще-то, в С++ есть такие понятия, как объявление и определение. Этими понятиями и надо пользоваться. В вашем примере внутри struct A определяется struct B. Определения классов вводят новые имена типов.

И почему вы сделали вывод про "практику, ведущую к ошибкам", я не знаю. Это, например, часто делается при объявлении стандартных контейнеров. Например, итераторы определяются внутри класса контейнера.

P.S. Добавлю также, чтобы вы знали, когда класс только объявляется без его определения. Это когда имя класса вводится с помощью уточненного спецификатора типа (elaborated type specifier). Например,

C++
1
2
3
struct A;  // это только объявление.
 
struct A { int a; };  // а это его определение
Bers
Заблокирован
28.10.2011, 21:14     Вопрос про Спецификаторы доступа Public и Private #34
Цитата Сообщение от Сыроежка Посмотреть сообщение
Вообще-то, в С++ есть такие понятия, как объявление и определение. Этими понятиями и надо пользоваться.
При объявлении класса, мы объявляем данные-члены класса. То есть, мы говорим компилятору: у этого класса будут вот такие данные-члены.


Какие такие? Если к моменту объявления данных-членов, их тип неизвестен компилятору, то это ошибка. Это попытка определить ещё не объявленный тип данных .

Другими словами, согласно общепринятой терминологии, объявляение данных членов класса есть определения типов этих данных членов.


Создание нового типа - объявление типа (не данных-членов этого типа, а самого типа). Понятие очень удобное, дабы не путаться между "объявлением" и "определением" в зависимости от контекста.
Сыроежка
Заблокирован
28.10.2011, 21:16     Вопрос про Спецификаторы доступа Public и Private #35
Цитата Сообщение от Bers Посмотреть сообщение
При объявлении класса, мы объявляем данные-члены класса. То есть, мы говорим компилятору: у этого класса будут вот такие данные-члены.


Какие такие? Если к моменту объявления данных-членов, их тип неизвестен компилятору, то это ошибка. Это попытка определить ещё не объявленный тип данных .

Другими словами, согласно общепринятой терминологии, объявляение данных членов класса есть определения типов этих данных членов.


Создание нового типа - объявление типа (не данных-членов этого типа, а самого типа). Понятие очень удобное, дабы не путаться между "объявлением" и "определением" в зависимости от контекста.
Нет, лучше не пользоваться доморощенными терминами, так как они не унифицированы и могут только запутывать других людей, с кем вы общаетесь, так как они могут в это вкладывать свой смысл.

В стандарте четко говорится, что является объявлением, а что является при этом определением.

С чем я не согласен со стандартом, это то, что typedef не только является объявлением, как написано в стандарте, но может играть роль определения, если используется для классов или перечислений.
Bers
Заблокирован
28.10.2011, 21:22     Вопрос про Спецификаторы доступа Public и Private #36
Сыроежка, суть же довольно проста: вы не можете объявлять в классе данные-члены, типы данных которых классу ещё не известны.

Цитата Сообщение от Сыроежка Посмотреть сообщение
struct A { int a; }; *// а это его определение
Это определение самого класса. А вот сами типы данных-членов должны быть известны классу к моменту их объявления в классе.

Если я что-то путаю, попровьте меня.
Сыроежка
Заблокирован
28.10.2011, 21:34     Вопрос про Спецификаторы доступа Public и Private #37
Цитата Сообщение от Bers Посмотреть сообщение
Сыроежка, суть же довольно проста: вы не можете объявлять в классе данные-члены, типы данных которых классу ещё не известны.



Это определение самого класса. А вот сами типы данных-членов должны быть известны классу к моменту их объявления в классе.

Если я что-то путаю, попровьте меня.
Типы неизвестны не классу, а компилятору.. Компилятор осуществляет поиск используемых неквалифицированных имен согласно определенному алгоритму. То есть, например, некоторое имя может быть объявлено в пространстве имен, которое заключает в себе определение класса. Может также использоваться директива using. У меня есть на эту тему сообщение на www.clipper.borda.ru.
Bers
Заблокирован
28.10.2011, 21:35     Вопрос про Спецификаторы доступа Public и Private #38
уберите, пока не забанили)
Сыроежка
Заблокирован
28.10.2011, 21:36     Вопрос про Спецификаторы доступа Public и Private #39
Цитата Сообщение от Bers Посмотреть сообщение
уберите, пока не забанили)
Пусть уберет тот, у кого руки чешутся.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.10.2011, 15:19     Вопрос про Спецификаторы доступа Public и Private
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Bers
Заблокирован
29.10.2011, 15:19     Вопрос про Спецификаторы доступа Public и Private #40

Не по теме:

Цитата Сообщение от Сыроежка Посмотреть сообщение
Пусть уберет тот, у кого руки чешутся.
ви таки есть анархист!
*деловито срисовал ссылочку*



Добавлено через 17 часов 42 минуты
кстати. Вот очень красноречивый пример того, насколько реально важен порядок объявления данных-членов класса:

1. От порядка, в котором объявляются данные члены класса зависит размер класса:

C++
1
2
3
4
5
    struct test { int i,n;  char c;       };
    struct test2 { int i; char c; int n;   };
 
    std::cout<< sizeof(test)<<std::endl;
    std::cout<< sizeof(test2)<<std::endl;
2. ВАЖНЫЙ МОМЕНТ!!!!
От порядка объявления данных членов в классе зависит то, насколько корректно сработает инициализация данных-членов в списке инициализации:



C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template <class tName, class tCont = std::vector<tName> >
class CTest
{
public:
    CTest(cSize_a nSizeX, cSize_a nSizeY, const tName& nNullElement=tName() );
private:
    //если данные члены переставить местами
    //myTable проинициализируется мусором, 
    //а не корректным значением myNULL_Element
    tName myNULL_Element;   
    std::vector<tCont> myTable;
};
 
template <class tName, class tCont>
CTest<tName, tCont>::CTest(cSize_a nSizeX, cSize_a nSizeY, const tName& nNullElement=tName() ):
myNULL_Element(nNullElement),
myTable(nSizeY, tCont(nSizeX,myNULL_Element) )
{}
Yandex
Объявления
29.10.2011, 15:19     Вопрос про Спецификаторы доступа Public и Private
Ответ Создать тему
Опции темы

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