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

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

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

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

28.10.2011, 15:38. Просмотров 3036. Ответов 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...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Bers
Заблокирован
28.10.2011, 21:01 #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{};  //создание нового типа
       
    };

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

Не по теме:

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

0
Сыроежка
Заблокирован
28.10.2011, 21:06 #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; };  // а это его определение
0
Bers
Заблокирован
28.10.2011, 21:14 #34
Цитата Сообщение от Сыроежка Посмотреть сообщение
Вообще-то, в С++ есть такие понятия, как объявление и определение. Этими понятиями и надо пользоваться.
При объявлении класса, мы объявляем данные-члены класса. То есть, мы говорим компилятору: у этого класса будут вот такие данные-члены.


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

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


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


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

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


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

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

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

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

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



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

Если я что-то путаю, попровьте меня.
Типы неизвестны не классу, а компилятору.. Компилятор осуществляет поиск используемых неквалифицированных имен согласно определенному алгоритму. То есть, например, некоторое имя может быть объявлено в пространстве имен, которое заключает в себе определение класса. Может также использоваться директива using. У меня есть на эту тему сообщение на www.clipper.borda.ru.
0
Bers
Заблокирован
28.10.2011, 21:35 #38
уберите, пока не забанили)
0
Сыроежка
Заблокирован
28.10.2011, 21:36 #39
Цитата Сообщение от Bers Посмотреть сообщение
уберите, пока не забанили)
Пусть уберет тот, у кого руки чешутся.
0
Bers
Заблокирован
29.10.2011, 15:19 #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) )
{}
0
Сыроежка
Заблокирован
29.10.2011, 18:45 #41
Цитата Сообщение от Bers Посмотреть сообщение

Не по теме:



ви таки есть анархист!
*деловито срисовал ссылочку*



Добавлено через 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) )
{}
И от этого зависит, так как члены класса создаются в том порядке, в каком они объявлены внутри класса. И соответственно инициализируются в списке ctor в порядке их создания, а не в том порядке, в котором они указаны в списке.
0
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
29.10.2011, 19:20 #42
Цитата Сообщение от Bers Посмотреть сообщение
1. От порядка, в котором объявляются данные члены класса зависит размер класса:
Выводит 12 и 12.
Странно. Должно быть в первом случае точно 4 + 4 + 1
0
Bers
Заблокирован
29.10.2011, 20:34 #43
Цитата Сообщение от Chelioss Посмотреть сообщение
Выводит 12 и 12.
Странно. Должно быть в первом случае точно 4 + 4 + 1
Вот более удачный пример:

C++
1
2
3
4
5
6
7
struct test0  {  int i; int n;  char c;           };
        struct test1  {  int i; int n;  char c;  char u;  };
        struct test2 { char c; int i; char u; int n;      };
 
        std::cout<< sizeof(test0)<<std::endl; //12
        std::cout<< sizeof(test1)<<std::endl; //12
        std::cout<< sizeof(test2)<<std::endl; //16
фокус в том, что структур-муктур выравнивается в памяти. Её размер всегда кратен 4.
Ну это теоретически. На практике зависит от компилятора, и арх процессора. Если я ничего не путаю. Тут нужно смотреть в сторону "выравнивание данных в памяти"

Главное что нужно понять - это что от порядка в котором объявляются данные-члены, зависит размер структуры. И что нужно стремится чары объявлять с чарами, инты с интами.
Тогда размер структуры будит минимальным без упаковки её в памяти (можно делать ещё запакованные структуры, но это потеря производительности, и нафег надо ради 1-2 байт?)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.10.2011, 20:34
Привет! Вот еще темы с ответами:

Наследование, спецификаторы доступа - 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
Объявления
29.10.2011, 20:34
Ответ Создать тему
Опции темы

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