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

оператор присваивания - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ матрица http://www.cyberforum.ru/cpp-beginners/thread175171.html
Дана целочисленная прямоугольная матрица.Определить: 1)Количество строк ,не содержащих ни одного нулевого элемента. 2) Максимальное из чисел, встречающихся в заданной матрице более одного раза
C++ На сколько квадратов можно разрезать данный прямоугольник? Даны натуральные числа a и b, которые определяют стороны прямоугольника. На сколько квадратов, стороны которых выражены также натуральными числами, можно разрезать данный прямоугольник, если от него... http://www.cyberforum.ru/cpp-beginners/thread175162.html
последовательность из 10 случайных чисел C++
Написать программу которая генерирует последовательность из 10 случайных чисел, в диапозоне от 1 до 10. Выводит эти чисола на экран и вычисляет их среденее арифметическое. #include <iostream>...
C++ определить положение точки как это сделать?
Дали задание и совсем не представляю как его делать, может кто нибудь подскажет или направит с чего начать... Вот задание:определить положение точки M(x,y) относительно заштрихованной фигуры
C++ Умножение матриц http://www.cyberforum.ru/cpp-beginners/thread175148.html
Вычислить: q = min(2*MA*MB) где MA, MB – матрицы размером N1xN2. Числа N1 и N2 задаются пользователем в начале работы программы. Все элементы матриц заполнить случайными целыми числами в...
C++ поиск корня методом касательных Задача: найти корень уравнения, используя метод касательных. Точность e=0.0001 (в принципе она не нужна, так как я ввожу ее самостоятельно); x принадлежит промежутку (те a и b, тоже ввожу их... подробнее

Показать сообщение отдельно
kravam
быдлокодер
1697 / 884 / 45
Регистрация: 04.06.2008
Сообщений: 5,481
31.10.2010, 13:15
Давай с последним примером разбираться, я щас над ним тоже парюсь, у меня вопросы похожие.
1) Почему вызывается не оператор присваивания

Ты наверное, имеешь ввиду этот код
C++
1
f1= f2+ f3
Ну я так понял, оператр присваивания нигде у тебя не определён, но тем не менее, он вызывается ВСЁ-ТАКИ, просто вызова мы не видим. Но тем не менее. У меня в книге написано по этому поводу:

"Функция оператора присваивания является специальной функцией, потому что компилятор сам её подставляет, если вы не делаете этого"

Ну вроде пока всё понятно должно быть. Уточняй если что не так.

2) К тому же конструктор копирования действительно вызывается. Ты имеешь ввиду этот?
C++
1
2
3
FloatFraction(const FloatFraction& src){
        set(src.get_num(), src.get_den());
    }
Ну, а почему бы ему не вызываться? ЕСли ты имеешь ввиду тот же самый код, то н приодится к такому виду:

C++
1
f1= f2.add(f3)
Теперь смотрим, что написано в книге:
ситуации, когда вызывается конструктор копирования АВТОМАТИЧЕСКИ, то есть ты не прописываешь его вызов, а н вызывается
1) Когда возвращаемое значение имеет тип класса

и так далее

В даном случае add возвращает переменную типа Fraction, поэтому конструктор копирования всё-таки вызывается (и должен вызываться), хоть мы этого и не видим (автоматически то есть)

Ну как-то так. Коряво.

Добавлено через 3 минуты
А, не я соврал чуток. Ты же не пишешь какой именно код ты имеешь ввиду приходится додумывать самому
Итак. f3= f1+ f2

При возвращении add значения вызывается (наверное) вот это конструктор копирования:
C++
1
2
3
FloatFraction(const Fraction& src){
        set(src.get_num(), src.get_den());
    }
А не тот, о котором я писал вначале

Добавлено через 2 часа 29 минут
Но что действительно удивляет, так это почему не вызывается это конструктор копирования
C++
1
2
3
    FloatFraction(const FloatFraction& src){
        set(src.get_num(), src.get_den());
    }
В этом выражении
C++
1
f3 = f1 + f2;
Оно ведь приводится к виду:
C++
1
   f3 = f1.add(f2);
Должен выщзываться констуктор копированя! Вот в книге написано:
"Конструктор копирования вызывается, когда аргумент имеет тип класса"

Это и есть тот случай
Аргумент тут f2, он имеетр тип FloatFraction, а, посколку add с таким классом работать не может,
его надо привести к типу Fraction

Вот и должен автоматом вышеупомянутый конструктор вызываться. Так не вызывается! Пишем так:

C++
1
2
3
4
    FloatFraction(const FloatFraction &src) {
     printf ("ttttttttttttttt\n");
     set(src.get_num(), src.get_den());
    }
Компилим, запускаем код на исплнение и ждём появления троки "ttttttttttttttttt\n". ТАк ведь нет её
В чём дело, друзья?
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru