Форум: "Потрепаться";
Текущий архив: 2004.03.03;
Скачать: [xml.tar.bz2];
ВнизВопрос программирующим в CBuilder Найти похожие ветки
← →
Bless (2004-02-09 16:35) [0]Что означает конструкция
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner),
которая присутствует в файле unit1.cpp при создании нового приложения?
__fastcall - это понятно.
Если бы было так:
TForm1::TForm1(TComponent* Owner)
то тоже было бы понятно.
Но что за
:TForm(Owner)
в конце?
Слишком много двоеточий для начинающего :)
Объясните, плз.
← →
Ломброзо (2004-02-09 16:38) [1]В данном контексте - вызов конструктора родительского класса.
← →
Bless (2004-02-09 17:05) [2]Сорри, я пропустил кавычки
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
{
}
В таком контексте это уже не вызов родительского класса.
И хотелось бы услышать более подробный ответ.
А именно, что есть x, y, z в конструкции
x::y():z()
← →
Ломброзо (2004-02-09 17:13) [3]x::y():z()
где именно? )
# .h
class Point
{
protected:
int x, y;
void data;
public:
Point();
};
class AdvancedPoint: public Point
{
protected:
public:
AdvancedPoint();
};
#.cpp
Point::Point(): x(5), y(5), data(NULL)
// здесь - инициализация значений x, y, data
{
}
AdvancedPoint::AdvancedPoint():
Point(), x(6), y(6)
// Вызов родительского конструктора и переинициализация x и у значениями 6
{
}
← →
Игорь Шевченко (2004-02-09 17:14) [4]
> А именно, что есть x, y, z в конструкции
> x::y():z()
Вызов конструктора для z. Строчка неверна, должно быть x::x():z()
← →
DiamondShark (2004-02-09 18:05) [5]Извращенский язык.
← →
Bless (2004-02-10 13:58) [6]>#.cpp
>Point::Point(): x(5), y(5), data(NULL)
>// здесь - инициализация значений x, y, data
>{
>}
То есть таким образом можно проинициализировать хоть все поля объекта?
А такая запись специфична для Borland CBuilder или стандартна для С++?
>AdvancedPoint::AdvancedPoint():
> Point(), x(6), y(6)
>// Вызов родительского конструктора и переинициализация x и у
>значениями 6
>{
>}
Как это вызов? Ведь там стоят { }? А такая запись (то, что после ":") возможна только для конструкторов? А зачем это сделано? Какая в том выгода? Ведь можно было бы написать
AdvancedPoint::AdvancedPoint(){
Point();
x=6;
y=6;
}
Или это не одно и то же?
← →
Игорь Шевченко (2004-02-10 14:23) [7]
> Ведь можно было бы написать
> AdvancedPoint::AdvancedPoint(){
> Point();
>
Нельзя.
> x=6;
> y=6;
Можно.
Вызов конструктора родительского объекта допустим именно в форме
foo::foo():bar()
← →
Ломброзо (2004-02-10 14:29) [8]> Ведь можно было бы написать
> AdvancedPoint::AdvancedPoint()
AdvancedPoint::AdvancedPoint()
{
Point::Point();
//так можно.
x = 6;
y = 6;
/* неэффективно, потому что в рантайм переменные сперва инициализируются нулями, потом переинициализируются значениями 6 */
}
← →
Bless (2004-02-10 15:06) [9]>Вызов конструктора родительского объекта допустим именно в форме
>foo::foo():bar()
Люблю лаконичные ответы. Спасибо :)
>AdvancedPoint::AdvancedPoint()
>{
> Point::Point();
>//так можно.
> x = 6;
> y = 6;
>}
Но так это ведь будет не вызов конструктора родительского класса,я прав?
← →
Ломброзо (2004-02-10 15:20) [10]Bless © (10.02.04 15:06) [9]
будет вызов, но бессмысленный или даже ошибочный, потому что конструкторы и так вызываются последовательно
Вообще я соврал, здесь:
AdvancedPoint::AdvancedPoint(): x(6), y(6)
инициализация невозможна, если x и у уже объявлены в родительском классе.
← →
Bless (2004-02-10 16:03) [11]>потому что конструкторы и так вызываются последовательно
То есть паскалевское inherited Create
тут вызывается автоматически?
← →
Игорь Шевченко (2004-02-10 16:11) [12]Bless © (10.02.04 16:03) [11]
>
> То есть паскалевское inherited Create
> тут вызывается автоматически?
Да. А если надо передать параметры родительскому конструктору, то используется запись :parent(p1,p2 и т.д.)
← →
Ломброзо (2004-02-10 16:24) [13]В С++ конструкторы не являются виртуальными, аналогия неуместна :) Если не ошибаюсь, в Delphi сам конструктор (constructor) не выделяет память, этим занимаются другие функции (NewInstance, InitInstance), в Delphi конструктор является просто инициализатором полей, и при этом имеет возможность вызывать конструктор родителя (или не вызывать).
схожесть конструкций вида
TForm1::TForm1(TComponent* Owner): TForm(Owner)
и
constructor TForm.Create(AOwner: TCOmponent)
begin
inherited Create(AOwner);
введена Borland исключительно для удобства.
← →
Bless (2004-02-10 16:31) [14]>А если надо передать параметры родительскому конструктору, то
>используется запись :parent(p1,p2 и т.д.)
То есть, строка
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){...} -
это тело конструктора (ведь есть скобки) класса TForm1, при вызове которого будет вызван конструктор родительского класса с параметром, переданным в конструктор класса TForm1
Я все правильно понял?
← →
Ломброзо (2004-02-10 16:37) [15]перед вызовом которого
← →
Bless (2004-02-10 16:52) [16]>перед вызовом которого
Ну да. Я это и имел ввиду.
А в остальном все правильно?
То есть теоретически можно было бы конструктор оформить и как
__fastcall TForm1::TForm1(TComponent* Owner) {}?
И конструктор предка все-равно был бы вызван? А какой из конструкторов предка, если их несколько? И если он один и требует параметра, то что ему будет передано в качестве параметра?
← →
Suntechnic (2004-02-10 17:37) [17]DiamondShark © (09.02.04 18:05)
Извращенский язык.
Сказал бы чего-нибудь умного что ли.
>Bless ©
Слушай, без обид, ты бы взял учебник по С++ вместо того, чтобы элементарные вопросы по основам языка задавать.
← →
Bless (2004-02-10 18:21) [18]>Слушай, без обид, ты бы взял учебник по С++ вместо того, чтобы
>элементарные вопросы по основам языка задавать.
Да ладно, какие обиды, сам книги предпочитаю.
Спросил потому, что ничего в книгах(в электронном виде) не нашел (это я о вопросе в первом посте).
Искал в
Бьерн Страуструп. Язык программирования С++, второе издание.
C++. Бархатный путь. Марченко А.Л. (не хватает некоторых глав)
Может плохо искал . В конце концов, я их от корки до корки не читал. Мог и пропустить. Если укажешь, где в этих книгах о таком вызове родительского конструктора написано, будет тебе спасибо. :)
А про вопросы из [16] - думал, может кто знает, быстрее будет, чем самому копаться. В конце концов, спросить - не преступление, ответ - дело добровольное да и вопросы не требуют ответа на полстраницы.
← →
Suntechnic (2004-02-10 18:48) [19]>Bless © (10.02.04 18:21)
Искал в
Бьерн Страуструп. Язык программирования С++, второе издание
http://prog.dax.ru/docs/cpp/
http://uic.rsu.ru/doc/programming/c++/straustrup/cpptut.html
Если укажешь, где в этих книгах о таком вызове родительского конструктора написано, будет тебе спасибо. :)
Да в любой об этом написано!
__fastcall TForm1::TForm1(TComponent* Owner) {}?
И конструктор предка все-равно был бы вызван?
Конструктор базового класса вызывается в любом случае.
А какой из конструкторов предка, если их несколько?
Тот, что не имеет параметров, если он опеределён и дефолтовый, если не определён (при условии, что вообще ни один из конструкторов не определён)
И если он один и требует параметра, то что ему будет передано в качестве параметра?
Если определён какой-нибудь другой конструктор с параметром, то будет ошибка, если не передать в качестве аргумента нужный параметр. Но если определить конструктор без параметров, именно он будет вызван.
← →
Bless (2004-02-11 09:36) [20]Спасибо
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.03.03;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c