54 / 54 / 9
Регистрация: 24.09.2011
Сообщений: 149
|
||||||
1 | ||||||
Объясните про инициализацию19.02.2012, 17:56. Показов 1112. Ответов 16
Метки нет (Все метки)
Реализовал свой класс для строки (в качестве практики изучения c++)
это не так важно
Класс самый обычный, реализация методов не так важна... Есть следующие строчки в main(): Tstring s("Hello world!"); Tsring s1 = s; s = s1; s1 = "Hello!"; Какие методы должны вызываться в каждой строчке? Tstring s("Hello world!") - вызывается TString(const char* s) Tsring s1 = s - вызывается TString(const TString& s) s = s1 - вызывается TString(const TString& s) s1 = "Hello!" - вызывается TString(const char* s) а за ним в след TString& operator=(const TString); Интересует последняя строчка, почему идёт два вызова?
0
|
19.02.2012, 17:56 | |
Ответы с готовыми решениями:
16
Про позднюю инициализацию std::thread Про инициализацию объекта в поле класса Объясните про strchr Объясните про исключения |
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
|
|
19.02.2012, 18:02 | 2 |
Merovingian, сделай TString& operator=(const char*);
и будет тебе 1 вызов
1
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
19.02.2012, 18:20 | 3 |
0
|
54 / 54 / 9
Регистрация: 24.09.2011
Сообщений: 149
|
|
19.02.2012, 18:26 [ТС] | 5 |
сделать дополнительно еще метод или изменить TString& operator=(const TStrint&) на TString& operator=(const char*)
??
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
||||||||||||||||
19.02.2012, 18:28 | 6 | |||||||||||||||
Выше сказали, как исправить, ну а я скажу, почему именно два:
Конструктор с одним параметром, не объявленный как explicit, служит оператором преобразования типа из типа параметра конструктора в тип класса. У вас именно такой конструктор имеется, принимающий константную строку. Таким образом, он является оператором преобразования из const char * в TString. Но чтобы присвоить одну строку другой, нужно вызвать оператор присваивания. А у вас имеется только один оператор присваивания, принимающий константную ссылку на TString. Однако также имеется оператор пользовательского преобразования, преобразующий константную строку в TString. Значит присвоить константную строку объекту типа TString можно посредством преобразования этой строки в TString, а этим занимается конструктор. Строка
Добавлено через 1 минуту Именно. А вот в этом случае вы не сможете инициализировать свою строку другим объектом типа TString. Хоть компилятору и известно о преобразовании const char * -> TString посредством конструктора с параметром, но об обратном преобразовании он ничего не знает. А такой оператор присваивания, который не может присвоить одному объекту другой объект того же типа, нафиг не нужен))
2
|
54 / 54 / 9
Регистрация: 24.09.2011
Сообщений: 149
|
||||||
19.02.2012, 18:32 [ТС] | 7 | |||||
Сам в шоке! Действительно так. Ладно попробую сделать везде печать и понаблюдать что происходит.
Тогда такой вопрос:
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
19.02.2012, 18:34 | 8 |
"Не верю!" (с)
Я бы ещё позволил одиночный символ присваивать.
0
|
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
|
|
19.02.2012, 18:36 | 9 |
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
19.02.2012, 18:37 | 10 |
go, не понял, это опровержение или подтверждение?
1
|
54 / 54 / 9
Регистрация: 24.09.2011
Сообщений: 149
|
|
19.02.2012, 18:40 [ТС] | 11 |
silent_1991, Спасибо за подробное объяснение!!!
Не по теме: Немножко мозги закипают. Раньше писал и не задумывался, например зачем по ссылке передавать в конструктор копирования и как то обходился)))
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
19.02.2012, 18:44 | 12 |
Merovingian, да, в С++ очень много подобных тонкостей. И, что странно, меньше их со временем не становится...
0
|
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
|
|
19.02.2012, 18:47 | 13 |
http://liveworkspace.org/code/... 7f946f606f
Что Вы здесь имели ввиду? Добавлено через 50 секунд obj operator= (const char *_s) ? Добавлено через 30 секунд Этого не заметил
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
||||||
19.02.2012, 18:49 | 14 | |||||
go,
Добавлено через 47 секунд Кстааати, я тоже не заметил. По ссылке передавать надо! Добавлено через 52 секунды А, ну ясно, просто опечатка. Не поэтому вызывается конструктор с параметром.
0
|
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
|
|
19.02.2012, 18:50 | 15 |
Как бы я не про то спрашивал. Вы правы.
В смысле? Сравните. http://liveworkspace.org/code/... 9f0d7f6996 http://liveworkspace.org/code/... 7f946f606f
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
19.02.2012, 18:53 | 16 |
go, конструктор вызывается не потому, что объект передаётся по значению (мне показалось, ты именно об этом говорил), а потому, что нет оператора присваивания, принимающего const char *.
0
|
go
|
19.02.2012, 18:54
Объясните про инициализацию
#17
|
2
|
19.02.2012, 18:54 | |
Объясните про наследование Популярно объясните про указатели Вопрос про инициализацию Скринсейвер, вопросы про первичную инициализацию параметров Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |