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

Почему все экземпляры класса в векторе имеют абсолютно одни и те же характеристики? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Постройте таблицу значений функции y=f(x) для х принадлежит [a, b] с шагом h http://www.cyberforum.ru/cpp-beginners/thread1133064.html
Постройте таблицу значений функции y=f(x) для хϵ с шагом h. Помогите с кодом.
C++ Функция, которая получает два параметра и возвращает результат деления первого параметра на второй Тут такая задача: написать функцию, которая получает два параметра тип unsigned short int и возвращает результат деления первого параметра на второй. Функция не должна выполнять операцию деления, если второе число равно 0, но в этом случае она должна возвратить значение - 1. Я попробовал реализовать так: #include <iostream> short int Divider( unsigned short int ValOne, ... http://www.cyberforum.ru/cpp-beginners/thread1133060.html
C++ Написать функцию, сдвигающую влево свой аргумент
Привет! Делаю задачи по книге, не могу понять как решить следующую. "Создайте перегружаемую функцию rotate(), которая циклический сдвигает влево свой аргумент и возвращает результат. Перегрузите её так, чтобы она работала с целыми и длинными целыми. (Сдвиг по кольцу аналогичен обычному сдвигу, за исключением того, что выдвигаемый с одного конца слова бит появляется на другом конце)" Хотя бы...
C++ Получение данных из командной строки
#include<iostream> using std::cout;using std::endl; int main(int argc, char *argv){ cout<<"argc="<<argc<<endl; for (int i=0; i<argc; ++i) { cout<<argv<<endl; } return 0; } Данный код приведен в учебнике но не компилируется. Это одна из тем в которой я почти не чего не понял, прошу помощи.
C++ Класс Строка http://www.cyberforum.ru/cpp-beginners/thread1133033.html
Составить описание класса для работы со списками строк (строки произвольной длины), с операциями -включения в список, -удаления из списка элемента с заданным значением данного, -удаления всего списка или конца списка, начиная с заданного элемента. Заранее спасибо.
C++ Возможность существования треугольника по сторонам Определить возможность существования треугольника по сторонам. Треугольник существует только тогда, когда сумма любых двух его сторон больше третьей. Дано: a, b, c – стороны предполагаемого треугольника. Требуется сравнить длину каждого отрезка с суммой двух других. Если хотя бы в одном случае отрезок окажется больше суммы двух других, то треугольника с такими сторонами не существует. ... подробнее

Показать сообщение отдельно
Tulosba
:)
Эксперт С++
4387 / 3230 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
30.03.2014, 21:26     Почему все экземпляры класса в векторе имеют абсолютно одни и те же характеристики?
Всё дело в используемой версии стандарта.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <vector>
 
struct S
{
    S() { std::cout << i++ << std::endl; }
    static int i;
// private:
    S( const S& ) { std::cout << "copy" << std::endl; }
};
 
int S::i = 0;
 
int main() {
    
    std::vector<S> s(10);
    return 0;
}
В варианте C++03 конструктор вектора с целым аргументом осуществляет создание объекта конструктором объекта по умолчанию и потом копирует его заданное кол-во раз.
http://coliru.stacked-crooked.com/a/f7a27b9202d52c59

Если копирующий конструктор сделать недоступным, то будет ошибка компиляции.
http://coliru.stacked-crooked.com/a/2c8d613ac75764bf

В варианте C++11 копирующий конструктор не требуется, т.к. каждый раз вызывается конструктор объекта по умолчанию.
http://coliru.stacked-crooked.com/a/503e0f6b090375c4

Добавлено через 15 минут
Различие поведения вытекает из-за того, что в C++03 конструктор заполнения имеет только одну сигнатуру:
C++
1
explicit vector (size_type n, const value_type& val = value_type(), const allocator_type& alloc = allocator_type());
И внутри осуществляется копирование n раз объекта val, который по умолчанию создается конструктором объекта по умолчанию (малость тавтологично звучит )
В то время как в C++11 уже существует два варианта:
C++
1
2
explicit vector (size_type n);
         vector (size_type n, const value_type& val, const allocator_type& alloc = allocator_type());
Первый - создает n объектов путем вызова n раз конструктора по умолчанию.
Второй - копирует объект val n раз, но в этот раз параметр уже не имеет значения по умолчанию и должен передаваться явно.
 
Текущее время: 20:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru