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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ матрица http://www.cyberforum.ru/cpp-beginners/thread175171.html
Дана целочисленная прямоугольная матрица.Определить: 1)Количество строк ,не содержащих ни одного нулевого элемента. 2) Максимальное из чисел, встречающихся в заданной матрице более одного раза
C++ последовательность из 10 случайных чисел Написать программу которая генерирует последовательность из 10 случайных чисел, в диапозоне от 1 до 10. Выводит эти чисола на экран и вычисляет их среденее арифметическое. #include <iostream> #include <cstdlib> #include <ctime> using namespace std; void main() { http://www.cyberforum.ru/cpp-beginners/thread175159.html
C++ определить положение точки как это сделать?
Дали задание и совсем не представляю как его делать, может кто нибудь подскажет или направит с чего начать... Вот задание:определить положение точки M(x,y) относительно заштрихованной фигуры
C++ Умножение матриц
Вычислить: q = min(2*MA*MB) где MA, MB – матрицы размером N1xN2. Числа N1 и N2 задаются пользователем в начале работы программы. Все элементы матриц заполнить случайными целыми числами в диапазоне . Программу напишите пожалуйста как можно проще.
C++ поиск корня методом касательных http://www.cyberforum.ru/cpp-beginners/thread175136.html
Задача: найти корень уравнения, используя метод касательных. Точность e=0.0001 (в принципе она не нужна, так как я ввожу ее самостоятельно); x принадлежит промежутку (те a и b, тоже ввожу их самостоятельно). Вроде алгоритм правильный, но сумма - нуль и колоссальное число итераций n Код: // óòî÷íåíèå êîðíåé ìåòîäîì êàñàòåëüíûõ. #include <conio.h> #include <stdio.h> #include <cmath> using...
C++ классы нужно разобратся с перегрузками и класами задача для класса А, компонентай-данным которого является пара целых чисел, создать несколько обьектов(например, A a(1,3), b(3,1)). реализовать для обьектов данного класса перегрузку операции += (a+=b) используя внешнюю по отнашению к классу функцию перегрузки. если можно, нужен исходник по проще, и с коментариями. через неделю здавать а нифига в этом... подробнее

Показать сообщение отдельно
kravam
быдлокодер
1695 / 874 / 44
Регистрация: 04.06.2008
Сообщений: 5,338
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". ТАк ведь нет её
В чём дело, друзья?
 
Текущее время: 04:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru