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

Объясните про инициализацию - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Введите вектор с элементами double и сортируйте его по возрастанию. http://www.cyberforum.ru/cpp-beginners/thread449012.html
Помогите пожалуйста написать следующие программы. Хотя бы 2-3 штуки. Заранее спасибо. 1. Введите вектор с элементами double и сортируйте его по возрастанию. 2. Введите вектор с элементами float и найдите его длину. 3. Введите вектор и найдите его норму: модуль координаты с наибольшей абсолютной величиной. 4. Введите вектор и найдите его норму: сумму абсолютных величин координат. 5....
C++ Треугольник из кругов. Здравствуйте! Помогите нарисовать треугольник из нечетных кругов. Чтоб каждый ряд был разного цвета. Догадываюсь, что надо решать через цикл, а как реализовать не понимаю. http://www.cyberforum.ru/cpp-beginners/thread449010.html
C++ матрица
помогите написать программу очень надо для зачета по программированию
C++ Шаблонные функции
1) Написать шаблонную функцию для нахождения минимального из трех передаваемых чисел (для чисел типа int, double, char). В функции использовать турнирных оператор. 2) Написты перегружены (overload) шаблонные функции для нахождения корней линейного (ax + b = 0) и квадратного (ax2 + bx + c = 0) уравнения. 3) Написaты встроенную (inline) функцию для нахождения стоимости покупки. В качестве...
C++ Логический тип данных http://www.cyberforum.ru/cpp-beginners/thread448994.html
как можно обернуть с False на True и на оборот Например: переменная b сожержит True какой командой можно менять ее значение на противоположное?
C++ Протабулировать функцию Протабулировать функцию на С++. подробнее

Показать сообщение отдельно
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
19.02.2012, 18:28     Объясните про инициализацию
Цитата Сообщение от Merovingian Посмотреть сообщение
Интересует последняя строчка, почему идёт два вызова?
Выше сказали, как исправить, ну а я скажу, почему именно два:
Конструктор с одним параметром, не объявленный как explicit, служит оператором преобразования типа из типа параметра конструктора в тип класса. У вас именно такой конструктор имеется, принимающий константную строку. Таким образом, он является оператором преобразования из const char * в TString. Но чтобы присвоить одну строку другой, нужно вызвать оператор присваивания. А у вас имеется только один оператор присваивания, принимающий константную ссылку на TString. Однако также имеется оператор пользовательского преобразования, преобразующий константную строку в TString. Значит присвоить константную строку объекту типа TString можно посредством преобразования этой строки в TString, а этим занимается конструктор. Строка
C++
1
s1 = "Hello!";
по сути разворачивается в
C++
1
s1 = TString("hello");
, а затем в
C++
1
s1.operator=(TString("Hello!"));
. Вот и два вызова. Если вы реализуете оператор присваивания, принимающий const char *, то вызов конструктора для создания временного объекта не потребуется, и буде только вызов operator=.

Добавлено через 1 минуту
Цитата Сообщение от Merovingian Посмотреть сообщение
сделать дополнительно еще метод
Именно.

Цитата Сообщение от Merovingian Посмотреть сообщение
изменить TString& operator=(const TStrint&) на TString& operator=(const char*)
А вот в этом случае вы не сможете инициализировать свою строку другим объектом типа TString. Хоть компилятору и известно о преобразовании const char * -> TString посредством конструктора с параметром, но об обратном преобразовании он ничего не знает. А такой оператор присваивания, который не может присвоить одному объекту другой объект того же типа, нафиг не нужен))
 
Текущее время: 17:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru