КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Параметр – объект ob
Передача объектов в функции Ссылка на объект Ссылка на объект – это ещё одно имя объекта. Если, например, объявлен объект ob класса Samp: Samp ob; то можно определить ссылку на объект как Samp & ref = ob; и тогда ob и ref обозначают один и тот же объект. Это означает, что если, например, открытой переменной z объекта ob присвоить значение 5, выполнив оператор ob.z = 5; то и ref.z будет равно 5. Фактически, ссылка – это адрес объекта (поэтому при определении ссылки используется символ & – знак операции адреса), и в этом смысле она сходна с указателем на объект, однако у ссылок есть свои особенности. Во-первых, определяя переменную типа ссылки, её необходимо инициализировать, указав на какой объект она ссылается. Нельзя определить ссылку как Samp & ref; можно только как Samp &ref = ob; Во-вторых, нельзя переопределить ссылку в программе, т.е. изменить объект, на какой она ссылается. В-третьих, если для обращения к члену объекта, на который указывает указатель, применяется операция стрелка (–>), то для подобной операции со ссылкой применяется операция точка (.). Например, если z – открытая переменная класса Samp, то доступ к ней из функции main() может быть выполнен следующим образом: Samp ob; // объявление объекта ob класса Samp Samp * p = &ob; // указателю p присваивается адрес ob Samp &ref = ob; // ссылка ref ссылается на объект ob p->z = 5; // доступ к z через указатель ref.z = 6; // доступ к z через ссылку Как и указатель, ссылка сама по себе не имеет значения. Ссылка должна на что-то ссылаться, например, на объект. Синтаксически объекты передаются в функции так же, как и простые переменные. Для этого объявляют параметр функции, который имеет тип класса. Затем используют объект этого класса в качестве аргумента при вызове функции.
Передача объекта в функцию по значению. По умолчанию происходит передача объектов в функцию по значению. При этом компилятор создаёт в функции копию переданного ей объекта, и функция работает с копией. Поэтому изменение копии объекта внутри функции не влияет на сам объект-оригинал. // Пример.14.1. П ередача объекта в функцию по значению. #include <iostream> using namespace std; class Samp { int x; public: Samp(int n){x = n;} // конструктор void set(int n){x = n;} // функция установки x int get(){return x;} // функция чтения x }; void fun (Samp ob){ // внешняя функция, ob.set(100); // изменяем копию объекта // или ob.set(ob.get()+90); cout<<ob.get()<<endl; // 100 } int main() { Samp obj(10); // obj.x = 10 fun(obj); // передача ob по значению fun() cout<<obj.get()<<endl; // 10 system("pause"); } При вызове функции, в момент создания копии объекта, конструктор не вызывается, так как он используется для инициализации элементов объекта, а копия создаётся для уже существующего (а значит – проинициализированного) объекта. При завершении работы функции созданная копия объекта удаляется и вызывается деструктор копии. При передаче объекта в функцию по значению создаётся копия объекта. Конструктор копии не вызывается. Деструктор копии вызывается. Передача объекта в функцию по указателю. При передаче объекта в функцию по указателю происходит передача в функцию адреса объекта. При этом функция может изменить значение элементов объекта, используемого в вызове. Функция fun() изпримера 14.1 и её вызов будут иметь следующий вид: … void fun (Samp *p){ // параметр – указатель p->set(p->get() + 50); // или просто p->set(60) cout<<p->get ()<<endl; // x = 60 } int main() { Samp ob(10); // создание объекта ob, x = 10 fun(&ob); // передача ob по указателю cout<<ob.get()<<endl; // x = 60 } Передача объекта в функции по ссылке. Ссылка является скрытым указателем и работает как другое имя объекта. При передаче объекта по ссылке изменения объекта внутри функции влияют на исходный объект и сохраняются при завершении работы функции.
Ссылка не является аналогом указателя, поэтому при передаче объекта по ссылке для доступа к его элементам используется операция точка (.), а не операция стрелка (->). … void fun (Samp &ref){ // параметр – ссылка ref.set(ref.get() * ref.get()); // изменяем объект // или так – ref.setx(100); cout<<ref.get()<<endl; // x = 100 } int main() { Samp ob(10); // создание объекта, ob.x = 10 fun(ob); // передача объекта ob по ссылке cout<<ob.getx()<<endl; // x = 100 } Следует заметить, что передача оъекта по ссылке не всегда возможна. // Пример 14.2. Определение класса для работы с рациональной дробью. //Нахождение суммы двух рациональных дробей. Использование конструктора. #include <iostream> using namespace std; class Frac { double a, b; public: Frac(int n, int m){a = n; b = m;} // конструктор с параметром void show(){cout<<a<< ' / ' <<b<<endl;} // функция вывода double geta(){return a;} double getb(){return b;} }; double sumFrac(Frac s1, Frac s2){ double z = (s1.geta()*s2.getb() + s1.getb()*s2.geta())/(s1.getb()*s2.getb()); return z; } int main (){ int x,y; cout<<"Vvedi chisl. i znam. for 1 fraction: "; cin>>x>>y; Frac ob1(x, y); ob1.show(); cout<<"Vvedi chisl. i znam. for 2 fraction: "; cin>>x>>y; Frac ob2(x, y); ob2.show(); double rez = sumFrac(ob1, ob2); cout<<"rez= "<<rez<<endl; }
Дата добавления: 2015-06-25; Просмотров: 278; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |