1 2 3 4 5 6 7 8 9 10 11 12 13 |
//Листинг #1 class MyClass{ public: void foo(){ this; //Указывает на объект, запустивший foo } } int main{ MyClass obj1, obj2; //Два объекта obj1.foo(); //Внутри foo this есть указатель на obj1 obj2.foo(); //Внутри foo this есть указатель на obj2 } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
//Листинг #2 #include <iostream> using namespace std; class MyClass{ int width, height; public: void get(int width, int height){ this->height = height; //Обращаемся к полям x и y текущего объекта this->width = width; } void print(){ cout << "width = " << width << '\n' << "height = " << height << '\n'; } }; int main(){ MyClass x,y; x.get(100,200); //Получаем данные y.get(300,400); x.print(); //Выводим данные y.print(); } |
1 2 |
int arr[10]; cout << arr; //Вывод адреса первого элемента массива |
1 2 3 4 |
class MyClass{}; int main(){ cout << MyCLass; //Ошибка} |
Этот доступ и даётся нам ключевым словом this.
1 2 3 4 5 6 |
/*функция какого-то класса*/ void Date::setMonth( int mn ) //принимает целое число, обозначающее номер месяца{ month = mn; // Обычное присваивание this->month = mn; // Эквиваленты этого же присваивания (*this).month = mn; } |
1 |
return *this; |
1 |
if (&Object != this) {// Условие не выполнится, если ссылка на объект имеет адрес начала собственного объекта |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
//Листинг #3 Visual Studio #include <stdlib.h> #include <iostream> using namespace std; class MyClass{ int x; //Доступна только внутри класса public: void Get(); //Функция ввода значения в x void Show(); //Функция Вывода x на экран }; void MyClass::Get() //Функция принадлежит классу MyClass{ cout << "input x: "; cin >> this->x; //Ввод данных в переменную x объекта a } void MyClass::Show() //Функция принадлежит классу MyClass{ cout << this->x << '\n'; //Вывод x из объекта a на экран // cout << x << '\n'; //Можно и так } int main(){ system("CLS"); MyClass a; //Создали объект a типа MyClass a.Get(); //Ввод данных a.Show(); //Вывод данных на экран a.Get(); //Ввод данных a.Show(); //Вывод данных на экран system("PAUSE"); } |
При выполнении программы нужно ввести значения для x. Внутри класса две функции: одна обеспечивает ввод переменной, другая обеспечивает вывод данных на экран.
Тип this в классе с именем MyClass будет *MyClass
Если функция класса объявлена как константная, то тип this будет const MyClass*
Если функция volatile, то тип volatile MyClass*
Если функция const volatile, то тип const volatile*
1 2 3 4 5 |
class MyClass{ void foo1() {}; //Тип this = MyClass* void foo2() const {}; //Тип this = const MyClass* void foo3() volatile {} //Тип this = volatile MyClass* void foo4() const volatile {} //Тип this = const volatile MyClass*} |
1 2 3 4 5 6 7 8 9 10 11 12 |
//Листинг #4.1 class MyClass{ void foo(){ MyClass *ptr = new MyClass(*this); //Тут код delete ptr; } }; int main(){ MyClass obj; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
//Листинг #4.2 class MyClass{ void foo(MyClass* obj){ MyClass *ptr = new MyClass(*obj); //Тут код delete ptr; } public: void init(MyClass* obj){ foo(obj); } }; int main(){ MyClass obj; obj.init(&obj); } |
Спасибо. Все очень доступно объяснено.
Очень хорошее и толковое обьяснение!
Благодарю!
Не убедительно и непонятно. Зачем усложнять программу если и так работает:
Уважаемый автор. Предложение из 2-го абзаца не является лаконичным, наверное какое-то слово лишнее.
Любая функция-элемент класса, не являющаяся статической имеет доступ к объекту, для которого она вызвана,
через посредствоключевого слова this.1-ый вариант исправления … , через ключевое слово this.
2-ой вариант исправления …, посредством ключевого слова this.
Автор, код ваш не удобен для копипаста. ЗАмените его на такой