Как распределена память компьютера? Как мы работаем с переменными? Что такое объект, зачем нам ссылки на него?
Все мы знаем, ЧТо такое ссылка на объект, и что такое сам объект. Когда мы только начинали нежно прикасаться к C++. Мы недоумевали разницы между "->"и ".". Почему иногда надо то а иногда то.
Это конечно от того что мы смело кинулись писать в Здоровилах типа RAD Studio Professional, VisualStudio Ultimate ,Qt4. Где можно начать писать буквально мышкой, и имея некие представления о синтаксисе, уча его по ходу чтения кучи namespase-ов классов, непонятных define-ов typedef-ов enum-ов tamplate-ов и прочих вкусностей C++. и не прочитав ни одной страницы книги по C++ мы уже писали более не менее сложные программки. По ходу дела учась и объектно-ориентированному, и клиент-серверному,осваивая синтаксис в процессе разгребания n-ной сотни error-ов компилятора.
В хороших традициях надо начинать с простых программ, консольных, небольших, на чистом ANSI C.Постепенно в него вкрапляя С++. Например с gcc и g++;
И вот хочу сейчас продемонстрировать Что такое объект, а что такое ссылка.
Для начала освоим такие операторы..
*,&
Что они делают?
Ну сначала вспомним, как мы создаём любой объект
Да, и что мы получили?
*Obj - ссылка, определяющая начало той области памяти, где находиться объект.
Оператор * возвращает копию области памяти на которой находиться объект.
Оператор & возвращает ссылку на объект
то есть &Obj будет типа **A.
Давайте, посмотри пример в котором я постарался показать как изменяются значения, если использовать ссылки и сами объекты.
И вывод
Начнём.
Я объявил структуру The_Ball у которой есть поле color.
И определил макрос BallLink как указатель
В первых строках main я создаю Красный мячик и ссылку на него
Дальше по значению меняю цвет на синий. После изменений, ссылка тоже указывает на теперь синий мячик.
Потом я создаю второй мячик как КОПИЮ 1-го. И меняю его цвет на Красный. И получается что 1-й у меня остаётся Синим, а второй красным. Потом я создаю ещё одну ссылку b3Num которая указывает тот-же адрес что и ссылка на 1 мячик, и создаю объект по этой ссылке, И этот объект у меня получается копия 1-го мячика, но ссылка указывает на 1-й.И при изменении цвета 1-го мячика на Зелёный, ссылка b3Num указывает уже на Зелёный цвет, когда объект созданный по ссылке, указывает на Красный.
И вот время перекрасить все объекты в Чёрный для определения. Если бы я вывел все ссылки, вы бы убедились что они тоже все обязательно указывают на Чёрное.
И теперь время вызывать функции в первую функцию Я передаю указатель на переменную, которую функция окрасит в Розовый. Во вторую Я передаю саму переменную, и в третью адресс переменной.
И что мы вилим на выходе? когда передаём ссылку, всё краситься, когда передаём саму переменную, ничего не происходит, потому что по сути мы передали копию переменной. И когда передаём ардесс переменной всё тоже хорошо красится. Вот и вся магия.Это стоит запомнить, когда буем сообщать функциям переменные которые стоит менять и не стоит менять.
Все это вопиет с небес на землю
И ждет разбора.
И его найдет.
Все мы знаем, ЧТо такое ссылка на объект, и что такое сам объект. Когда мы только начинали нежно прикасаться к C++. Мы недоумевали разницы между "->"и ".". Почему иногда надо то а иногда то.
Это конечно от того что мы смело кинулись писать в Здоровилах типа RAD Studio Professional, VisualStudio Ultimate ,Qt4. Где можно начать писать буквально мышкой, и имея некие представления о синтаксисе, уча его по ходу чтения кучи namespase-ов классов, непонятных define-ов typedef-ов enum-ов tamplate-ов и прочих вкусностей C++. и не прочитав ни одной страницы книги по C++ мы уже писали более не менее сложные программки. По ходу дела учась и объектно-ориентированному, и клиент-серверному,осваивая синтаксис в процессе разгребания n-ной сотни error-ов компилятора.
В хороших традициях надо начинать с простых программ, консольных, небольших, на чистом ANSI C.Постепенно в него вкрапляя С++. Например с gcc и g++;
И вот хочу сейчас продемонстрировать Что такое объект, а что такое ссылка.
Для начала освоим такие операторы..
*,&
Что они делают?
Ну сначала вспомним, как мы создаём любой объект
class A{}; A*Obj = new A();
Да, и что мы получили?
*Obj - ссылка, определяющая начало той области памяти, где находиться объект.
Оператор * возвращает копию области памяти на которой находиться объект.
Оператор & возвращает ссылку на объект
то есть &Obj будет типа **A.
Давайте, посмотри пример в котором я постарался показать как изменяются значения, если использовать ссылки и сами объекты.
#include <string> #include <iostream> using namespace std; #define BallLink The_Ball* struct The_Ball{ string Color; }; void Paint_in_Pink(The_Ball* Ball){ Ball->Color = "Pink"; } void Paint_in_Gray(The_Ball Ball){ Ball.Color = "Gray"; } void Paint_in_Yellow(The_Ball& Ball){ Ball.Color = "Yelow"; } int main() { The_Ball b1; b1.Color = "Red"; BallLink b1Num = &b1; cout<<"b1 = "<<b1.Color<<"; Adress of b1 = "<<b1Num<<"; Value got by Adress = "<<b1Num->Color<<endl; b1.Color = " blue"; cout<<"b1 ="<<b1.Color<<";Adress of b1 = "<<b1Num<<" ;Value got by Adress"<<b1Num->Color<<endl; The_Ball b2 = b1; b2.Color = "Red"; cout<<"b1= "<<b1.Color<<";b2 = "<<b2.Color<<endl; BallLink b3Num = b1Num; The_Ball b3 = *b3Num; b1.Color = "Green"; cout<<"b3 = "<<b3.Color<<"; Value got by adress b3Num thas the same as b1Num ="<<b3Num->Color<<endl; b1.Color = "Black"; b2.Color = "Black"; b3.Color = "Black"; cout<<"Swich all to Black"<<endl; Paint_in_Pink(&b1); Paint_in_Gray(b2); Paint_in_Yellow(b3); cout<<"b1 = "<<b1.Color<<endl; cout<<"b2 = "<<b2.Color<<endl; cout<<"b3 = "<<b3.Color<<endl; }
И вывод
b1 = Red; Adress of b1 = 0x7fffc1b84e70; Value got by Adress = Red b1 = blue;Adress of b1 = 0x7fffc1b84e70 ;Value got by Adress blue b1= blue;b2 = Red b3 = blue; Value got by adress b3Num thas the same as b1Num =Green Swich all to Black b1 = Pink b2 = Black b3 = Yelow
Начнём.
Я объявил структуру The_Ball у которой есть поле color.
И определил макрос BallLink как указатель
В первых строках main я создаю Красный мячик и ссылку на него
Дальше по значению меняю цвет на синий. После изменений, ссылка тоже указывает на теперь синий мячик.
Потом я создаю второй мячик как КОПИЮ 1-го. И меняю его цвет на Красный. И получается что 1-й у меня остаётся Синим, а второй красным. Потом я создаю ещё одну ссылку b3Num которая указывает тот-же адрес что и ссылка на 1 мячик, и создаю объект по этой ссылке, И этот объект у меня получается копия 1-го мячика, но ссылка указывает на 1-й.И при изменении цвета 1-го мячика на Зелёный, ссылка b3Num указывает уже на Зелёный цвет, когда объект созданный по ссылке, указывает на Красный.
И вот время перекрасить все объекты в Чёрный для определения. Если бы я вывел все ссылки, вы бы убедились что они тоже все обязательно указывают на Чёрное.
И теперь время вызывать функции в первую функцию Я передаю указатель на переменную, которую функция окрасит в Розовый. Во вторую Я передаю саму переменную, и в третью адресс переменной.
И что мы вилим на выходе? когда передаём ссылку, всё краситься, когда передаём саму переменную, ничего не происходит, потому что по сути мы передали копию переменной. И когда передаём ардесс переменной всё тоже хорошо красится. Вот и вся магия.Это стоит запомнить, когда буем сообщать функциям переменные которые стоит менять и не стоит менять.
Комментариев нет:
Отправить комментарий