Указатели на объекты




с++, указатели на объекты, Programmation pour les débutants, c++c ++При первом знакомстве с указателями в C++ (voir. Pointeurs en C ++. partie 1 ) может сложиться упрощённое представление, что указатели могут указывать только на отдельные переменные встроенных (скалярных) типов C++, и что это просто ещё одна, альтернативная форма доступа к таким переменным. В таком применении указатели были бы приятным дополнением языка, но с весьма ограниченными возможностями.

При более внимательном изучении указателей C++ мы обнаруживаем, что указатель может быть адресом размещения (указывать на) tout допустимого объекта в программе: structure, объекта класса, tableau, fonctions, или опять же указателя на некоторый объект, или указателя на указатель и так далееЭто делает указатели чуть ли не самым мощным инструментом программиста на C++ … но и самым опасным в смысле возможных скрытых ошибок.

Рассмотрим такие варианты подробнее. Самым простым вариантом будет использование указателей на составные объекты (объекты классов и структуры). Но уже такое использование указателей открывает широкие перспективы в C++, как мы сейчас увидим.

si, мы уже знаем, что описание класса не создаёт никаких новых объектов данных в программе — это только описание некоторого шаблона, нового типа данных, согласно которому будут создаваться реальные объекты données. При создании (объявлении) новых объектов данных мы можем вычислять адрес этих объектов и присваивать их указателям на объекты cette classe. Напишем простейшую программу, оперирующую с указателями на объекты некоторого класса (файл ex1.cc):

Здесь мы видим относительно новую в наших темах конструкцию:

Это concepteur нового класса my, mais avec un paramètre создания. При вызове он вызывает конструктор родительского класса (nombre(numb)), передавая ему это же значение параметра. Следующие далее скобки {} обрамляют пустой блок кода, который означает, что ничего более сверх вызова родительского конструктора делать не нужно. Вспоминаем, что вся последовательность конструкторов всех родительских классоввызывается (в порядке обратном наследованию) при вызове конструктора порождённого класса, но это только для конструкторов без параметров. В случае параметризированных конструкторов родиелей вам прийдётся вызывать apparemment.

Но мы на этом отвлеклись в сторону от предмета нашего изложенияА теперь самое время компилировать и посмотреть выполнение полученной нами программы:

с++, указатели на объекты, Programmation pour les débutants, c++c ++

Пока ничего принципиально нового, и всё это сильно похоже на то, как мы работали бы с указателями на переменные типа double, disons.

Вспомним, в дополнение, que оператор new для динамического создания нового объекта:

et) вызывает менеджер динамического управления памяти и выделяет новый объем под размещение такого объекта;

b) вызывает concepteur соответствующего класса (типа данных) для начальной разметки (инициализации) выделенной памяти. Слегка модифицируем свой пример (файл ex2.cc):

Сборка и выполнение:

с++, указатели на объекты, Programmation pour les débutants, c++c ++

Пока ещё не произошло никаких радикальных изменений …, но обратим внимание на то, что в программе (а это могла бы быть сколь угодно большая программа) вообще не объявлены и не используются в явном виде объекты — программа оперирует только указателями на объекты.

et, enfin, мы приближаемся к той технике в использовании указателей на объекты, которая делает указатели самым мощным инструментом работы с классами и их объектами в C++. à savoir: виртуализация функций-членов класса и полиморфизм. Понятие полиморфизма (изменчивости формы, многоликости) – одно из основных направлений развития C++ от его предшественника языка C. Оно состоит в том, что прародитель целого семейства наследуемых классов объявляет некоторые свои функции-методы как virtual. А в разных наследуемых классах эти функции-методы переопределяются по-разному. cela signifie que, что в различающихся наследуемых классах (родственных) функция-метод с одним и тем же именем будет выполняться несколько различающимся способом, в зависимости от конкретного класса в котором она используется.

Продемонстрируем эту технику на примере. créer (файл ex3.cc) classe, описывающий вообще любые плоские фигуры на плоскости (это могут быть элементы некоторого 2D игрового сценария):

Здесь перед нами образец того, что в C++ называется абстрактный classe: classe, в котором определена хотя бы одна виртуальная функция с определением вида:

В показанном классе таких функций аж 3. naturellement, что создать objet абстрактного класса impossible, в нём есть функции, тело которых не определено. Попытка объявления объектов такого класса вызовет синтаксическую ошибку. Но от такого класса можно наследовать, создавать производные классы, которые унаследуют общие свойства родового абстрактного (par exemple, координаты X et et центра фигуры и её размер r).

Определим 3 производных à partir de figure classe: круг, квадрат и равносторонний треугольник:

Теперь мы готовы создать программу, для которой строились все эти приготовления: создать произвольное число различных 2D геометрических objets, над которыми можем выполнять единообразные (виртуальные) действия, не взирая на их различную природу:

На этом простейшем примере показано то, dans объектной модели языка C++ называется полиморфизм. И это свойство является одним из самых мощных выразительных инструментов языка C++. И реализуется эта техника всегда через указатели на объекты (figure*).

Вот как будет выглядеть компиляция и выполнение нашего примера (ex3.cc) в терминале операционной системы Linux при использовании GCC компилятора с языка C++ (это будет лишний раз подтверждением того, что программирование на языке C++ в меньшей мере зависит от операционной системы):

с++, указатели на объекты, Programmation pour les débutants, c++c ++

Ещё раз обратимся к коду показанного примера, и лишний раз зафиксируем то чрезвычайно важное обстоятельство, что указатели C++ всегда типизированы: указатель не может быть «указателем на что-то». Язык C++это язык со строгой именной типизацией. Типом же указателя является: указатель на тип указываемой ним переменной, например «указатель на double». Указатели на различные типы несовместимы между собой по присвоению и сравнению.

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

Pour soutenir notre site – cliquez sur la tirelire et choisir un moyen pratique.

Bulletin de nouvelles leçons sur la programmation:


Je suis d'accord pour recevoir des messages de purecodecpp.com sur mon e-mail

date
page
Указатели на объекты в C++
évaluation
5
huile

Sur huile

une expérience pratique sur le développement de logiciels 40 ans. société de logiciels internationale Global Teacher Logic. IBM Developer Works auteur permanent des publications. éditeur scientifique de l'ordinateur littérature maison d'édition "Symbole-Plus", Saint-Pétersbourg.

7 réflexions sur "Указатели на объекты

  1. По темеуказатель указывает на начало области памяти (хранит адрес). И нечего дальше писать про это, tk. при использовании указателя ты просто берешь значение по этому адресу и приводишь его к нужному типу (любому).
    Если и раскрывать темуто надо ИМХО написать про то, какие проблемы решали указатели (не касаясь ООП, tk. тут эта тема почти не раскрывалась) и написать по мотивам указатели vs ссылки (тема уже раскрыта у Маерса, можно взять там основу).

    Но ты как то резко ты перешла к полиморфизму. Это не плохо, но юзерам, которые читали только твой сайт теперь мало что понятно. До этого, описывая классы ты не писала про виртуальные функции и даже про наследование. А тут вдруг на читателя упало все это и абстрактные классы.

    В конце статьи ты описала полиморфизмя думаю это стоит выделить в отдельную статью. Но перед этим написать статью про “les classes d'héritage en C ++” (это последняя тема в твоем плане на главной странице)

  2. dire, а кто админ? Лилия или Игорь? Я всегда думал, что от имени админа пишет Игорь.

  3. A, что означают строки? В первом листинге

    1. Объект класса (type) mym1.
      Указатель на этот объектpm1.
      m1.show() – вызов метода (fonctions) show() класса my для объекта m1.
      pm1->show() – вызов точно того же метода show() класса my через aiguille на объект m1.

      1. Вообще-то m1это один объект, а pm1это указатель на совсем другой объект того же класса (в динамической памяти).

Laisser un commentaire

Placez le code dans les balises: <pre class="lang:c ++ décodage:true ">VOTRE CODE</pré>