|
Программирование >> Программирование на языке c++
ДЛЯ объекта А и второго конструктора для объекта В B.ff()->display(); Результат: 100 100 A.displayO; Результат: 10 20 A.f(B).displayO; Результат: 110 120 Второй пример демонстрирует использование аргументов функции, заданных по умолчанию. #include <iostream.h> class my class { int x,y,z; public: my class() { x=y=0; } float add mul(int a=0,int b=0,int c=0,char ch=+); здесь все аргументы можно задать по умолчанию void displayO { cout х \t у endl; } float my class;:add mul(int a,int b,int c.char ch) { if {ch==+) return x=a+b+c; if (ch==*) return y=a*b*c; cout wrong message\n ; return NULL; } для упрощения в этой функции, как и в предыдущих программах, не обрабатываются возможные ошибки void main{void) { my class А; cout A.add mul{5,10) endl; Результат: 15 cout A.add mul(2,5,10) endl; Результат: 17 cout A.add mul{2,5,10,*) endl; Результат: 100 A.displayO; Результат: 17 100 Третья программа является более сложной, по- -этому рассмотрим ее подробнее. #include <iostream.h> class my class { int x,y; public: my class(int X,int Y) { x=X; y=Y; } конструктор 1 my class(int X) { х=у=Х; } конструктор 2 my class{) { х=у=0; } конструктор 3 void display word() { cout Hello\n ; } void displayO { cout x \t у endl; } void f(my class& M, void (my class::*p){)=my class::display) { M.displayO; (M*p)(); } void main(void) { my class A( 10,20); f(A); f(A,rTiy class::display word); Результат: 10 20 10 20 Результат: 10 20 Hello Рассмотрим описание глобальной функции f: void f(my class& М, void (my class::*p){)=my class::display) { M.displayO; {M.*p)0; } Она не возвращает значений и имеет два параметра: my class& М - ссылка М на объект класса my class; void (my class::*p)()=my class::display - указатель р на функцию класса my class, которая не имеет аргументов и не возвращает значений. По умолчанию р указывает на функцию display класса my class. В выражении (М.*р)0; вызывается функция объекта М (а это объект класса my class) через указатель на функцию р. В приведенной программе функция f вызвана дважды. Первый раз она вызвана с одним аргументом, поэтому второй аргумент получит значение по умолчанию: my class::display. Второй раз она вызвана с двумя аргументами, поэтому они оба заданы явно. Следующие два примера показывают другие возможные способы конструирования объектов. #include <iostream.h> struct my class { int a,b; char* s; my class(int A,int B,char *S) : a(A),b(B),s(S) {}; void fun(my class& M) { cout M.a M.b M.s; } void main(void) { my class ms = my class{ 19,95, How are you? \n ); fun{ms); fun(my class( 19,96, Fine!!! \n )); Конструктор можно задать и в следующем виде: my class(int A,int B,char *S) : a(A),b(B),s(S) {}; После выражения my class(int A,int B,char *S) записано двоеточие и затем через запятую перечислены все компоненты-данные класса my class, которым необходимо присвоить значение, т. е. компоненту а необходимо присвоить значение А, компоненту b - значение В и компоненту s - значение S. После этого в теле конструктора не надо выполнять никаких действий, что записывается в виде {}. Другими словами, такая форма эквивалентна следующему описанию: my class(int A.int B,char *S) { a=A; b=B; s=S; }; Класс можно описать и так: my class ms = my class( 19,95, How are you? \n ); Здесь вызывается конструктор, который строит объект с именем ms (ms - это имя объекта, а не указатель на объект). В выражении fun(my class{ 19,96, Fine!!! \n )); тоже вызывается конструктор класса my class. Построенный объект передается в функцию и далее используется в ней. Таким же образом можно создать и анонимный объект (объект без имени). Результаты работы программы представятся в виде: 1995 How are you? 1996 Fine!!! Следующая программа показывает еще одну возможность вызова конструктора с одним параметром: #include <iostream.h>
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |