Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.03;
Скачать: CL | DM;

Вниз

Вопрос программирующим в 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.015 c
3-5992
Andrey V.
2004-02-03 20:05
2004.03.03
Гибкая уникальность


14-6192
Knight
2004-02-09 01:21
2004.03.03
Навеяно темой о Лукьяненко...


1-6132
jack128
2004-02-19 16:30
2004.03.03
Не могу изменить размер Edit a


3-5976
Карелин Артем
2004-02-05 12:25
2004.03.03
Структура таблиц для поисковика на FireBird.


1-6066
Creator
2004-02-21 14:05
2004.03.03
Caption активного окна