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

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 99, средняя оценка - 4.74
Dragokas
Эксперт WindowsАвтор FAQ
16242 / 6941 / 834
Регистрация: 25.12.2011
Сообщений: 10,722
Записей в блоге: 16
#1

Десять возможностей C++11, которые должен использовать каждый C++ разработчик - C++

11.06.2013, 23:51. Просмотров 12334. Ответов 14
Метки нет (Все метки)

Обсуждаем статью: http://habrahabr.ru/post/182920/

Надо же этот раздел немного оживить
Я, естественно, не участвую. ^_^
14
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.06.2013, 23:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Десять возможностей C++11, которые должен использовать каждый C++ разработчик (C++):

Каждый второй элемент массива увеличить на десять - C++
Каждый второй элемент массива увеличить на десять Сделать через if Помогите пожалуйста Срочно

Каждый член натурального ряда от 10 до 20 уменьшить в десять раз. Подсчитать произведение - C++
Каждый член натурального ряда от 10 до 20 уменьшить в десять раз. Подсчитать произведение Добавлено через 1 час 36 минут ап ап ап ап

Какой суммарный путь пробежит спортсмен за 7 дней, увеличивая каждый день его на десять процентов? - C++
1.Начав тренировки, спортсмен в первый день пробежал 10 км. Каждый день он увеличивал дневную норму на 10% нормы предыдущего дня. Какой...

Какой суммарный путь пробежит спортсмен за 7 дней, увеличивая каждый день его на десять процентов? Перевести с паскаля. - C++
Начав тренировки, спортсмен в первый день пробежал 10 км. Каждый день он увеличивал дневную норму на 10% нормы предыдущего дня. Какой...

Создать программу, которая будет последовательно предлагать пользователю десять случайных примеров, проверяющих знание таблицы умножения (каждый из со - C++
Создать программу, которая будет последовательно предлагать пользователю десять случайных примеров, проверяющих знание таблицы умножения...

Определить сколько должен заплатить каждый пассажир такси - C++
В такси одновременно сели три пассажира. Когда вышел первый пассажир, на счетчике было p1 рублей; когда вышел второй - p2 рублей. Сколько...

14
ForEveR
В астрале
Эксперт С++
7988 / 4747 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
12.06.2013, 00:30 #2
Dragokas, А что обсуждать?) Все четко. Действительно ОК возможности нового стандарта
0
Dragokas
Эксперт WindowsАвтор FAQ
16242 / 6941 / 834
Регистрация: 25.12.2011
Сообщений: 10,722
Записей в блоге: 16
12.06.2013, 00:43  [ТС] #3
Да, собственно, хотел, чтобы многие могли ознакомится со статьей.
Более подходящего места не нашел.
0
Tulosba
:)
Эксперт С++
4619 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.06.2013, 20:41 #4
Почитал статью. В целом толковый поверхностный обзор. Не понял почему в "copy assignment operator" автор использует:
C++
1
if(this != &copy)
а в "move assignment operator":
C++
1
assert(this != &temp);
0
ForEveR
В астрале
Эксперт С++
7988 / 4747 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
13.06.2013, 09:22 #5
Tulosba, Я так понимаю, потому что move подразумевает порчу перемещаемого объекта (к примеру для указателей установка в nullptr).
Итого, если мы муваем объект в сам себя - мы просто делаем объект не валидным, ничего с этого не имея.
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
 
template<typename T>
class Pointer
{
public:
   Pointer() : pointer_(nullptr)
   {
   }
   Pointer(T* ptr) : pointer_(ptr)
   {
   }
   ~Pointer()
   {
      delete pointer_;
   }
   Pointer(Pointer&& rhs) : pointer_(rhs.pointer_)
   {
      rhs.pointer_ = nullptr;
   }
   Pointer& operator = (Pointer&& rhs)
   {
      std::swap(rhs.pointer_, pointer_);
      rhs.pointer_ = nullptr;
      return *this;
   }
   explicit operator bool() { return pointer_; }
private:
   Pointer(const Pointer&) = delete;
   Pointer& operator = (const Pointer&) = delete;
 
   T* pointer_;
};
 
int main()
{
   Pointer<int> ptr(new int(1));
   std::cout << "Is valid: " << static_cast<bool>(ptr) << std::endl;
   ptr = std::move(ptr);
   std::cout << "Is valid: " << static_cast<bool>(ptr) << std::endl;
}
1
Tulosba
:)
Эксперт С++
4619 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
13.06.2013, 12:54 #6
ForEveR, по-моему, мы немного о разных вещах говорим. Мне не очень понятно, в каком случае
this == &temp. Если temp это rvalue, то он должен быть уникальным.

И, кстати, тут же будет утечка памяти:
C++
1
2
3
4
5
Pointer& operator = (Pointer&& rhs)
{
   std::swap(rhs.pointer_, pointer_);
   rhs.pointer_ = nullptr; // Потеряли память, которую держал this
}
2
ForEveR
В астрале
Эксперт С++
7988 / 4747 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
13.06.2013, 14:24 #7
Tulosba, Утечка только в случае, если мы муваем один объект в себя же.
rhs это lvalue. И его адрес будет равен this. rvalue станет только при раскладе, что мы юзаем forward/move.

C++
1
2
3
4
5
6
7
8
   Pointer& operator = (Pointer&& rhs)
   {
      assert((this != &rhs) && "Invalid move operation");
      std::swap(rhs.pointer_, pointer_);
      rhs.pointer_ = nullptr;
   }
 
   ptr = std::move(ptr);
ассерт сработает.

Добавлено через 5 минут
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
28
29
#include <iostream>
 
class C
{
public:
   C() {}
   C(C&& rhs)
   {
      std::cout << "Move" << std::endl;
   }
   C(const C& rhs)
   {
      std::cout << "Copy" << std::endl;
   }
};
 
class D
{
public:
   D(C&& c_) : c(c_) {}
private:
   C c;
};
 
int main()
{
   C c;
   D d(std::move(c)); 
}
Вывод будет Copy
C++
1
D(C&& c_) : c(std::move(c_)) {}
Вывод будет Move.
0
Tulosba
:)
Эксперт С++
4619 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
13.06.2013, 14:30 #8
Цитата Сообщение от ForEveR Посмотреть сообщение
Утечка только в случае, если мы муваем один объект в себя же.
Так ведь до обнуления rhs.pointer_ (5 строка) надо ж освободить память (деструктор ведь потом ничего не сделает, т.к. указатель сброшен).
Цитата Сообщение от ForEveR Посмотреть сообщение
что мы юзаем forward/move.
это что за зверь?
И всё-таки почему тогда assert? В релизе же проверки не будет.
1
ForEveR
В астрале
Эксперт С++
7988 / 4747 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
13.06.2013, 14:33 #9
Tulosba, Зачем, если мы свапаем указатель и получаем новый объект? При нормальном раскладе утечки не будет (свопнули, установили прошлый в nullptr, объект который мы переместили теперь не валиден, в который переместили - валиден, при выходе из области видимости данного объекта будет вызван деструктор, который все и почистит). Вероятно, заюзан ассерт, потому что это просто пример. Ну про std::forward/std::move полагаю проще почитать, чем объяснять тут.

Вот тут: http://stackoverflow.com/questions/3106110/what-are-move-semantics можно почитать. Довольно здраво написано. В частности второй ответ.
1
Tulosba
:)
Эксперт С++
4619 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
13.06.2013, 14:59 #10
Цитата Сообщение от ForEveR Посмотреть сообщение
Зачем, если мы свапаем указатель и получаем новый объект?
Возможно проще будет рассмотреть std::unique_ptr, т.к. задачи схожие (взял из VS 2012):
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
_Myt& operator=(_Myt&& _Right) _NOEXCEPT
    {   // assign by moving _Right
    if (this != &_Right)
        {   // different, do the move
        reset(_Right.release());
        this->get_deleter() = _STD forward<_Dx>(_Right.get_deleter());
        }
    return (*this);
    }
 
pointer release() _NOEXCEPT
    {   // yield ownership of pointer
    pointer _Ans = this->_Myptr;
    this->_Myptr = pointer();
    return (_Ans);
    }
 
void reset(pointer _Ptr = pointer()) _NOEXCEPT
    {   // establish new pointer
    if (_Ptr != this->_Myptr)
        {   // different pointer, delete old and reassign
        _Delete();
        this->_Myptr = _Ptr;
        }
    }
Я вот как раз хочу сказать о _Delete() внутри reset. Которого в классе Pointer я собственно не наблюдаю.

Добавлено через 29 секунд
Цитата Сообщение от ForEveR Посмотреть сообщение
Ну про std::forward/std::move полагаю проще почитать, чем объяснять
окей
2
ForEveR
В астрале
Эксперт С++
7988 / 4747 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
13.06.2013, 15:06 #11
Tulosba, Да, согласен, нужно там конечно удалить this->pointer_. Протормозил, не понял, о чем ты говоришь.

Добавлено через 1 минуту
Так будет ок.
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
 
template<typename T>
class Pointer
{
public:
   Pointer() : pointer_(nullptr)
   {
   }
   Pointer(T* ptr) : pointer_(ptr)
   {
   }
   ~Pointer()
   {
      delete pointer_;
   }
   Pointer(Pointer&& rhs) : pointer_(rhs.pointer_)
   {
      rhs.pointer_ = nullptr;
   }
   Pointer& operator = (Pointer&& rhs)
   {
      delete pointer_;
      std::swap(rhs.pointer_, pointer_);
      rhs.pointer_ = nullptr;
      return *this;
   }
   explicit operator bool() { return pointer_; }
private:
   Pointer(const Pointer&) = delete;
   Pointer& operator = (const Pointer&) = delete;
 
   T* pointer_;
};
 
int main()
{
   Pointer<int> ptr(new int(1));
   std::cout << "Is valid: " << static_cast<bool>(ptr) << std::endl;
   ptr = std::move(ptr);
   std::cout << "Is valid: " << static_cast<bool>(ptr) << std::endl;
}
0
Tulosba
:)
Эксперт С++
4619 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
13.06.2013, 15:07 #12
ForEveR, уф. Ну ладно, хоть разобрались
0
Kastaneda
Jesus loves me
Эксперт С++
4728 / 2932 / 242
Регистрация: 12.12.2009
Сообщений: 7,442
Записей в блоге: 2
Завершенные тесты: 1
30.06.2013, 16:52 #13
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
А вот сегодня появился небольшой обзор новых возможностей С++14. Дабы не плодить подобные темы, оставлю ссылку здесь.

Не по теме:

Понравился комент на хабре

С такими темпами компилятор С++ скоро осознает себя и начнёт захватывать мир.

8
ForEveR
В астрале
Эксперт С++
7988 / 4747 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
30.06.2013, 18:36 #14
@Kastaneda, Читал про данные возможности в разнобой (на isocpp.org/stackoverflow), а вот то, что на хабре выложили все обобщенно - это круто. Большое спасибо за ссылку!
0
Jupiter
Каратель
Эксперт С++
6566 / 3987 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
15.07.2013, 13:34 #15
http://stackoverflow.com/questions/1...s-for-this-for

имхо - попахивает overengineering
0
15.07.2013, 13:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.07.2013, 13:34
Привет! Вот еще темы с ответами:

Каждый созданный экземпляр класса должен увеличивать значение счетчика на 1 - C++
Каждый созданный экземпляр класса должен увеличивать значение счетчика(статического члена класса) на 1. Не понимаю, почему возникает...

Реализовать систему плагинов (модулей), каждый из которых должен работать в отдельном потоке - C++
Всем доброго времени суток, не могли бы вы мне помочь реализовать систему плагинов( модулей). Необходимо что бы: - каждый плагин...

Почему для сборки драйверов разработчик не должен использовать компилятор и линкер из Visual Studio? - Программирование драйверов
Здравствуйте! Задавал вопрос на другой ветке форума (http://www.cyberforum.ru/visual-studio/thread1903578.html) но задам и здесь .В...

каждый нечетный элемент списка умножить на 2, каждый четный на 3. использовать только рекурсию CAR,CDR,COND,CONS - Lisp
каждый нечетный элемент списка умножить на 2, каждый четный на 3. использовать только рекурсию CAR,CDR,COND,CONS


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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