Ключевое слово this При вызове функции-члена класса передается

Скачать презентацию Ключевое слово this При вызове функции-члена класса передается Скачать презентацию Ключевое слово this При вызове функции-члена класса передается

13508-klyuchevoe_slovo_this.ppt

  • Количество слайдов: 34

>Ключевое слово this Ключевое слово this

>При вызове функции-члена класса передается еще один неявный параметр – указатель на объект класса, При вызове функции-члена класса передается еще один неявный параметр – указатель на объект класса, который вызывает данную функцию. Этот указатель называется this. Это ключевое слово, в частности, используется при перегрузке операций. В общем случае функции-члены класса могут иметь доступ к приватным элементам класса. Например class c1{ int i; …. };

>Чтобы понять как работает оператор this рассмотрим короткую программу   #include <iostream.h> сlass Чтобы понять как работает оператор this рассмотрим короткую программу #include сlass c1{ int i; public: void load_i(int val) { this->i=val;} // аналогично i=val int get_i(void) { return this->i; } // аналогично return I; }; void main(void) { c1 c; c.load_i(100); cout<

>Рассмотрим дополнительно программу, содержащие перегрузку операции !   #include <string.h> #include <stdio.h> const Рассмотрим дополнительно программу, содержащие перегрузку операции ! #include #include const int MAX_LEN = 100; class Name { char data[MAX_LEN]; public: Name(); void SetData(char *newData); int operator!(); };

>// конструктор – инициализация нулями Name::Name() {  memset (data, ‘\0’ , sizeof(data) ); // конструктор – инициализация нулями Name::Name() { memset (data, ‘\0’ , sizeof(data) ); } // сохранить специфицированное имя void Name::SetData(char *newData) { strcpy(data, newData); }

>// перегрузка операции !() показывает , имеются ли данные int Name::operator!() {  return // перегрузка операции !() показывает , имеются ли данные int Name::operator!() { return (data[0] = = ‘\0’) } void main(void) { Name name; if(!name) // неявный вызов operator !() name.SetData(“ Тестирование программы”); // теперь явный вызов функции operator!() if(!name.operator!()) printf(“Данные присвоены ….\n”); }

>Перегрузка операций ввода/вывода. Инсерторы и экстракторы   Операция << в англоязычной литературе обычно Перегрузка операций ввода/вывода. Инсерторы и экстракторы Операция << в англоязычной литературе обычно называется inserting (вставка данных в поток), а операция >> - extracting (извлечение данных из потока). Функции – члены класса, обеспечивающие перегрузку операций <<, мы будем называть инсертором (insertor), а функцию, соответствующую перегрузке операции >>. Будем называть экстрактором (extractor).

>В качестве примера создания функции инсертора рассмотрим класс vector:   class vector{ В качестве примера создания функции инсертора рассмотрим класс vector: class vector{ public: int x, y, z; vector (int a, int b, int c) { x=a; y=b; z=c;} }

>Чтобы создать функцию-инсертор для этого класса, мы должны определить операцию ввода относительно этого класса, Чтобы создать функцию-инсертор для этого класса, мы должны определить операцию ввода относительно этого класса, т. е. перегрузить операцию <<. // vector инсертор ostream &operator <<(ostream &stream, vector obj) { stream << obj.x<<”, “; stream << obj.y<<”, “; stream <

>Пример работы инсертора:  #include <iostream.h> class vector{  public:   int x, Пример работы инсертора: #include class vector{ public: int x, y, z; vector (int a, int b, int c) { x=a; y=b; z=c;} } // vector инсертор ostream &operator <<(ostream &stream, vector obj) { stream << obj.x<<”, “; stream << obj.y<<”, “; stream <

>void main(void) {  vector a(1,2,3),b(4,5,6);  cout<<a<<”\n”<<b<<”\n”; } void main(void) { vector a(1,2,3),b(4,5,6); cout<

>Общая форма функции инсертора следующая:  ostream &operator <<(ostream &stream, class_type obj) { // Общая форма функции инсертора следующая: ostream &operator <<(ostream &stream, class_type obj) { // тело программы return stream; } Используется вариант stream << obj.x<<”, “; а не cout<< obj.x<<”, “; так как второй вариант жестко связан с потоком cout, a первый вариант может быть применен к любому потоку.

>В предыдущем примере данные-члены класса vector объявлены как public. Функция – инсертор не может В предыдущем примере данные-члены класса vector объявлены как public. Функция – инсертор не может быть членом класса. Для того, чтобы она имела доступ к приватным элементам класса, необходимо объявить ее “другом“ класса. Тогда предыдущий пример будет иметь вид:

>#include <iostream.h> class vector{  public:   int x, y, z;  #include class vector{ public: int x, y, z; vector (int a, int b, int c) { x=a; y=b; z=c;} friend ostream &operator <<(ostream &stream, vector obj); } ostream &operator <<(ostream &stream, vector obj) { stream << obj.x<<”, “; stream << obj.y<<”, “; stream <

>void main(void) {  vector a(1,2,3),b(4,5,6);  cout<<a<<”\n”<<b<<”\n”; } void main(void) { vector a(1,2,3),b(4,5,6); cout<

>Для перегрузки функции >> для класса vector можно использовать следующую функцию-экстрактор: istream &operator >>(istream Для перегрузки функции >> для класса vector можно использовать следующую функцию-экстрактор: istream &operator >>(istream &stream, vector obj) { cout<<”Enter x,y,z:”; stream >> obj.x>>obj.y>>obj.z; return stream: }

>Так же как и инсертор, функции-экстрактор не может быть членом класса, а поэтому используется Так же как и инсертор, функции-экстрактор не может быть членом класса, а поэтому используется как дружественная функция класса.

>Пример  #include <iostream.h> class vector{  public:   int x, y, z; Пример #include class vector{ public: int x, y, z; vector (int a, int b, int c) { x=a; y=b; z=c;} friend ostream &operator <<(ostream &stream, vector obj); friend istream &operator <<(istream &stream, vector obj); } ostream &operator <<(ostream &stream, vector obj) { stream << obj.x<<”, “; stream << obj.y<<”, “; stream <

>istream &operator <<(istream &stream, vector obj)  {   cout<<”Enter x,y,z:”;  istream &operator <<(istream &stream, vector obj) { cout<<”Enter x,y,z:”; stream >> obj.x>>obj.y>>obj.z; return stream: } void main(void) { vector a(1,2,3); cout<>a; cout<

>Дружественные функции-операции Дружественные функции-операции

>Дружественными функциями не могут перегружаться операции =, (), [],->. Дружественными функциями не могут перегружаться операции =, (), [],->.

>Пример перегрузки операции + для класса vector с помощью дружественной операции.   class Пример перегрузки операции + для класса vector с помощью дружественной операции. class vector { int x,y,z; // Три координаты public: friend vector operator + (vector t1, vector t2); vector operator+(vector t); void show(void); void assign( int mx, int my, int mz); }; vector operator+(vector t1, vector t2) { vector temp; temp.x=t1.x+t2.x; temp.y=t1.y+t2.y; temp.z=t1.z+t2.z; return temp; }

>Пример №2 #include <iostream.h>  class CL{  public:   int c; Пример №2 #include class CL{ public: int c; CL operator=(int i); friend CL operator+(CL ob, int i); friend CL operator+(int i, CL ob); }; CL CL::operator=(int i) { c = i; return *this; } CL operator+(CL ob, int i) { CL temp; temp.c=ob.c+i; return temp; }

>CL operator+(int i, CL ob) {  CL temp;  temp.c=ob.c+i;  return temp; CL operator+(int i, CL ob) { CL temp; temp.c=ob.c+i; return temp; } void main(void) { CL a; cout<

>Ссылки      По умолчанию С и С++ передают аргументы функции, Ссылки По умолчанию С и С++ передают аргументы функции, используя вызов по значению (call by value). Передача параметра по значению влечет за собой создание копии аргумента. Эта копия используется функцией и может быть изменена, но исходное значение аргумента при этом не меняется. Когда необходимо, чтобы функция изменяла значение аргумента, то параметры объявляются как указатели с использованием символа *.

>Пример  void swap1(int *i, int *j) {  int tmp=*i; *i=*j; *j=tmp; } Пример void swap1(int *i, int *j) { int tmp=*i; *i=*j; *j=tmp; }

>пример определения функции, имеющей один ссылочные параметры . void swap2(int &a, int &b) { пример определения функции, имеющей один ссылочные параметры . void swap2(int &a, int &b) { int tmp=a; a=b; b=tmp; } С вызовом swap2(a,b); Общий пример: #include void swap (int a, int b); // неработающая версия void swap1(int *a, int *b); // использование указателей void swap2(int &a, int &b); // использование ссылок

>main(void)  {     int a=7,b=9;     cout<<”до main(void) { int a=7,b=9; cout<<”до вызова функции swap()\n”; cout<<”a=”<

>void swap(int a, int b) {   int tmp=a; a=b; b=tmp; } void void swap(int a, int b) { int tmp=a; a=b; b=tmp; } void swap1(int *i, int *j) { int tmp=*i; *i=*j; *j=tmp; } void swap2(int &a, int &b) { int tmp=a; a=b; b=tmp; }

>Использование ссылочных переменных для перегрузки унарных операций    Операция ++ в программе Использование ссылочных переменных для перегрузки унарных операций Операция ++ в программе не была перегружена дружественной функцией, так как перегрузка требовала использования ссылки. Теперь перегрузку можно осуществить следующим образом: friend vector operator++(vector &op1) { op1.x++; op1.y++; op1.z++; return op1; }

>Перегрузка операции индексации  [ ]  Операция индексации рассматривается как бинарная операция, где Перегрузка операции индексации [ ] Операция индексации рассматривается как бинарная операция, где первый операнд – объект класса, а второй операнд – целочисленный индекс. Перегрузка операции индексации позволяет работать с элементами объекта vector как с элементами массива.

>#include <iostream.h> class vector {  int v[3]; // координаты public:  vector(int a=0, #include class vector { int v[3]; // координаты public: vector(int a=0, int b=0, int c=0){ v[0]=a; v[1]=b; v[2]=c;} vector operator +(vector t); vector operator =(vector t); int& operator[] (int i); void show(void); // перегрузка операции + vector vector::operator + (vector t) { vector temp; for (int i=0;i<3;i ++) temp.v[i]=t.v[i]+v[i]; return temp; }

>// перегрузка операции = vector vector::operator = (vector t) { vector temp;  for // перегрузка операции = vector vector::operator = (vector t) { vector temp; for (int i=0;i<3;i ++) v[i]=t.v[i]; return *this; } // перегрузка операции [] int& vector::operator[] (int I) { return v[i]; } void vector::show(void) { for (int i=0;i<3;i ++) cout<

>void main(void) {  vector v1(1,2,3),v2(10,11,12), v3;  v3 = v1 + v2; void main(void) { vector v1(1,2,3),v2(10,11,12), v3; v3 = v1 + v2; for (int i=0;i<3;i ++) cout<