Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Значения_по_умолчанию в методах класса, не врублюсь никак
|
|||
|---|---|---|---|
|
#18+
Добрый день Уважаемые! (Особенно vDimas). продолжается моя битва с изучением с++ . я читаю книгу Джесса Либерти (мож хто читал). ДОбрался до использования значений, заданных по умолчанию в функциях-членах класса. В обычных функциях я с этим разобрался. Там например в прототипе функции аргументу присваивается значение и если ф-я будет вызвана без аргумента , то будет использовано значение по умолчанию (которое в прототипе стоит). С этим я понял. Но применительно к классам окончательно запутался.Может приведете малюсенький простой пример небольшого класса с демонстрацией этого момента. Заранее спасибо. Как дела у Димаса? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2003, 12:08 |
|
||
|
Значения_по_умолчанию в методах класса, не врублюсь никак
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2003, 13:57 |
|
||
|
Значения_по_умолчанию в методах класса, не врублюсь никак
|
|||
|---|---|---|---|
|
#18+
да дефолт. вроде чо то прояснилось после книжки. Либерти советует инициализировать значения переменных вне тела конструкторов.Согласны с этим, быки? а как код в рамку взять? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2003, 14:47 |
|
||
|
Значения_по_умолчанию в методах класса, не врублюсь никак
|
|||
|---|---|---|---|
|
#18+
Да у классов помоему аналогично (аргументы заданные по умолчанию задаются только в конце списка аргументов). Единственно имеются ньюанс у конструктора - списки инициализации членов. А вот еще, когда разделяешь реализацию от объявления - зачения по умолчанию можно объявить только в одном месте. Если где соврал не пинайте больно, я тоже начинающий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2003, 15:03 |
|
||
|
Значения_по_умолчанию в методах класса, не врублюсь никак
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 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. 26. 27. 28. 29. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2003, 15:50 |
|
||
|
Значения_по_умолчанию в методах класса, не врублюсь никак
|
|||
|---|---|---|---|
|
#18+
прочитал про перегрузку конструкторов и инициализацию объектов.Очень похоже на перегрузку функций. Компилятор сам выберет нужный конструктор из контекста. ////////////////////////////////////////////////////////////////////////////////////////// спасибо funikovyuri за пример , просто супер!!! допёр. Чем больше я вникаю в с++ тем больше кажется что я нихрена не знаю в нем! Это со мной такая зараза или ещо с кем то бывает? что есть std ? может и в небо пальцем, но что то про простанство имен, да? Вот тут еще вопросик созрел. Читаю тут про конструктор-копировщик. Как скопировать значение переменной одного объекта в переменную другого объекта (оба объекта одного класса)? Я ешо не надоел? Говорите ели шо. С форумом быстрей освоение идет, только чо то активность на сишном форуме ниже чем на басиковских или дельфинских. НЕужели мало сишников? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2003, 16:18 |
|
||
|
Значения_по_умолчанию в методах класса, не врублюсь никак
|
|||
|---|---|---|---|
|
#18+
скопировать именно переменную объекта в другую переменную объекта (не важно одного ли класса обекты) можно Код: plaintext 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. Т.е. конструктор копии тут не причем - он всегда инициализирует именно полную копию объекта. В вашем же случае важно как эти обекты друг друга видят (в моем примере они вообще друг о друге ничего не знаю) - в завичимости от этого примеры будут другими Стоит посмотреть еще в сторону переменных класса (static) насчет std - это действительно namespace в котором объявлена STL(standard template library) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2003, 16:48 |
|
||
|
Значения_по_умолчанию в методах класса, не врублюсь никак
|
|||
|---|---|---|---|
|
#18+
так, много вопросов, все важные. 1. значения по-умолчанию. вроде объяснили уже. грабли: сигнатура функции со значением по-умолчанию может совпадать с сигнатурой другой функции: Код: plaintext 1. 2. объявление таких функций компилятор жует нормально, и ехидно ждет, когда же ты попытаешься использовать второй вариант перегруженной функции f1. нет у тебя возможности ее использовать. :) 2. доступ к членам собственного класса (копирование или другое использование переменных). Для начала разберемся с this. Откуда он берется? Дело в том, что не-статические методы классов всегда работают с некоторым экземпляром класса, т.е. с областью памяти, где храняться данные обрабатываемого экземпляра. Код: plaintext 1. 2. 3. 4. 5. хоть функция и описана без параметров, на самом деле ей передается один параметр - указатель на экземпляр класса (область памяти), с которым эта функция будет работать. Аналогично, если мы имеем один параметр, то для функции-метода класса передается два Код: plaintext 1. __thiscall - спецификатор способа вызова (calling convention), есть еще родственный спецификатор __fastcall (в VC++ по-умолчанию используется он), в этом случае указатель this передается не через стек, а через один из регистров (на Ix86 - CX/ECX). Далее, рассмотрим пример использования 2-х и более параметров - указателей на собственный класс (в предыдущем и последующих примерах предполагаем, что все происходит в рамках определения класса s1): Код: plaintext 1. 2. 3. 4. 5. 6. прошу обратить внимание на: - m_k - это private-член класса; - this и s имеют одинаковые права для доступа к членам класса внутри метода этого класса. - порядок разрешения имени, если явно не указан this: 1. локальная переменная или переменная-параметр (одно и то же), 2. член класса, 3. глобальная переменная в текущем namespace, 4. глобальная переменная в вышестоящем namespace (безымянный namespace так и обозначается, как namespace без имени, например ::m_k=10; - явное указание на обращение к переменной m_k из глобального безымянного namespace) 3. модификатор const не позволяет изменять не mutable члены класса. Код: plaintext 1. 2. 3. 4. 5. 6. 4. Конструктор копирования всегда есть! - это большое достижение С++ по сравнению с C. :) вот его сигнатура Код: plaintext 1. Если ты его не определил, но копируешь значения типа s1, то компилятор его создаст за тебя, причем в теле этого конструктора он будет просто последовательно вызывать конструкторы копирования всех членов твоего класса. (!!!) грабли: - ты все же определил конструктор копирования, но теперь у тебя нет конструктора по-умолчанию, т.е. конструктора без параметров!!! Конструктор по-умолчанию компилятор генерит за тебя, если ты не определил ни одного конструктора для данного класса. - ты написал шаблонный конструктор (может еще не дошел до этой темы, но дойдешь - вернись), причем, согласно правил подстановки шаблонов он может "покрыть" конструктор копирования. Фиг! именно этот случай не покрывается шаблонным конструктором, конструктор копирования или задаешь в явном виде, или компилятор генерит его сам . ---- заранее извиняюсь, если где пропускал точки с запятой и проч. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2003, 20:21 |
|
||
|
Значения_по_умолчанию в методах класса, не врублюсь никак
|
|||
|---|---|---|---|
|
#18+
2 vdimas Пришел на работу. Спасибо, перевариваю твою минилекцию...Скоро будут вопросы. (тренируюсь на консольном виде приложений VC++) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2003, 08:26 |
|
||
|
Значения_по_умолчанию в методах класса, не врублюсь никак
|
|||
|---|---|---|---|
|
#18+
2 Димасу или Юре спецификатор this показывает что это принадлежит тому классу где он объявлен? Ну т.е если this торчит в методе класса, то значит указывать будет на переменную этого же класса? Я правильно понял или нет? [r.h] class Kisa { private : int age; public: Kisa() {age=2;}// ~Kisa(){}; // int GetAge()const {return this->age;} void SetAge(int newValue) {this->age=newValue;} };//конец класса #include <iostream.h> #include "r.h" void main() {Kisa rjj; cout<<"Vozrast is Cat = "<<rjj.GetAge()<<endl; rjj.SetAge(10); cout<<"Vozrast is Cat = "<<rjj.GetAge()<<endl; } результаты Vozrast is Cat = 2 Vozrast is Cat = 10 Press any key to continue с помощью this можно обращаться только к классу Kisa . так. про использование const const int f(int h); int f(int h) const ; const int f(int h) const; как будет правильно сказать про эти функции в контексте использования const так как код в рамку брать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2003, 08:56 |
|
||
|
Значения_по_умолчанию в методах класса, не врублюсь никак
|
|||
|---|---|---|---|
|
#18+
Насчет this this – это указатель на себя, т.е. на объект в методе которого он используется В Pascal – это self. int GetAge()const {return this->age;} // написать так можно, но компилятор и так бы понял что речь идет о переменной объекта. this иcпользуется, например, в ситуациях когда объекту необходимо както сообщить о себе другому объекту и т.д. Например Код: plaintext 1. 2. 3. 4. 5. 6. 7. про использование const const int f(int h); // Сообщает компилятору что f() возвращает константу. В данном случае бессмыслено – так как возвращается не ссылка, а значение вот если бы вы написали const int &f(int h); то в дальнейшем, при попытке написать код … f(10) = 5; … Компилятор сообщил бы что невозможно изменять константный объект (ссылку на число возвращенное функцией) int SomeClass::f(int h) const ; // Такое объявление говорит компилятору что функция не меняет внутренне состояние объекта – т.е. она может быть записана как int f(const SomeClass *this, int h); const int f(int h) const; // теперь должно быть ясно что первый const – это сообщение о том что возвращается константа, а второй – что функция не изменяет состояние объекта ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2003, 15:12 |
|
||
|
Значения_по_умолчанию в методах класса, не врублюсь никак
|
|||
|---|---|---|---|
|
#18+
ничего мне не осталось пока добавить, кроме этого: Код: plaintext 1. выделяй код, дави на |SRC|-кнопку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2003, 00:49 |
|
||
|
Значения_по_умолчанию в методах класса, не врублюсь никак
|
|||
|---|---|---|---|
|
#18+
спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2003, 08:14 |
|
||
|
Значения_по_умолчанию в методах класса, не врублюсь никак
|
|||
|---|---|---|---|
|
#18+
Про список инициализации членов класса. здесь тонкости..например как ты инициализируешь константный член класса? к тому же есть тонкости, ..как ты думаешь, почему список инициализации лучше (поставь точки прерывания везде и поглдяи на 2 случая) #include <iostream.h> class some2 { int m_i; public: some2(int i = 0) : m_i(i){ } some2(const some2& obj){ m_i = obj.m_i; } void operator= (const some2 &a){ m_i = a.m_i; } }; 1 случай: class some { some2 m_some2; public: some(some2& obj) { m_some2 = obj; } }; 2 случай: class some { some2 m_some2; public: some(some2& obj) : m_some2(obj){} }; void main() { some2 s2(8); some s(s2); } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2003, 09:53 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=470&tid=2035886]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
27ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 243ms |
| total: | 360ms |

| 0 / 0 |
