![]() |
|
Модераторы: bsa |
![]()
|
|
| azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Да, это единственный вид спецификации исключений которые можно использовать, но это может повлиять на производительность программы, так как некоторые компиляторы могут не встраивать функции со спецификацией исключений.
|
||||
|
|||||
| Gordon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 459 Регистрация: 9.7.2006 Репутация: 1 Всего: 6 |
Делает, но с присваиванием более наглядно, хотя... -------------------- |
|||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
Это вызов лишней функции std::string::operator= (char*) Я ещё заменил все s = char + s на s += char, по тем же соображениям, так намного быстрее. ещё можно s.reserve(x) добавить после объявления переменной s. Это сообщение отредактировал(а) Леопольд - 25.7.2009, 10:33 -------------------- вопросов больше чем ответов |
|||
|
||||
| Gordon |
|
||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 459 Регистрация: 9.7.2006 Репутация: 1 Всего: 6 |
и
немного разные вещи... А так спасибо за замечания! Добавлено через 5 минут и 50 секунд Леопольд, а 100% будет вызыватья std::string::operator= (char*)? Добавлено через 11 минут и 12 секунд Допустим, такой класс:
потои я создаю объекты:
оба раза вызывается "A(int)", т.е. может там компилятор что-то вроде оптимизации проводит? p.s. с типом std::string так же, или нет? -------------------- |
||||||||||
|
|||||||||||
| Леопольд |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
Не за что Я бы даже сказал что это совсем разные вещи В одном случае вызывается встраиваемая функция для добавления в конец строки, которая, возможно, должна быть увеличена в размерах, но совсем не обязательно. Где-то отложилось в памяти что по умолчанию на любую строку выделяется что-то вроде 32 символов. В другом, конструируется новая копия строки, в которую помещается результат конкатенации символа и строки, причём всё в строке должно быть сдвинуто вправо. После этого эта копия присваивается аккумулирующей строке. Ещё есть бага в функции, связанная с тем что наименьшая система счисления двоичная. Эта бага может привести к бесконечному циклу, или делению на ноль Добавлено @ 10:59
Я ошибся! std::string s("init string"); Это сообщение отредактировал(а) Леопольд - 25.7.2009, 11:07 -------------------- вопросов больше чем ответов |
||||
|
|||||
| zim22 |
|
||||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
в первом случае вызывается конструктор преобразования A(int n). все конструкторы с одним параметром - конструкторы преобразования. во-втором случае вы явно вызываете конструктор с одним параметром. *** сделайте конструктор явным и увидите ошибку.
Это сообщение отредактировал(а) zim22 - 25.7.2009, 11:03 |
||||
|
|||||
| Леопольд |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
Это один и тот же конструктор, квалификатор explicit просто запрещает использовать его для неявных преобразований. Соответственно его нельзя будет вызвать таким синтаксисом type x = val;
Думаю, это уже достаточно веская причина для инициализации в скобках а не при помощи = Это сообщение отредактировал(а) Леопольд - 25.7.2009, 11:14 -------------------- вопросов больше чем ответов |
||||||
|
|||||||
| zim22 |
|
||||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
ну да. один и тот же. в-первом случае он вызывается неявно во-втором - явно.
это разные вещи.
Язык С++ поддерживает две формы инициализации переменных: инициализация копии( copy-initialization) и прямая инициализация(direct-initialization). различия между ними в том, что в случае инициализации копии больше накладных расходов. сначала создаётся временный объект, потом идёт присвоение результату. Кроме того прямая инициализация гибче, т.к. можно указать любое количество параметров конструктора. |
||||
|
|||||
| Леопольд |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
В обоих случаях выполняется один и тот же код. Если для инициализации нужен временный объект, то он будет создан в обоих случаях. Но вариант с = запрещён, если использовать explicit.
Это сообщение отредактировал(а) Леопольд - 25.7.2009, 11:25 -------------------- вопросов больше чем ответов |
||||||
|
|||||||
| Gordon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 459 Регистрация: 9.7.2006 Репутация: 1 Всего: 6 |
Ну это да! А explicit запрещает неявные вызовы конструктора. Мне интересно, может ли компилятор это - "int i = 10;", заменить int i(10); ? -------------------- |
|||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
Именно так он и сделает, если нет explicit. -------------------- вопросов больше чем ответов |
|||
|
||||
| Gordon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 459 Регистрация: 9.7.2006 Репутация: 1 Всего: 6 |
int i(10); // прямая инициализация int i = 10; // инициализация копии имеют одинаковую эффективность, так? -------------------- |
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
для встроенных типов данных - да. для классов - нет. для классов прямая инициализация быстрей. т.к. копия не создаётся. *** разрешён.
Это сообщение отредактировал(а) zim22 - 25.7.2009, 12:02 |
|||
|
||||
| Gordon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 459 Регистрация: 9.7.2006 Репутация: 1 Всего: 6 |
zim22, а чем эта копия потом присваивается объявляемому объекту, я пробовал operator = и конструктор копирования делать закрытыми, и все равно код работал... Это сообщение отредактировал(а) Gordon - 25.7.2009, 11:56 -------------------- |
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
|
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |