Ссылочные переменные. Пример. Указатель this


В С++ вводится различие по сравнению с С между указателями и ссылочными переменными. Указатели по прежнему являются адресами объектов.

Ссылка представляет собой имя, которое является псевдонимом или альтернативны именем для некоторой переменной (или для фиксированного адресного выражения). Это на абстрактном уровне. На уровне реализации это – адреса объектов.

 

Пример:

 

int rats = 101;

int &rodents = rats;//rodents – становится псевдонимом rats.

 

Ссылку необходимо инициализировать сразу по объявлении. Ссылочный аргумент инициализируется адресом действительного аргумента, но адресные операции к нему применять не надо.

 

cout<<”rats= “<<rants;

cout<<”; rodents = “<<rodents<<”\n”;

rodents++;

cout<<”rats= “<<rants;

cout<<”; rodents = “<<rodents<<”\n”;

 

Будет напечатано:

rats = 101; rodents = 101

rats = 102; rodents = 102

 

Выражение &rodents даст адрес переменной rats.

 

? Что означает запись int *f,*&rb=fc; rb – инициализируется адресом fc и работает как ссылка на ссылку, но требуется операция разыменовывания. Таким образом *rb – доступ к объекту на который ссылается fc, так же как и *fc.

 

Указатель this

Он используется в особых случаях, например, когда в качестве результата работы метода надо вернуть сам объект или ссылку на него, или когда неободимо разрешить конфликт с локальными переменными метода.

 

Пример.

На одной их предыдущих лекций был объявлен класс Stock. Дополним его спецификацией и реализацией метода topval, который выполнит сравнение двух объектов этого класса и возвращает тот из них, у которого значение переменной экземпляра total_val больше:

 

const Stock& Stock::topval(const Stock& s) const

{

if (s.total_val>total_val) return s;

else return *this;//возвращаем сам объект, но он может быть преобразован к //ссылочному типу


}

 

Копия не создаётся, так как для возврата в декларировании функции указан ссылочный тип и хотя на внутреннем уровне это адрес, на абстрактном программы этого не ощущают, а реализация достаточно эффективная.

const сразу за скобками указывает, что объект владелец метода не подвергается модификации, т.е. тот на который ссылается переменная this. В этой реализации существенно, т.к. новые объекты не создаются.

Массивы объектов

Массивы объектов создаются почти так же как массивы обычных объектов, но конструктор надо применить для каждого, если хотим использовать явные конструкторы

Пример:

 

Stock myStuff[10];

#define STKS

Stock stocks[STKS] = {

Stock(“NanoSoft”,12,20.0),

Stock(“Boffo Obj”,122,10.0),
Stock(“Monolithics”,132,3.23)
};

 

for (int st = 0;st<STKS;st++)

stocks[st].show();

 

Реализация метода show() в классе Stock может быть следующей:

void Stock::show() const

{

cout<<”Company:”<<company

<<”Shares:”<<shares<<”\n”

<<”Share Price:$”<<share_val

<<”Total Worth:$”<<total_val<<”\n”;
}

 



Дата добавления: 2016-05-26; просмотров: 1747;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.009 сек.