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

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

Восстановить пароль Регистрация
 
jultomten
Сообщений: n/a
05.12.2010, 16:20     Преобразование типа аргумента в тип класса и дружественная функция #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++
Переопределение операторов как член-класса и как дружественная функция C++
Дружественная функция, объявлённая ранее вне пространства имён класса -> error LNK2019 в Visual Studio 2012 C++
C++ Шаблон класса и дружественная функция
C++ Дружественная функция
Дружественная функция-оператор, доступ к закрытым полям класса C++
C++ Дружественная функция класса

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

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

Текущее время: 10:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru