Ответы на некоторые вопросы по С++ (1) (комментарии)
Это сообщение сгенерировано автоматически.
> 4. Допускается ли передавать объекты в качестве параметров, и какими способами? А возвращать как результат?
> Да: по значению, по указателю, по ссылке. Да, теми же способами (нельзя(т.к. UB) возвращать указатель или ссылку на локальный объект).
А что, я не могу сделать так (псевдо-код):
IObject *create_object(int param) { return new IObject( param); }
а то вроде делал так, когда-то давно, это неправильно?
> 5. Как называется использование объекта одного класса в качестве поля другого класса?
Это вот так:
class A {...}; class B { A a; }; // (1) //или class D { class C {...}; C c; }; // (2)
М.б. композиция?
> 6. Является ли структура классом? Чем класс отличается от структуры?
> ? не понял смысла вопроса. У классов по умолчанию private поля и private наследование, у структур - public.
Да, в С++ struct также обьявляет класс, но ключевое слово struct обьявляет все поля по умолчанию как public, в отличие от класса (сделано это опять же для облегчения перехода программеров с С на С++).
> 9. Что такое композиция?
Вот что прочитал (здесь):
> Composition is simply defining a class as a member of another class, and all normal scope rules apply. A class that is a member of another class does not enjoy the same benefits as a derived class, and only has access to public members of the containing class.
> 12. Существуют ли ограничения на использование public и private в классе? А в структуре?
Ограничено разумностью :) Попробуйте сделать конструктор/деструктор не в public. Ну это так, лирика :)
> 23. Каков размер «пустого» объекта?
> 1 (хотя наверно это implementation defined)
Откуда 1?
> 30. Перечислите особенности перегрузки операций как методов класса. Чем отличается перегрузка внешним образом от перегрузки как метода класса?
> Первый параметр оператора должен иметь тип "сцылка на объект этого класса".
При перегрузке операторов как методов класса:
1. Первый параметр оператора опускается (если это бинарный оператор, то прописывается один параметр, если унарный - ничего), этим первым параметром становится экземпляр класса (this).
2. Их можно сделать константными методами.
3. Также при такой перезгрузке имеется доступ к не-public областям.
А иначе (при внешней перезгрузке):
1.. Если перезгрузка веншняя, то одним из параметров долна быть пользовательский тип данных (потому как нельзя перегружать операторы для всроенных типов).
2. Такой оператор не может быть константным.
3. Он не имеет доступ к не-public областям, только если он не был обьявлен другом (friend).
> 34. Какие операции не рекомендуется перегружать как методы класса? Почему?
> operator,
> ??? - даже не знаю что еще :(.
Вообще не слышал о подобных "рекомендациях" :) Знаю, что некоторые авторы протестуют против operator(), потому как нельзя обьект в функцию превращать, а больше тоже ничего не знаю. А вообще, не рекомендуется перегружать те операторы, смысл которых ты не понимаешь! :)
Вот что пришло в голову сразу :)
34. ещё видимо амперсанд не стоит перегружать.
kas
ну почему же? :) и какой именно? бинарный или унарный?
KpeHDeJIb
4. Локальными называются объекты память под которые выделена на стеке и которые соответственно уничтожаются при выходе из блока (из функции).
5. Sorry, пропустил вопрос :)), сейчас допишу
6. Я написал там даже больше :)
9. У меня тоже самое по русски написано
12. >Попробуйте сделать конструктор/деструктор не в public.
Иногда это бывает даже нужно.
23. Это из практики :)
по стандарту вот, нашел таки
Complete objects and member subobjects of class type shall have nonzero size. Base class subobjects are not so constrained.
30. +1 (вставил в ответы твой вариант)
kas
Я тоже о нем сначала подумал, но потом вспомнил как этот оператор вполне разумно используется в COM (_com_ptr_t)
PP
> 4. Локальными называются объекты память под которые выделена на стеке и которые соответственно уничтожаются при выходе из блока (из функции).
А указатель? Я же написал пример с динамическим выделением памяти под обьект, думаю все будет работать если скомпилить.
> 12. Попробуйте сделать конструктор/деструктор не в public.
Речь, по большему счету, о деструкторе, думаю ни к чему хорошему это не приведет (точнее в этом нет необходимости), но я же сказал - это лирика, это не дополнение к ответу.
KpeHDeJIb
4.
У меня написано:
>нельзя(т.к. UB) возвращать указатель или ссылку на локальный объект
У тебя в примере возвращается указатель на объект выделенный с помощью new, а не на локальный
Сам указатель - локальный объект, но он возвращается по значению
По моему ты слегка запутался :))
PP
Ладно, уел :)) Я, действительно, не очень внимательно бывает читаю :)
>4. Допускается ли передавать объекты в качестве параметров, и какими способами? А возвращать как результат?
>Да: по значению, по указателю, по ссылке...
Ответ не совсем корректный, а точнее, все в кучу свалено.
Синтаксически, в С++ параметры передаются только по значению. Когда мы пишем
void f(int* ptr ) { /*...*/ } int x; f( &x);
то мы передаем указатель на int по значению. Аналогично со ссылкой:
void f(int& j ) { /*...*/ } int x; f( x);
мы передаем ссылку по значению.
Однако, когда мы вызываем функцию вроде
void f(myclass* ptr );
мы подразумеваем, что передаем ей объект, с которым она что-то должна сделать. Синтаксически мы передаем ей указатель по значению, а семантически - объект по указателю.
Кроме трех перечисленных способов (по значению, ссылке, указателю) можно "придумать" еще несколько:
class myclass{ /*... */ } vector< myclass* > g_objects; void f(int idx ) { myclass& obj = *g_objects[idx]; // работаем с объектом }
int WINAPI ShowWindow( HWND hWnd, int nCmdShow ); void glBindTexture( GLenum target, GLuint texture ); ...
P.S. мож это всем очевидно, а я тут банальные вещи рассказываю?
Wraith
>P.S. мож это всем очевидно, а я тут банальные вещи рассказываю?
ага.
По поводу добавленных тобой способов: 1 - помоему это не подразумевалось в вопросе, 2, 3 - это частные случаи не выделенные синтаксисом языка, так можно еще кучу всего понаписать - хотя бы про передачу через итератор стоило бы еще упомянуть.
Я просто торопился когда отвечал и не мог позволить себе столь подробные ответы, сейчас вот вообще времени нет; появиться - доотвечаю и постараюсь подправить и расписать более подробно некоторые ответы...
Могу добавить ещё пару уточнений:
>118. Когда выполняется понижающее приведение типов?
>Когда у программы плохой дизайн :))
не обязательно бывает же ещё и приведение к интерфейсам(или это считаеться не понижающем приведеним?)
>183. Какие виды параметров разрешается задавать в шаблоне класса? А в шаблоне функции?
думаю что тут имееться виду вот что
template < class T, int N > struct TA {}; /// при параметрах TA <int,20> TA <int,30> это будут разные классы
>192. Может ли шаблон класса быть наследником обычного класса? А обычный класс от шаблона?
>Да. ???.
обычный класс от шаблона тоже унаследовать можно, шаблоном он уже не будет.
>194. Каким образом можно использовать возможность наследования обычного класса от шаблона?
Иногда это бывает нужно когда нужно перегрузить некторые функции для какой-то определенной специализации шаблона
>> 12. Существуют ли ограничения на использование public и private в классе? А в структуре?
>Ограничено разумностью :) Попробуйте сделать конструктор/деструктор не в public. Ну это так, лирика :)
А попробуйте сделать синглтон с открытым контструктором, и обязательно найдеться идиот который наплодит ещё его 20 экземпляров
Или напрмер есть объект не синглтон, но вам не нужо чтобы его копировали, а при передачи в качестве параметра передавать по ссылке. Для этго конструктора копирования помещают в private. например при перегрузке операторов >> и << cout и cin не удается передать по значению именно по этой причине.
> Знаю, что некоторые авторы протестуют против operator(), потому как нельзя обьект в функцию превращать, а больше тоже ничего не знаю.
Полная ерунда есть такие штуки функторы посути это и есть "обьект превращенные в функции" - без них воспользоваться многими алгоритмами STL вообще не получится
Лопата авард!
зы. Нифига я писал всякий бред вперемешку с разумными мыслями :)
Тема в архиве.