C++.Бархатный путь



         

Указатель this - часть 2


void ComplexType::ComplexType_PrintVal(ComplexType const *this) { cout << "(" << this->real << "," << this->imag << "i)" << endl; cout << int(this->CTcharVal) << "," << x << "…" << endl; }

На втором этапе преобразуются вызовы функций-членов. К списку значений параметров выражения вызова добавляется выражение, значением которого является адрес данного объекта. Это вполне корректное преобразование. Дело в том, что нестатические функции-члены всегда вызываются для конкретного объекта. И потому не составляет особого труда определить адрес объекта. Например, вызов функции-члена PrintVal() для объекта CDw1, который имеет вид CDw1.PrintVal();

после преобразования принимает вид: ComplexType_PrintVal(&CDw1);

А вызов функции-члена безымянного объекта, адресуемого указателем pCD pCD->PrintVal();

преобразуется к виду ComplexType_PrintVal(&(*pCD));

что эквивалентно следующему оператору: ComplexType_PrintVal(pCD);

Первый (и в нашем случае единственный) параметр в вызове новой функции является адресом конкретного объекта.

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

Причина изменения имени для функций-членов класса очевидна. В разных классах могут быть объявлены одноименные функции-члены. В этих условиях обращение к функции-члену класса непосредственно по имени может вызвать конфликт имён: в одной области действия имени одним и тем же именем будут обозначаться различные объекты - одноименные функции-члены разных классов. Стандартное преобразование имён позволяет решить эту проблему.

Указатель this можно использовать в теле функции-члена без его дополнительного объявления. В частности, операторы функции ComplexType::PrintVal() могут быть переписаны с использованием указателя this:




Содержание  Назад  Вперед