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

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

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

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

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

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

Класс как стандартный контейнер - C++
Здорова господа! Опять есть условие задачи: Напишите такие классы, чтобы Vector из 16.2.1 и Vector из 16.2.2 могли использоваться как...

Приватный конструктор и стандартный контейнер. Два барана на мосту - C++
Всем суп! Итак, банальная вещь - в заголовке - не желает компилироваться. Суть, немного упрощённая, такова: class AAA { private: ...

Векторный калькулятор на классах - C++
Привет всем. Преподаватель дал задание, написать векторный калькулятор на классах. На массивах в консоли я сделал для 4 операций, но как...

Перевести обычный массив в векторный - C++
#include <iostream> #include <stdlib.h> #include <math.h> #include <time.h> using namespace std; int main() { int min =...

дана матрица А(5,5). Получить векторный столбец, элементы которого являются наибольшими по модулю элементов исходной матрицы - C++
дана матрица А(5,5). Получить векторный столбец, элементы которого являются наибольшими по модулю элементов исходной матрицы

Двумерный динамический массив (Получить векторный столбец, элементы которого являются наименьшим по модулю столбцов исходной матрицы) - C++
Подскажите, что делаю не так. Задание такое: Дана матрица A(n,m). Получить векторный столбец, элементы которого являются наименьшим по...

Перевести на стандартный С++ - C++
class TActivator; typedef void (__closure *TTriggerProc)(TActivator *Sender); struct TRecepient{ TTriggerProc OnProc; ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
13057 / 7320 / 817
Регистрация: 27.09.2012
Сообщений: 18,066
Записей в блоге: 3
Завершенные тесты: 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Эксперт С++
13057 / 7320 / 817
Регистрация: 27.09.2012
Сообщений: 18,066
Записей в блоге: 3
Завершенные тесты: 1
14.08.2013, 17:27     Стандартный векторный контейнер #4
Цитата Сообщение от Erjay Посмотреть сообщение
То есть, все таки, можно будет?
http://ideone.com/0MedUY
Цитата Сообщение от Erjay Посмотреть сообщение
Обычно элементы создаются с помощью оператора new() и освобождаются с помощью оператора delete()
не факт!
Mr.X
Эксперт С++
3048 / 1693 / 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
Эксперт С++
7122 / 5299 / 273
Регистрация: 10.12.2010
Сообщений: 23,449
Записей в блоге: 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
Комп_Оратор)
Эксперт по математике/физике
6444 / 3083 / 306
Регистрация: 04.12.2011
Сообщений: 8,494
Записей в блоге: 4
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++
Добрый день, помогите разобраться. Хочу написать функцию, которая читает из входного потока некое количество данных вида...

Стандартный класс complex. - C++
1)Есть ли стандартный не шаблонный класс complex? Я нашел только шаблонный класс, определенный в заголовочном файле &lt;complex&gt; Есть ли...

Стандартный jpg компрессор - C++
Здравствуйте уважаемые форумчане! Пишу приложение (winform) для расчета и визуализации 3d объектов код в принципе создан навожу...

Стандартный поток ввода - C++
В условии задачи написано: на стандартном потоке ввода задаётся последовательность целых чисел. Вся эта последовательность завершается...

Стандартный поток ввода - C++
Доброго времени суток. Допустим есть код: double d; cin &gt;&gt; d; Допустим, в потоке ввода символы &quot;12.e&quot;, поток...


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

Или воспользуйтесь поиском по форуму:
Avazart
Эксперт С++
7122 / 5299 / 273
Регистрация: 10.12.2010
Сообщений: 23,449
Записей в блоге: 17
14.08.2013, 18:36     Стандартный векторный контейнер #8
Цитата Сообщение от Erjay Посмотреть сообщение
Вопрос: почему для использования стандартного векторного контейнера необходимо явно определять стандартный конструктор класса?
Для того что бы в дальнейшем не думать откуда ошибки лезут...

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

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