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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
jultomten
Сообщений: n/a
#1

Преобразование типа аргумента в тип класса и дружественная функция - C++

05.12.2010, 16:20. Просмотров 431. Ответов 1
Метки нет (Все метки)

Добрый день.

Есть код:
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
class Cls
{
private:
    double x;
public:
    Cls();
    Cls(double);
    void Show();
    friend Cls operator+(Cls , Cls);
};
 
Cls::Cls()
{}
Cls::Cls(double a)
{
    cout << "constructor" << endl;
    x = a;
}
void Cls::Show()
{
    cout << x << endl;
}
Cls operator+(Cls a, Cls b)
{
    cout << "operator+" << endl;
    Cls tmp;
    tmp.x = a.x + b.x;
    return tmp;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    double z = 3.33;
    Cls A = z;
    A.Show();
    cout << endl;
    A = A + 4.44;
    A.Show();
    cin.get();
    return 0;
}
Результат выполнения кода:
constructor
3.33

constructor
operator+
7.77
Почему во втором случае сначала выводится "constructor", а не "operator+"? Разве не происходит сначала вызов дружественной функции для сложения объекта класса и числа, а только потом вызов конструктора для присвоения значения объекту класса, ведь тогда получается наоборот должно быть? Объясните, плиз, что на самом деле происходит.

Добавлено через 1 час 45 минут
ап ап ап
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.12.2010, 16:20     Преобразование типа аргумента в тип класса и дружественная функция
Посмотрите здесь:

Дружественная функция класса - C++
Проблема в том что дружественная функция класа механик в класе car (friend void update_status) не может обращатся к полям, почему? ...

Шаблон класса и дружественная функция - C++
Доброго времени суток. Столкнулся с непониманием одного процесса. Задача звучит следующим образом: Написать шаблон функции isEqualTo для...

Дружественная функция-оператор, доступ к закрытым полям класса - C++
У меня есть класс MyClass, вот код: class MyClass { int x, y; public: MyClass(); friend ostream &amp; operator &lt;&lt; (ostream &amp;,...

Почему дружественная функция не может обратиться к protected полю класса? - C++
Не могу понять, почему функция не может обратиться к protected полю класса: class Ships { protected: int hits; int ships; ...

Почему дружественная функция с перегруженным оператором << не имеет доступа к данным класса? - C++
В заголовочном файле &quot;klass.h&quot; есть класс: class klass { int x; public: klass(); ~klass(); void show(); friend void...

Дружественная функция, объявлённая ранее вне пространства имён класса -> error LNK2019 в Visual Studio 2012 - C++
Всем привет. Долгое время пытался откопать ответ в гугле, но не получилось. Заранее благодарен. void f(){}; namespace space { ...

Переопределение операторов как член-класса и как дружественная функция - C++
Привет. Задача создать класс целых чисел, для него нужно переопределить операторы ++ и + как функции-члены и -- и - как дружественные...

как сделать чтобы дружественная функция классу принимал ааргумент типа "класс" который при создании ничем не инициализирован? - C++
Друзья! Вот код, компилятор ругается на строку ff (f3); В общем переменную f3 необходимо объявлять без параметров, а потом передавать её...

Преобразование типа char в тип float - C++
При считывании из файла чисел (каждое число расположено на новой строке, целая часть от дробной отделяется точкой). Использую функцию...

Функция шаблонного класса возвращающая тип, определенный классом - C++
ошибка. говорит, что не ожидал увидеть идентификатор some(C2061)template&lt;typename T&gt; class a{ public: enum some{one,two}; some...

Дружественная функция - C++
описать классы автомобиль и маршрут. Использовать дружественную функцию определить количество потраченного топлива и время на преодоление...

Дружественная функция - C++
Хочу сделать вычисление площади как дружественную функцию, начал описывать, дальше догнать не могу как кодить. Подскажите? #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,930
Завершенные тесты: 1
05.12.2010, 18:09     Преобразование типа аргумента в тип класса и дружественная функция #2
Сначала у тебя из числа 4.44 создаётся объект Cls - это неявный вызов конструктора из значения double, что и выводит тебе сообщение constructor. Затем вызываются конструкторы копирования (сделанные компилятором по умолчанию, так как ты не стал их определять) для каждого из этих двух объектов - A и безымянного 4.44, которые не сообщают, что вызвались. Копируются сии объекты из-за того, что передаются в оператор сложения по значению, а не по ссылке. После того, как оператор выполняется, происходит копирование (опять же через конструктор копирования) результата в безымянный объект Cls со значением 7.77. Безымянный объект 4.44 уничтожается. Затем выполняется оператор присваивания (опять же, сделанный компилятором по умолчанию), помещающий значение безымянного объекта в A, после чего безымянный объект 7.77 уничтожается. Затем - вывод значения A.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru