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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 84, средняя оценка - 4.76
Drus
57 / 57 / 1
Регистрация: 07.10.2011
Сообщений: 203
#1

Двоеточие в конструкторе, что это? - C++

02.11.2011, 14:39. Просмотров 11310. Ответов 23
Метки нет (Все метки)

Пример - конкретно из книги дейтела, вопрос вызывает двоеточие после конструктора, если оно позвляет производить инициализацию - то почему не делать бы этого в теле. Было бы очень хорошо если бы кто-нибудь ткнул носом в мануал по возможным вариантам использования этой вундервафли.
C++
1
String::String( const char *s):length( ( s != 0) ? strlen(2) : 0){/*...*/}
Поиском по форуму не нашел, если было - прошу понять, простить (с)
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.11.2011, 14:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Двоеточие в конструкторе, что это? (C++):

Двоеточие в конструкторе - C++
class A { public: A(): }; Что означает двоеточие и что туда надо писать?

Синтаксис С++. Двоеточие в конструкторе - C++
struct busy_head { size_t size; busy_head(size_t size) : size(size) { }; // Как понимать двоеточие?????????? Заранее...

Поясните пожалуйста что означает двоеточие и то что идет после него - C++
В 4 строчке после параметра в скобочках нету ";" или же тела функции, что не сходится с моим шаблоном в голове. Поясните пожалуйста что...

Что это за знак >> прочитал что это сдвиг вправо? что он делает - C++
int d=6, c=5,f; f = d >> c; cout<< f; вывод 0

Что означает двоеточие в наследовании конструктора? - C++
При изучении ООП в рамках языка c++ столкнулся с интересной формой обьявления конструктора объекта: classname(int A, int B, int C) :...

Что означает двойное двоеточие в коде - C++
Что в с++ значит вот это ::

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Jupiter
02.11.2011, 16:57     Двоеточие в конструкторе, что это?
  #16

Не по теме:

Цитата Сообщение от Bers Посмотреть сообщение
Простите... может быть я путаюсь в понятиях, но я всегда думал, что агрегат - это класс, который содержит агрегируемые элементы.
очень может быть что в терминах запутался и я

0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
02.11.2011, 18:19 #17
Цитата Сообщение от ForEveR Посмотреть сообщение
ерез список инициализация происходит шустрее. + к тому константные данные можно инициализировать только через список.
ну и ссылки тоже:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class inc
{
    int& i_ref;
    int val;
public:
    inc(int& i, int v = 1);
    void operator () ();
};
 
inc::inc(int& i, int v)
    : i_ref(i), val(v)
{
    // i_ref = _i; -- ошибка
}
 
void inc::operator () ()
{
    i_ref += val;
}
 
int main()
{
    int i = -1;
    inc add_1(i);
    add_1();
    return i;
}
0
Сыроежка
Заблокирован
02.11.2011, 18:39 #18
Цитата Сообщение от Bers Посмотреть сообщение
Так об этом и речь!

Инициализация объекта - суть инициализация всех его данных-членов. Но не просто инициализация, а ещё и настройка.

Если инициализировать данные-члены в списках инициализации, то объект-хозяин проинициализируется быстрее.

/зы Простите... может быть я путаюсь в понятиях, но я всегда думал, что агрегат - это класс, который содержит агрегируемые элементы.

Ну то есть агрегат - это большая шняга, которая состоит из маленьких элементов.
А как по научному называются элементы из которых состоит агрегат, я что-то даже и не вспомню)
Не просвятите?
На мой взгляд, то, что вы говорите, является глупостью. Во-первых, внутри тела конструктора происходит не инициализация, а присваивание. То есть если вы имеете член класса, который в свою очередь имеет тип класса, то внутри тела конструктора вызывается оператор присваивания для данного члена класса. То есть сначала объект создается с помощью конструктора по умолчанию (если иное не было указано в списке инициализации), а затем для этого объекта вызывается оператор присваивания operator =.
То есть семантически выполняются совершенно разные вещи. Так что сравнивать их бессмысленно!
0
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
02.11.2011, 18:42 #19
Сыроежка, если operator= реализован по copy-swap, то имеет смысл. Хотя в этом случае всё затянется ещё на более длительное время.
0
Bers
Заблокирован
02.11.2011, 18:55 #20
Цитата Сообщение от Сыроежка Посмотреть сообщение
На мой взгляд, то, что вы говорите, является глупостью. Во-первых,
Там выше мини-тесты, которые прекрасно все отображают.
0
Сыроежка
Заблокирован
02.11.2011, 19:23 #21
Цитата Сообщение от Bers Посмотреть сообщение
Там выше мини-тесты, которые прекрасно все отображают.
Работать прекрасно может многое. Я говорю о бессмысленности такого сравнения, так как имеется разная семантика двух операций.
0
Bers
Заблокирован
02.11.2011, 19:37 #22
Цитата Сообщение от Сыроежка Посмотреть сообщение
Работать прекрасно может многое. Я говорю о бессмысленности такого сравнения, так как имеется разная семантика двух операций.
Инициализация объекта, который сначала конструирует свои члены по дефолту, а потом в своем конструкторе запускает для них оператор= выполняется дольше, чем аналогичная инициализация, но при которой члены сразу инициализируются нужными значениями.
0
Сыроежка
Заблокирован
02.11.2011, 19:41 #23
Цитата Сообщение от Bers Посмотреть сообщение
Инициализация объекта, который сначала конструирует свои члены по дефолту, а потом в своем конструкторе запускает для них оператор= выполняется дольше, чем аналогичная инициализация, но при которой члены сразу инициализируются нужными значениями.
Я это вам и втолковывая, что это очевидно без всяких тестов! Вы выполняете совершенно разные операции, так как какой смысл тестов?!!
0
Bers
Заблокирован
02.11.2011, 19:55 #24
Цитата Сообщение от Сыроежка Посмотреть сообщение
Я это вам и втолковывая, что это очевидно без всяких тестов! Вы выполняете совершенно разные операции, так как какой смысл тестов?!!
То есть, вы мне втолковываете то, что я сам втолковывал другим?

Ну то есть, я говорю:

- яблоко падает на землю.
А вы мне возражаете:

- Речи твои глупы! Яблоко ПАДАЕТ НА ЗЕМЛЮ!!!

Большое спасибо за то, что пытались убедить меня в том, в чем я и сам искренне был убежден.

Смыл тестов сейчас объясню.

int A=10; //здесь запустится конструктор, или оператор= ?

На самом деле, в момент инициализации переменной значок '=' запускает конструктор. Эта запись эквивалентна другой: int A(10);
(вот это не очевидная ситуация для многих новичков).

А вот когда объект уже построен, то значок "равно" запускает оператор=, а не конструктор.

Смысл мини-тестов - показать:

1. Что когда запускается тело конструктора класса, все его данные-члены уже сконструированы, и поэтому, там запустится оператор=, а не конструктор.

2. Что списки инициализации - единственное место, где можно инициализировать данные-члены явными конструкторами.

3. Что есть случаи, когда единственный смысл привести данные-члены в нужное состояние - только списки инициализации.
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.11.2011, 19:55
Привет! Вот еще темы с ответами:

Для чего нужен оператор двоеточие, если два двоеточия - это оператор расширения области видимости - C++
для чего нужен оператор двоеточие ( : ), если два двоеточия( :: ) - это оператор расширения области видимости.

Что означает двойное двоеточие в vector<int>::iterator it ? - C++
Никак не могу понять как взаимоувязаны две сущности: контейнеры и итераторы. vector&lt;int&gt;::iterator it; Если бы это было...

Нужно произвести считывание пути к файлу с клавиатуры. Причём сделать это в конструкторе. Всё остальное корректно работает. - C++
Заранее благодарен всем кто поможет. Здравстуйте, была полностью рабочая программа которая считывает данные с файла, потом сортирует...

Не пойму что делает : в конструкторе - C++
не пойму что делает : в конструкторе.заранее спасибо за ответ. Year(int x):y(x){ if (x&lt;min || x&gt;max) throw Invalid();} Year(int...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
02.11.2011, 19:55
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru