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

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

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

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

05.12.2010, 16:20. Просмотров 434. Ответов 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++):

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

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

Дружественная шаблонная функция шаблонного класса - C++
Не компилируется. Подскажите правильный синтаксис. template&lt;typename T&gt; class A; template&lt;typename T, typename ... Args&gt; void func(A&lt;T&gt;...

Дружественная функция-оператор, доступ к закрытым полям класса - 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...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Nick Alte
Эксперт С++
1638 / 1010 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
05.12.2010, 18:09 #2
Сначала у тебя из числа 4.44 создаётся объект Cls - это неявный вызов конструктора из значения double, что и выводит тебе сообщение constructor. Затем вызываются конструкторы копирования (сделанные компилятором по умолчанию, так как ты не стал их определять) для каждого из этих двух объектов - A и безымянного 4.44, которые не сообщают, что вызвались. Копируются сии объекты из-за того, что передаются в оператор сложения по значению, а не по ссылке. После того, как оператор выполняется, происходит копирование (опять же через конструктор копирования) результата в безымянный объект Cls со значением 7.77. Безымянный объект 4.44 уничтожается. Затем выполняется оператор присваивания (опять же, сделанный компилятором по умолчанию), помещающий значение безымянного объекта в A, после чего безымянный объект 7.77 уничтожается. Затем - вывод значения A.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.12.2010, 18:09
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

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