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

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

Войти
Регистрация
Восстановить пароль
 
Erjay
0 / 0 / 0
Регистрация: 03.08.2013
Сообщений: 91
#1

Стандартный векторный контейнер - C++

14.08.2013, 17:09. Просмотров 446. Ответов 7
Метки нет (Все метки)

"Обычно элементы создаются с помощью оператора new() и освобождаются с помощью оператора delete(), т.е. для создания нового элемента вызывается стандартный конструктор класса Т. Это служит еще одним аргументом в пользу явного определения стандартного конструктора в создаваемых классах. Если этого не сделать, то нельзя будет использовать стандартный векторный контейнер для хранения объектов пользовательского класса"
Вопрос: почему для использования стандартного векторного контейнера необходимо явно определять стандартный конструктор класса? Ведь, стандартный конструктор класса, даже, если мы его не определили, он все равно создается компилятором.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.08.2013, 17:09     Стандартный векторный контейнер
Посмотрите здесь:

C++ Стандартный класс complex.
C++ контейнер
C++ дана матрица А(5,5). Получить векторный столбец, элементы которого являются наибольшими по модулю элементов исходной матрицы
Двумерный динамический массив (Получить векторный столбец, элементы которого являются наименьшим по модулю столбцов исходной матрицы) C++
Класс как стандартный контейнер C++
C++ Приватный конструктор и стандартный контейнер. Два барана на мосту
C++ Стандартный входной поток
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12508 / 7070 / 794
Регистрация: 27.09.2012
Сообщений: 17,454
Записей в блоге: 2
Завершенные тесты: 1
14.08.2013, 17:15     Стандартный векторный контейнер #2
Цитата Сообщение от Erjay Посмотреть сообщение
Ведь, стандартный конструктор класса, даже, если мы его не определили, он все равно создается компилятором.
Если только нет других конструкторов
Цитата Сообщение от Erjay Посмотреть сообщение
Если этого не сделать, то нельзя будет использовать стандартный векторный контейнер для хранения объектов пользовательского класса"
Почему?
Erjay
0 / 0 / 0
Регистрация: 03.08.2013
Сообщений: 91
14.08.2013, 17:18  [ТС]     Стандартный векторный контейнер #3
Croessmah,
Цитата Сообщение от Croessmah Посмотреть сообщение
Почему?
То есть, все таки, можно будет?! Это, кстати, из книги Либерти.
Croessmah
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12508 / 7070 / 794
Регистрация: 27.09.2012
Сообщений: 17,454
Записей в блоге: 2
Завершенные тесты: 1
14.08.2013, 17:27     Стандартный векторный контейнер #4
Цитата Сообщение от Erjay Посмотреть сообщение
То есть, все таки, можно будет?
http://ideone.com/0MedUY
Цитата Сообщение от Erjay Посмотреть сообщение
Обычно элементы создаются с помощью оператора new() и освобождаются с помощью оператора delete()
не факт!
Mr.X
Эксперт С++
 Аватар для Mr.X
3020 / 1676 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
14.08.2013, 18:07     Стандартный векторный контейнер #5
Цитата Сообщение от Croessmah Посмотреть сообщение
Почему?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <vector>
 
class A
{
public:
   A(int x_)
       :x(x_)
   {}
 
private:
   int x ;
} ;
 
int main()
{
   std::vector<A>   vec(5);
}
Avazart
 Аватар для Avazart
7037 / 5214 / 259
Регистрация: 10.12.2010
Сообщений: 22,900
Записей в блоге: 17
14.08.2013, 18:25     Стандартный векторный контейнер #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <vector>
 
class A
{
public:
   A(int x_)
       :x(x_)
   {}
 
private:
   int x ;
} ;
 
int main()
{
   std::vector<A> vec(5,4); // size=5, val=4;
}
C++
1
2
explicit vector (size_type n, const value_type& val = value_type(),
                 const allocator_type& alloc = allocator_type());
http://www.cplusplus.com/reference/v...vector/vector/
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6346 / 2993 / 294
Регистрация: 04.12.2011
Сообщений: 8,027
Записей в блоге: 3
14.08.2013, 18:31     Стандартный векторный контейнер #7
Erjay, у шаблона вектор много конструкторов и не обязательно требовать наличие конструктора по умолчанию. Тему проще понять на примере инициализации динамического массива.
Дело в том, что при выделении памяти под переменную одиночного значения, язык предоставляет возможность сразу его инициализировать необходимым значением:
C++
1
int *b = new int(123);//выделение и инициализация. Для динамических массивов это невозможно.
но нет возможности так поступить с массивом. Нельзя написать, что-то похожее на:
C++
1
int *c = new int[]({1, 2, 3});  //было бы удобно но ничего подобного нет)
Возможна, например запись:
C++
1
int *c = new int[3];
которая не в состоянии принять каких либо значений для инициализации, она только выделяет память. Для int например, эта память вообще не инициализируется и содержит мусор.
Зато если есть конструктор по умолчанию (от компилятора или определённый явно, неважно), то компилятор знает что ему делать видя запись:
C++
1
MyClass *d = new MyClass[3];
Оператор выделения памяти трижды вызовет конструктор по умолчанию.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.08.2013, 18:36     Стандартный векторный контейнер
Еще ссылки по теме:

C++ Стандартный jpg компрессор
C++ Векторный калькулятор на классах
C++ Стандартный поток ввода
Перевести на стандартный С++ C++
C++ Стандартный поток ввода

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

Или воспользуйтесь поиском по форуму:
Avazart
 Аватар для Avazart
7037 / 5214 / 259
Регистрация: 10.12.2010
Сообщений: 22,900
Записей в блоге: 17
14.08.2013, 18:36     Стандартный векторный контейнер #8
Цитата Сообщение от Erjay Посмотреть сообщение
Вопрос: почему для использования стандартного векторного контейнера необходимо явно определять стандартный конструктор класса?
Для того что бы в дальнейшем не думать откуда ошибки лезут...

Если конструируешь класс то нужно предусмотреть стандартный, полный и понятный интерфейс для другого программиста...
Если "конструкция" изначально специфическая то естественно чего-то может не быть или работать не стандартно, в том числе какого-то конструктора может не быть...
Yandex
Объявления
14.08.2013, 18:36     Стандартный векторный контейнер
Ответ Создать тему
Опции темы

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