public и private (а так же protected) - модификаторы доступа.
Public – доступ открыт всем, кто видит определение данного класса.
Private – доступ открыт только для самого класса и друзьям (friend) данного класса.
Следует отметить, что public, private, protected могут означать и тип наследования.
пятница, 8 октября 2010 г.
четверг, 7 октября 2010 г.
9. Что такое композиция?
С точки зрения объектной модели - использование объекта как поле другого объекта. Мы используем композицию в случае если объект является составной частью другого объекта.
В таком случае составной объект является хозяином своих объектов-частей и ответственнен за их создание и удаление.
class Car {
Engine engine;
Wheel wheels[4];
}В таком случае составной объект является хозяином своих объектов-частей и ответственнен за их создание и удаление.
среда, 6 октября 2010 г.
8. Объясните принцип инкапсуляции.
Инкапсуляция - сокрытие реализации класса с целью сохраниния целостности. Управляем автомобилем вы можете крутить руль, нажимать педали, переключать передачи и кое-что по-мелочи. Вам нужна возможность, например, менять концентрацию воздуха в горючей смеси или интервалы подачи искры в свечах? Спасибо, не надо.
QtCreator. Задаем опции компилятора.
В .pro файле нужно добавить один из параметров (-O2 только для примера):
Еще можно написать так:
А вообще все параметры можно посмотреть здесь
QMAKE_CXXFLAGS += -O2 #опция будет включена во всех режимах компиляции.
QMAKE_CXXFLAGS_DEBUG += -O2 #только в режиме DEBUG
QMAKE_CXXFLAGS_RELEASE += -O2 #только в режиме RELEASE
Еще можно написать так:
CONFIG(debug, debug|release){
# Debug
QMAKE_CXXFLAGS += -Os
}else{
# Release
QMAKE_CXXFLAGS += -O2
}
А вообще все параметры можно посмотреть здесь
вторник, 5 октября 2010 г.
7. Какие ключевые слова в С++ обозначают класс?
Ключевые слова - это зарезервированные идентификаторы.
and and_eq asm auto bitand bitor bool break case catch char class compl const const_cast continue default delete do double dynamic_cast else enum explicit export extern false float for friend goto if inline int long mutable namespace new not not_eq operator or or_eq private protected public register reinterpret_cast return short signed sizeof static static_cast struct switch template this throw true try typedef typeid typename union unsigned using virtual void volatile wchar_t while xor xor_eq
Из них class и struct обозначают класс.
and and_eq asm auto bitand bitor bool break case catch char class compl const const_cast continue default delete do double dynamic_cast else enum explicit export extern false float for friend goto if inline int long mutable namespace new not not_eq operator or or_eq private protected public register reinterpret_cast return short signed sizeof static static_cast struct switch template this throw true try typedef typeid typename union unsigned using virtual void volatile wchar_t while xor xor_eq
Из них class и struct обозначают класс.
QtCreator. Не удалось сохранить сессию: /Users/%username%/AppData/Roaming/Nokia/qtcreator/default.qws
Такая ошибка появлялась у меня на Windows 7. Мой %username% - кириллический, и QtCreator, из-за проблем с кодировкой, не смог найти соответствующую папку в C:/Users. Желания заводить другого пользователя у меня не было. Пощелкав мышкой, по-кривому, но проблему решил. В QtCreator открываем: инструменты - параметры - вставка кода - основное. Видим поле "имя пользователя". У меня там крякозябры. "А-а-а", - в первый раз сказал я, и написал его нормально, по-русски. Облом, не сохраняет. Тогда я скопировал крякозябры, и создал папку с таким же именем в users. Облом. Ей еще понадобилось дать права всем на чтение и запись. Сейчас все хорошо.
понедельник, 4 октября 2010 г.
6. Является ли структура классом? Чем класс отличается от структуры?
а) Да
б)
класс обявленный как class имеет по умолчанию доступ private,
класс обявленный как struct имеет по умолчанию доступ public.
То есть, такие определения эквиваленты:
Больше отличий нет. На практике обычно структура используется как группировка переменных не требующих задавать поведение для них.
б)
класс обявленный как class имеет по умолчанию доступ private,
класс обявленный как struct имеет по умолчанию доступ public.
То есть, такие определения эквиваленты:
class A {
/* */
}
struct A {
private:
/* */
}
Больше отличий нет. На практике обычно структура используется как группировка переменных не требующих задавать поведение для них.
воскресенье, 3 октября 2010 г.
5. Как называется использование объекта одного класса в качестве поля другого класса?
Агрегация. Часто используется ее частный случай - композиция (B - составная часть A, и, в таком случае, А отвечает за создание и уничтожение B)
суббота, 2 октября 2010 г.
4. Допускается ли передавать объекты в качестве параметров, и какими способами? А возвращать как результат?
Так же, как и переменные основных типов - по ссылке(1) и по значению(2).
1. С передачей по ссылке все в принципе ясно: передали ссылку и продолжаем работать с тем же объектом как ни в чем не бывало. Но мне не очень нравится такой способ. Если в коде мы видим:
То мы не можем предугадать, как передан x и может ли измениться его значение в теле функции, так как определение может быть void f(int a) или void f(int &a). Та же неопределенность и при передаче объекта.
Отмечу, что возможности передачи по ссылке не было в C.
2. Если мы не хотим неопределенности, то можно просто передать адрес объекта объекта с помощью указателя (произойдет передача значения указателя). В таком случае код, возможно выглядит не так красиво, но мне нравится больше:
При передаче объекта по значению будет передано содержимое объекта
Будет вызван конструктор копирования.
Возврат результата производится аналогичными способами. Однако важно проследить за временем жизни объекта, иначе можно вернуть ссылку или указатель на уже несуществующий объект. При передаче по значению будет вызван конструктор копирования.
1. С передачей по ссылке все в принципе ясно: передали ссылку и продолжаем работать с тем же объектом как ни в чем не бывало. Но мне не очень нравится такой способ. Если в коде мы видим:
int x = 1;
f(x);
То мы не можем предугадать, как передан x и может ли измениться его значение в теле функции, так как определение может быть void f(int a) или void f(int &a). Та же неопределенность и при передаче объекта.
Отмечу, что возможности передачи по ссылке не было в C.
2. Если мы не хотим неопределенности, то можно просто передать адрес объекта объекта с помощью указателя (произойдет передача значения указателя). В таком случае код, возможно выглядит не так красиво, но мне нравится больше:
void f(A* a){/* разыменовываем: *a */}
A a;
f(&a);
При передаче объекта по значению будет передано содержимое объекта
void f(A a){/* разыменовываем: *a */}
A a;
f(a);
Будет вызван конструктор копирования.
Возврат результата производится аналогичными способами. Однако важно проследить за временем жизни объекта, иначе можно вернуть ссылку или указатель на уже несуществующий объект. При передаче по значению будет вызван конструктор копирования.
пятница, 1 октября 2010 г.
3. Разрешается ли объявлять указатель на объект? А указатель на класс?
Я много писал об указателях. Ясно, что объявлять указатель на объект конечно же можно.
Вообще говоря, на физическом уровне указатель представляет собой 4 байта, хранящие некоторый адрес. Теоретически можно объявить указатель на все что угодно, что занимает место в оперативной памяти. Но класс не хранится в явном виде в памяти.
Но ради интереса можно подумать что представляет собой класс на низком уровне.
Если класс не используется в программе, то компилятор, скорее всего пропустит это объявление. Но допустим мы создали объект: A a; но где лежит информация, что член x имеет тип int, и занимает 4 (на других платформах может и не 4) байта? В исходном коде. Именно оттуда компилятор берет эту информацию и генерирует соответствующий код.
А вот код функции f() действительно загружается в память. Она скорее всего будет иметь свой адрес. А может и не будет, например, если компилятор или автор решит сделать ее встроенной (inline).
Как видим, в явном виде класс не хранится.
Вообще говоря, на физическом уровне указатель представляет собой 4 байта, хранящие некоторый адрес. Теоретически можно объявить указатель на все что угодно, что занимает место в оперативной памяти. Но класс не хранится в явном виде в памяти.
Но ради интереса можно подумать что представляет собой класс на низком уровне.
class A{
int x;
int f(){return 1};
}
Если класс не используется в программе, то компилятор, скорее всего пропустит это объявление. Но допустим мы создали объект: A a; но где лежит информация, что член x имеет тип int, и занимает 4 (на других платформах может и не 4) байта? В исходном коде. Именно оттуда компилятор берет эту информацию и генерирует соответствующий код.
А вот код функции f() действительно загружается в память. Она скорее всего будет иметь свой адрес. А может и не будет, например, если компилятор или автор решит сделать ее встроенной (inline).
Как видим, в явном виде класс не хранится.
Подписаться на:
Сообщения (Atom)