Форум программистов, компьютерный форум CyberForum.ru

О вызове функций классов - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ создать и напечатать матрицу http://www.cyberforum.ru/cpp-beginners/thread373348.html
YurA_280784, доброго дня помоги пожалуйста создать матрицу или плдскажи буду благодарен !!! создать и напечатать матрицу С, размером (6*7) найти минимальное по модулю элементы в каждом столце матрицы. Подзадачи создания и печать матрицы оформить в виде процедур а подзадачи определения массива минимальных значений оформить в виде функции.
C++ Глупый вопрос про наследование Вот фрагмент кода, реального: class CListviewParamPrimary : public CListviewParamFloats { private: /** * @brief Возвращает указатель на объект значения параметра */ virtual CParamValue *get_primary_param(void) = 0; virtual const CParamValue *get_primary_param(void) const = 0; http://www.cyberforum.ru/cpp-beginners/thread373344.html
Разница между i++ и ++i.Си C++
Можете объяснить разницу между i++ и ++i на просто примере с цифрами?
Контроль напряжения на портах USB C++
Доброго времени суток. Кто может, подскажите пожалуйста можно ли контролировать количество напряжение что подается на USB порт(вкл, выкл) и если можно то как.
C++ Программа на массивы http://www.cyberforum.ru/cpp-beginners/thread373307.html
Помогите пожалуйста написать правильный код для программы. Уже дня 3-4 пробую ничего не получается путевого. Вообщем. Дан двумерный массив, элементы которого вводятся случайным образом. Нужно заполнить новый одномерный массив из элементов двумерного массива которые встречаются в нем более одного раза. Вот то что я пробовал делать: #include <conio.h>; #include <iostream>; #include <clocale>;...
C++ Ответы на книгу Бьерн Страуструп Программирование - Принципы и практика с помощью C + + Вот хотел есть ли книга с ответами на упражнения в книги Бьерн Страуструп Программирование - Принципы и практика с помощью C + + . Просто что то иногда не получается хочется глянуть как это делается подробнее

Показать сообщение отдельно
Сыроежка
Заблокирован
27.10.2011, 19:10     О вызове функций классов
Цитата Сообщение от Haster Посмотреть сообщение
Здравствуйте, товарищи!

У меня возник вопрос, почему работает данный код:
C++
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
33
34
35
36
37
38
39
40
41
42
43
44
45
#include "stdafx.h"
#include <conio.h>
#include <iostream>
 
using namespace std;
 
class A
{
public:
    int a;
    int b;
    A()
    {
        cout<<"Constr\r\n";
    }
    void my(int a)
    {
        cout<<"my\r\n";
    }
    ~A()
    {
        cout<<"Destr\r\n";
    }
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    A *a = new A();
    a->a = 5;
    a->b = 10;
    cout<<"&a = "<<&a<<"\r\n";
    cout<<"a = "<<a<<"\r\n";
    delete a;
    cout<<"a->a = "<<a->a<<"\r\n";
    cout<<"a->b = "<<a->b<<"\r\n";
 
    a = reinterpret_cast<A*>(0x403450L);
    cout<<"&a = "<<&a<<"\r\n";
    cout<<"a = "<<a<<"\r\n";
    a->my(0);
    cout<<"a->a = "<<a->a<<"\r\n";
    cout<<"a->b = "<<a->b<<"\r\n";
    _getch();
    return 0;
}
Вывод на консоль
C++
1
2
3
4
5
6
7
8
9
10
11
Constr
&a = 0012FF54
a = 0034C3B8
Destr
a->a = -17891602
a->b = -17891602
&a = 0012FF54
a = 00403450
my
a->a = 0
a->b = 0
т.е. мне не понятно, почему после удаления объекта, и изменения значения указателя a
сохраняется возможность вызвать функцию my.
Вероятно, функции в объектах вызываются каким-то странным образом?
Чтобы ответить на ваш вопрос, нужно разобраться, а что из себя представляет ваш объект? А ваш объект хранится в памяти, как обычная структура, состоящая из двух полей int a и int b. Больше ничего в вашем объекте нет, и никакие функции в объекте не хранятся.
Для всех объектов вашего класса имеется лишь одно определение ФУНКЦИИ void my(int a). Причем, так как эта функция определяется внутри тела класса, то она является встраиваемой, и код ее определения компилятор поместил во все места, где вы эту функцию вызываете. То есть это сделано компилятором еще до выполнения вашей программы. В чем разница вызова этой функции -члена класса, от обычной функции? Разница состоит лишь в том, что функции - члену класса передается неявно дополнительный первый параметр, который является указателем на объект вашего класса и носит название this.

Так что компилятору совершенно без разницы, удалили вы объект, или нет, он вставляет в код вызов этой функции и передает ей в качестве первого параметра значение вашего указателя a.
Как вы сами можете видеть из вывода вашей программы, сам указатель a никуда не делся! Его время жизни соотвентсвует телу функции main, в которой он, как локальная переменная, объявлен. Так что компилятору всегда известен адрес a. В вашем случае, судя по выводу программы, его адрес равен 0012FF54. Поэтому компилятор просто при вызове функции my в качестве первого неявного параметра, соответствующего this передает то значение, которое хранится в a. С этим параметром, то есть со значением, хранящемся в a, вы в функции my не работаете. Поэтому и никаких ошибок и не возникает!
 
Текущее время: 13:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru