Студопедия

КАТЕГОРИИ:


Архитектура-(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; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.021 сек.