Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
14-6243
kopcap
2004-02-10 14:59
2004.03.03
strtok в Паскале ?


14-6238
ККВ
2004-02-10 13:54
2004.03.03
Microsoft Help WorkShop


3-5966
_san_
2004-02-05 12:16
2004.03.03
SQL Запрос


4-6279
bobo
2003-12-25 10:36
2004.03.03
Мужики, как скаптурить произвольный прямоугольник текущего экрана


7-6264
Suharew
2003-12-14 21:13
2004.03.03
Как программно узнать MAC адрес сетевухи





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский