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

Использование placement-new в перегруженном операторе присваивания - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Определение PPID для текущего процесса http://www.cyberforum.ru/cpp/thread1456270.html
Ребята Help!!! я должен написать программу для текущего значени ppid,pid для родителей и ребёнка,а сам в с++ ваще не шарю. Буду очень рад если поможете. Спасибо)))
C++ Поменять стандарт ISO C99 на ISO C90 На домашнем компьютере (mac) компилирую программы в терминале через gcc, стандарт языка там ISO C99, однако в универе на компах ISO C90, поэтому многие программы, работающие дома, не работают в... http://www.cyberforum.ru/cpp/thread1455829.html
C++ Вывод текста не экран с помощью DrawText (DirectX)
Здравствуйте, проблема такая: пытаюсь вывести текст на экран, если я пишу вот так pFont->DrawText(NULL, L"Все работает", -1, &rc, DT_NOCLIP, D3DCOLOR_XRGB(255, 55, 48)); то все работает. Если же я...
C++ Доработать код обработчки TIFF-изображений
Есть программа. Она открывает тифф файл, читает теги, строит гистограмму цветов и отсекает справа и лева по 5%, предоставляет эти цвета для bmp (250) , далее производит прореживание с заданным...
C++ Переделать из Borland C++ в Visual C++ http://www.cyberforum.ru/cpp/thread1454939.html
Здравствуйте. Очень нужна помощь. В университете задали задание переделать программу, написанную на Borland C++ в Visual C++. Не очень понятно, как его, это задание, выполнять, так как Borland-a мы...
C++ Организовать контроль времени работы программного обеспечения Организовать контроль времени работы программного обеспечения. Исходные параметры: текущее системное время в момент запуска программы и в момент ее закрытия. Перед закрытием программа должна... подробнее

Показать сообщение отдельно
FraidZZ
Ex-Member
3898 / 1524 / 229
Регистрация: 06.01.2013
Сообщений: 4,050
Завершенные тесты: 1

Использование placement-new в перегруженном операторе присваивания - C++

25.05.2015, 00:01. Просмотров 429. Ответов 9
Метки (Все метки)

Всем хей.

Допустим, у меня определён конструктор копирования для класса T. Теперь я хочу перегрузить для T оператор присваивания и, чтобы не повторять код (DRY всё же), делаю так:

C++
1
2
3
4
5
T& operator = (const T& ref) {
  if (this != &ref)
     new(this) T(ref);
  return *this;
}
В целом - схема работает. Но мне хотелось бы узнать подводные камни.
Беглый осмотр в данном виде их не нашёл, утечек вроде не возникает, всё тишь да гладь...

Но не покидает ощущение, что так можно неплохо настрелять себе в ногу.
Подопытный кролик
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
43
44
45
46
47
48
49
50
51
52
#include <iostream>
 
class T {
    int *arr;
    size_t sz;
public:
    T( int st, int _sz) : sz(_sz), arr(new int[_sz]) {
        for (int i = 0; i < sz; ++i) arr[i] = i + st;
    }
    
    T(const T& ref) : sz(ref.sz), arr(new int[ref.sz]) {
        for (int i = 0; i < sz; ++i) arr[i] = ref.arr[i];
    }
    
    T( ) : sz(0), arr(nullptr) { }
    
    T& operator = (const T& ref) {
        if (this != &ref)       
            new(this) T(ref);
        return *this;
    }
    
    void print( ) {
        for (size_t i = 0; i < sz; ++i) std::cout << arr[i] << ' ';
        std::cout << std::endl;
    }
    
    ~T( ) {
        for (size_t i = 0; i < sz; ++i) arr[i] = 0;
        delete[] arr;
    }
};
 
int main ( ) {
    while (1) {
        T a(20, 30);
        T b(a);
        T c;
        c = b;
        T d;
        {
            T f(15, 10);
            d = f;
        }
        
        a.print();
        b.print();
        c.print();
        d.print();
    }
    return 0;
}


Естественно, реь идёт о тех случаях, когда от конструктора копирования и оператора присваивания требуется единообразное поведение.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru