Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Знаю ли я С++? Проверка и помощь ответов на вопросы.. 
:(
    Опции темы
Fazil6
Дата 14.2.2007, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата

35. Какие операции разрешается перегружать только как методы класса?
Не знаю.

насколько я помню =, [] , -> и () должны быть членами класса

Добавлено @ 00:00 
Цитата

43. Каким образом разрешается инициализировать константные поля в классе?
Требуется описать ее значение в каждом конструкторе.

точнее в списке инициализации.
статические константы интегрального типа можно инициализировать в месте объявления(не уверен, что в стандарте это есть, но MS позволяет)
Код

class A
{
static const int x = 0;
};



PM MAIL   Вверх
Fazil6
Дата 15.2.2007, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата

44. В каком порядке инициализируются поля в классе? Совпадает ли этот порядок с порядком перечисления инициализаторов в списке инициализации конструктора?
Не знаю.

в порядке объявления в класе. Порядок в списке инициализации компиллятору до лампады - т.е. пофигу.
PM MAIL   Вверх
Vyacheslav
Дата 15.2.2007, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Цитата(Fazil6 @  14.2.2007,  19:55 Найти цитируемый пост)
интересно увидеть как выглядит объявление указателя на объект     


Цитата(Earnest @  14.2.2007,  18:49 Найти цитируемый пост)
 думаю, как раз наоборот. Объявляется именно указатель на класс (т.к. это тип). А вот инициализируется он указателем не объект. Мы пишем: CMyClass* ptr. Где тут объект?


Правильно, но  с точностью  наоборот smile
ptr - это указатель на экземляр класса CMyClass.
То есть 
CMyClass* ptr
это не указатель на CMyClass, а указатель на объект класса CMyClass.
Так что, указатель на объект - это всегда пожалуйста, а вот указатель на класс - низззя.
Указатель на класс- это вопрос метапрограмирования. которое поддерживают некоторые языки : Delphi  с его class of  или C#  c  его классом Type и typeof 


Код

type TClass = class of TObject;
var AnyObj: TClass;

AnyObj - переменная, которая может ссылаться на любой класс. именно класс, а не объект

Код

Foo theFoo = new Foo();
Type t = theFoo.GetType();
//или
t = typeof(Foo);


или особенности расширения компиляторов, например С++Builder, где правомерно записать такую фичу
Код

TMetaClass* myClass = __classid( CMyClass );



Ну и хелп по этому поводу
Код

MetaClass is the C++ representation of the Object Pascal class-reference type.

Но это __classid , сами понимаете, out scope стандарта.


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
The Thing
Дата 15.2.2007, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 286
Регистрация: 6.9.2004

Репутация: нет
Всего: 3



Всем большое спасибо!
Столько сообщений, что не успеваю все их сразу обработать.
Мне ужасно стыдно. У меня скопилось огромное количество вопросов, я не спешу все их задавать потому как не дождусь, когда пойду домой и перечитаю еще раз "Основы ООП".

Некоторые все даки задам. smile



Цитата(Earnest @  14.2.2007,  18:49 Найти цитируемый пост)
24. Влияют ли методы на размер объекта?
Нет.


В некотором смысле влияют: как только появляется один виртуальный метод, добавляется указатель на vtable.


Я много сегодня прочел про вуиртуальную таблицу.. Если я правильно задаю вопрос. Где можно поближе познакомиться с ней.(урл)

Цитата(Earnest @  14.2.2007,  18:49 Найти цитируемый пост)
Цитата(The Thing @  14.2.2007,  18:20 )
30. Перечислите особенности перегрузки операций как методов класса. Чем отличается перегрузка внешним образом от перегрузки как метода класса?
Не понял. Наверное имеется ввиду перегрузка методов класса? Особенности? Наверное функции должны хоть чем-нибудь отличаться.
Не знаю.


Числом параметров. Операции в классе имеют на один аргумент меньше, т.к. есть неявный левый аргумент this.

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


Цитата(Earnest @  14.2.2007,  18:49 Найти цитируемый пост)
Цитата(The Thing @  14.2.2007,  18:20 )
39. Может ли конструктор быть приватным? Какие последствия влечет за собой объявление конструктора приватным?
Нет.
Невозможность создать объект класса.


Может. Объект класса как раз создать можно (в функции-члене класса). И такой прием применяется, например, в реализации паттерна "синглетон". А вот возможность наследования это обрубает - если нет ни одного не-private конструктора.

А можно ссылочку на описание реализации паттерна "синглетон"? (стандартные запросы в поисковике в течение 10 минут ничего не дали smile )

Цитата(Earnest @  14.2.2007,  20:19 Найти цитируемый пост)
Цитата(The Thing @  14.2.2007,  18:20 )
46. Какой вид конструктора фактически является конструктором преобразования типов?
конструктор копирования


Нет, не-explicit конструктор , который может быть вызван с одним аргументом (причем другого типа иначе какое это преобразоване). Сюда же относится конструктор со многими аргументами, если все кроме одного заданы по-умолчанию.


Не совсем понял. А что тогда?

Где можно подробно почитать про конструкторы и функции преобразования. То что я читал все даки немного не то. smile


Цитата(Fazil6 @  14.2.2007,  22:52 Найти цитируемый пост)
Цитата

26. Какие операции нельзя перегружать? Как вы думаете, почему?
Те которые выходят за рамки стандартно используемых операций в с++ ( + - [] <  и т. д.)

Я так и написал.. все кроме стандартных, а в скобочках перечислил стандартные.

Добавлено @ 14:24 
Цитата(Fazil6 @  14.2.2007,  23:47 Найти цитируемый пост)
Цитата

35. Какие операции разрешается перегружать только как методы класса?
Не знаю.

насколько я помню =, [] , -> и () должны быть членами класса



Вопрос. А какие еще перегрузки могут быть? Я только такие и знаю. smile

Добавлено @ 14:26 
Цитата(Vyacheslav @  15.2.2007,  12:18 Найти цитируемый пост)
Цитата(Fazil6 @  14.2.2007,  19:55 )
интересно увидеть как выглядит объявление указателя на объект     




Цитата(Earnest @  14.2.2007,  18:49 )
 думаю, как раз наоборот. Объявляется именно указатель на класс (т.к. это тип). А вот инициализируется он указателем не объект. Мы пишем: CMyClass* ptr. Где тут объект?



Правильно, но  с точностью  наоборот 
ptr - это указатель на экземляр класса CMyClass.
То есть 
CMyClass* ptr
это не указатель на CMyClass, а указатель на объект класса CMyClass.
Так что, указатель на объект - это всегда пожалуйста, а вот указатель на класс - низззя.
Указатель на класс- это вопрос метапрограмирования. которое поддерживают некоторые языки : Delphi  с его class of  или C#  c  его классом Type и typeof 

Во! Я помню что читал именно так. И удивился когда меня опровергнули!


--------------------
Правильность работы программы зависит от двух велечин.
В нужном месте должны стоять нолик и еденичка.
PM MAIL   Вверх
Earnest
Дата 15.2.2007, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(The Thing @  15.2.2007,  15:22 Найти цитируемый пост)
Мне честно говоря непонятна фраза "...перегрузки операций как методов класса..." и "..внешним образом от перегрузки как метода класса..".

Все просто: скажем, оператор + для класса CMyClass можно перегрузить 2 способами:
1) как внешнюю функцию, т.е. где угодно пишем
Код

   CMyClass operator + (const CMyClass&, const CMyClass&) { ... }
2) как член класса:
Код

class CMyClass
{
   ...
   CMyClass operator + (const CMyClass& rhs) const { ... }
};
Вызов в обоих случаях будет одинаковым:
Код

CMyClass a, b;
CMyClass с = a + b;
 

Насчет указателя на класс... по-моему это словоблудие... В моем понимании "указатель на тип" == "указатель на какой-нибудь объект типа", т.е. это тоже тип. И короче. Ясно, что указателя на класс в том же смысле, как указатель на объект не бывает. Но речь шла об "объявить". Объявить можно тип, можно переменную.
Но не буду спорить - может, в нынешних учебниках так переводят, чтобы не ввводить двусмысленности. 


--------------------
...
PM   Вверх
SergeCpp
Дата 15.2.2007, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

Репутация: 15
Всего: 124



ISO/IEC 14882:2003(E) — 8.3.1 Pointers
Цитата
In a declaration T D where D has the form

* [cv-qualifier-seq] D1

and the type of the identifier in the declaration T D1 is “derived-declarator-type-list T,”
then the type of the identifier of D is “derived-declarator-type-list cv-qualifier-seq pointer to T.”

ISO/IEC 14882:2003(E) — 9 Classes
Цитата
A class is a type.



Это сообщение отредактировал(а) SergeCpp - 15.2.2007, 15:35
PM MAIL WWW ICQ   Вверх
nerezus
Дата 15.2.2007, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 3
Всего: 43



Цитата

А можно ссылочку на описание реализации паттерна "синглетон"? (стандартные запросы в поисковике в течение 10 минут ничего не дали
 В классе объявляем приватным конструктор. И создаем метод getInstance, который возвращает ссылку на объект из static-переменной, причем при первом вызове метода этой ссылке и надо создать объект.


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
SergeCpp
Дата 15.2.2007, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

Репутация: 15
Всего: 124



Singleton pattern
Одиночка (шаблон проектирования)

P.S.

Цитата(The Thing @  15.2.2007,  16:22 Найти цитируемый пост)
А можно ссылочку на описание реализации паттерна "синглетон"?
(стандартные запросы в поисковике в течение 10 минут ничего не дали)

Рекомендую составлять запросы к поисковику (Google, к примеру) вот в такой вот форме:

<незнакомый термин> wiki
к примеру, singleton wiki
или же, virtual table wiki


Это сообщение отредактировал(а) SergeCpp - 15.2.2007, 15:56
PM MAIL WWW ICQ   Вверх
skyboy
Дата 15.2.2007, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 1
Всего: 260



Цитата(SergeCpp @  15.2.2007,  14:29 Найти цитируемый пост)
pointer to T

т.е. "указатель на тип" === "указатель на переменную этого же типа", правильно? И "указатель на класс" - вполне корректно, даже без поддержки метаклассов, да?
PM MAIL   Вверх
The Thing
Дата 15.2.2007, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 286
Регистрация: 6.9.2004

Репутация: нет
Всего: 3



Цитата(SergeCpp @  15.2.2007,  15:37 Найти цитируемый пост)
Singleton pattern
Одиночка (шаблон проектирования)


Спасибо за ссылки!


Цитата(Earnest @  15.2.2007,  15:14 Найти цитируемый пост)
Все просто: скажем, оператор + для класса CMyClass можно перегрузить 2 способами:

Спасибо! Я понял.




Где можно подробно почитать про конструкторы и функции преобразования?


--------------------
Правильность работы программы зависит от двух велечин.
В нужном месте должны стоять нолик и еденичка.
PM MAIL   Вверх
KelTron
Дата 15.2.2007, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: нет
Всего: 38



Цитата(The Thing @  14.2.2007,  17:20 Найти цитируемый пост)
1. Что определяет класс? Чем отличается класс от объекта?
Страуструп 2: Класс - это тип; он определяет поведение связанных с ним объектов: их создание, 
обработку и уничтожение.  Мое - не очень нравится: Объект класса - это область памяти,
 описываемая классом.

Наверно красивее будет: объект - это экземпляр класса
Цитата(The Thing @  14.2.2007,  17:20 Найти цитируемый пост)
9. Что такое композиция?Не знаю!

Это когда в классе А содержится объект(ы) класса В, и при этом класс А отвечает за создание и уничтожение объектов класса В. Причем Класс А использует объекты класса В. Не путать с агрегацией где объект класса В являлся бы частью класса А. Агрегация - колесо в машине: машина не машина без колеса, композиция - машина в гараже: гараж без машины вполне работоспособен - здесь как создание и уничтожение понимается, что машина въехала в гараж, и выехала из него. В общем что то подобное, надеюсь надеюсь что я смог показать разницу.
Цитата(The Thing @  14.2.2007,  17:20 Найти цитируемый пост)
33. Что означает выражение *this? В каких случаях оно используется?
Операция разыменовывания. Используется для возвращения значения объекта.
Где используется не знаю.

Оно используется например при перегрузке оператора =:
Код

Obj& operator=(Obj& ob)
{
    if (this == &ob)
        return *this;
    //.....
    return *this;
}

Цитата(The Thing @  14.2.2007,  17:20 Найти цитируемый пост)
36. Дайте определение дружественной функции. Как объявляется дружественная 
функция? А как определяется?ОБЪЯВЛЕНИЕ - внутри класса friend ФУНКЦИЯОпределение, 
как обычный метод.пожалуйста уточните, если надо.

Нет, определение не обязательно как метод, она определятся также как если бы была не дружественной. Просто в классе для которого она будет дружественной она объявляется со словом friend, а определение(или точнее способ определения) ее никак не изменится.
Цитата(The Thing @  14.2.2007,  17:20 Найти цитируемый пост)
42. Как объявить константу в классе? Можно ли объявить дробную константу?
через const.Дробную... float/double что ли?

Вобщем ответ  - да
Цитата(The Thing @  14.2.2007,  17:20 Найти цитируемый пост)
45. Какие конструкции С++ разрешается использовать в списке инициализации 
качестве инициализирующих выражений?Не знаю. Не пойму о чем речь. О выражениях при 
инициализации? Любое возвращающее значение нужного типа.

Например:
Код

class X 
{
    int x, y;
    X(int cx, int cy): x(cx), y(cy){}
};
class Y: public X 
{
    int z;
    Y(int cx, int cy, int cz): z(cz), X(cx, cy){}
};

Что то в этом роде

Это сообщение отредактировал(а) KelTron - 16.2.2007, 17:09


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
Vyacheslav
Дата 16.2.2007, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Цитата(Earnest @  15.2.2007,  15:14 Найти цитируемый пост)
 Но речь шла об "объявить". Объявить можно тип, можно переменную.
Но не буду спорить - может, в нынешних учебниках так переводят, чтобы не ввводить двусмысленности.  

Это не двусмысленность. И говорить "указатель на класс"  вместо "указатель на обЪект класса " просто жаргонное соглашение.
Кстати Вас на слове  можно поймать smile  Вы сказали, что
Цитата(Earnest @  14.2.2007,  18:49 Найти цитируемый пост)
Объявляется именно указатель на класс (т.к. это тип). А вот инициализируется он указателем на объект. Мы пишем: CMyClass* ptr. 

То есть  из этих слов следует,  "что указатель на класс "( один тип smile )  инициализируется " указателем на объект"( все таки такой тип есть оказывается smile   ). А язык С++ является языком строгой типизиции. То есть инициализировать непосредственно один тип другим можно только, если есть возможность выполнения неявного преобразования.  Дело за малым. Найти это преобразование smile





--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
SerpentVV
Дата 16.2.2007, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 27.11.2006
Где: Астрахань

Репутация: 1
Всего: 1



Ребятки, я как автор вопросов, прошу написать все неясности...
Один копрос я уже понял - вызывает вопросы: Указатель на класс и указатель на объект - не совсем корректно сформулировано...
Я имел ввиду, что указатель может указывать только на объект на объект и не может указывать на класс...

Вопросы - из книжки по ООП на С++, которая, надеюсь, выйдет в этом годе в издательстве Питер... По порядку в точности соответствуют порядку изложения... smile

PM MAIL   Вверх
Vyacheslav
Дата 16.2.2007, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



SerpentVV, 
Кстати про массив классов, на который предполагается ответ - нет.
 Не боитесь, что Вам в качестве ответа приведут концепцию списка типов, предложенную  Александреску? smile


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Vyacheslav
Дата 16.2.2007, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Цитата(skyboy @  15.2.2007,  15:49 Найти цитируемый пост)
т.е. "указатель на тип" === "указатель на переменную этого же типа", правильно? И "указатель на класс" - вполне корректно, даже без поддержки метаклассов, да? 

Здесь вопрос не о том как говориться, а что подразумевается. И стандарт, по моему, вполне однозначно 
это определяет 3.9.2  абзац 3
Цитата

3. A pointer to  object of Type is referred to as "pointer to T" [ Example: a pointer of object of  type int is reffered to as "pointer to int " ...

Указатель на объект типа T  обозначается  как "указатель на T" . 

Так что автор зря переживает. Вопрос сформулирован вполне однозначно smile 


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0667 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.