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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.67
LosAngeles
Заблокирован
#1

copy constructor operator= - C++

03.08.2011, 15:54. Просмотров 1957. Ответов 26

сижу я значит почитываю черновик будущего стандарта и вижу
C++
1
2
3
4
5
6
7
const C& C::operator=( const C& other) {
      if ( this != &other ) {
           this->~C();
           new (this) C(other);
      }
return *this;
}
оператор=, реализованный через конструктор копирования и написанный в две строчки. Я обычно сначала зачищал старое и присваивал новое ну как сказать почленно и не я один, а тут такая гениальная вроде конструкция. Поэтому я подумал, что тут наверняка есть подводный камень, но пока не могу сообразить какой именно? Там правда несколько ограничений из которых существенно наверно только это
the original object was a most derived object (1.8) of type T and the new object is a most derived
object of type T (that is, they are not base class subobjects).
то есть юзать можно?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.08.2011, 15:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос copy constructor operator= (C++):

this и Copy-Constructor - C++
Скажите пожалуйста почему даный еод вызывает RTE(Run Time Error) Добавлено через 1 минуту Engine engg(*this); Где this...

Copy constructor - C++
#include "stdafx.h" #include <iostream> using namespace::std; class alpha{ int data; public: alpha() {} alpha(int d) :...

Default copy constructor - C++
Что default copy constructor делает, из-за чего мой NRVO выводит разные адресса, если оставить его по умолчанию. А если переопределить...

что делает copy constructor? - C++
что делает copy constructor?

Copy-Constructor В Шаблонном Связном списке - C++
Скажіте пожалуйста где тут ошыбка? Добавлено через 49 секунд Ран тайм ерор кидает в копи конструкторе 100% вот код ...

Copy Constructor Question .Generic inheritance. Templates - C++
Допустим есть проект // // (---.Array_hpp---) // #ifndef Array_HPP // Preprocessor gates #define...

26
Kastaneda
Форумчанин
Эксперт С++
4656 / 2864 / 228
Регистрация: 12.12.2009
Сообщений: 7,276
Записей в блоге: 2
Завершенные тесты: 1
03.08.2011, 16:17 #2
Странно, в операторе присваивания вызывается конструктор. Ни в одной из прочитанных мною книг, не говорилось о подобной реализации

Добавлено через 41 секунду
Я так понял, речь об операторе, генерируемом по умолчанию?
0
silentnuke
Android Programmer
139 / 140 / 5
Регистрация: 08.12.2010
Сообщений: 421
03.08.2011, 16:41 #3
эх, когда-то реализовывал умный указатель, и как раз писал такую конструкцию, но компилятор меня обрубил, сказав что конструктор нельзя вызвать явно, пришлось обходить другими путями)
0
LosAngeles
Заблокирован
03.08.2011, 16:55  [ТС] #4
наверно ты что-то не так делал, потому что тут нету вобщем то ничего, что противоречит и 2003, или я по крайней мере не вижу что могло бы помешать компиляции...
Цитата Сообщение от Kastaneda Посмотреть сообщение
Странно, в операторе присваивания вызывается конструктор.
это можно и не только для placement new делать, с обычным new ведь тоже можно так делать?
C++
1
2
string p("yrtyrt");
string *ptr = new string(p);
0
silentnuke
Android Programmer
139 / 140 / 5
Регистрация: 08.12.2010
Сообщений: 421
03.08.2011, 17:04 #5
LosAngeles, ну я пытался явно через this вызывать, что не дало сделать.
0
Kastaneda
Форумчанин
Эксперт С++
4656 / 2864 / 228
Регистрация: 12.12.2009
Сообщений: 7,276
Записей в блоге: 2
Завершенные тесты: 1
03.08.2011, 17:04 #6
LosAngeles, да я не про это, там же запятая в предложении стоит)

Я про то, что странно, что внутри оператора присваивания вызывается конструктор.
0
OstapBender
583 / 522 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
03.08.2011, 17:06 #7
да и деструктор как-то не очень
может это псевдокод?
0
Kastaneda
03.08.2011, 17:07
  #8

Не по теме:

Цитата Сообщение от silentnuke Посмотреть сообщение
но компилятор меня обрубил, сказав что конструктор нельзя вызвать явно
Да, там (в первом посте) по хитрому сделано, надо будет взять этот прием на вооружение)

0
silentnuke
Android Programmer
139 / 140 / 5
Регистрация: 08.12.2010
Сообщений: 421
03.08.2011, 17:08 #9
Цитата Сообщение от Kastaneda Посмотреть сообщение
LosAngeles, да я не про это, там же запятая в предложении стоит)

Я про то, что странно, что внутри оператора присваивания вызывается конструктор.
ну как по мне, это удобнее, ведь копи конструктор, и присваивание по своей сути тоже самое.
вызвав копи конструктор, избавляемся от нужды написания по сути того же самого кода.)

Добавлено через 30 секунд
Цитата Сообщение от Kastaneda Посмотреть сообщение

Не по теме:


Да, там (в первом посте) по хитрому сделано, надо будет взять этот прием на вооружение)

угу, и я про это же)
0
Kastaneda
Форумчанин
Эксперт С++
4656 / 2864 / 228
Регистрация: 12.12.2009
Сообщений: 7,276
Записей в блоге: 2
Завершенные тесты: 1
03.08.2011, 17:11 #10
Цитата Сообщение от OstapBender Посмотреть сообщение
да и деструктор как-то не очень
может это псевдокод?
По поводу псевдокода, я так понял - это шутка)

А данная форма вызова деструктора, если верить Б.Эккелю ("Философия С++"), возможна только если память под объект была выделенна placement new.

Добавлено через 1 минуту
Цитата Сообщение от silentnuke Посмотреть сообщение
ведь копи конструктор, и присваивание по своей сути тоже самое.
По сути да, но концептуально это разные операции. А тут как то все вместе...
0
silentnuke
Android Programmer
139 / 140 / 5
Регистрация: 08.12.2010
Сообщений: 421
03.08.2011, 17:12 #11
Цитата Сообщение от Kastaneda Посмотреть сообщение
По поводу псевдокода, я так понял - это шутка)

А данная форма вызова деструктора, если верить Б.Эккелю ("Философия С++"), возможна только если память под объект была выделенна placement new.
как раз деструктор можно явно вызывать, пока не встречал случаев, где не получилось бы его явно вызвать)
0
OstapBender
583 / 522 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
03.08.2011, 17:15 #12
Цитата Сообщение от silentnuke Посмотреть сообщение
пока не встречал случаев, где не получилось бы его явно вызвать)
да, но зачем?

мне стыдно но я не знаю что такое placement new (( видимо когда перегружается оператор new или типа того
0
Kastaneda
Форумчанин
Эксперт С++
4656 / 2864 / 228
Регистрация: 12.12.2009
Сообщений: 7,276
Записей в блоге: 2
Завершенные тесты: 1
03.08.2011, 17:17 #13
Цитата Сообщение от silentnuke Посмотреть сообщение
как раз деструктор можно явно вызывать
Да, пардон, имелось ввиду - что явный вызов деструктора оправдан, только если ...(далее по тексту)
В общем не подумав написал) В данном коде явный вызов тоже оправдан, если считать разумным вызов деструктора в операторе =
0
silentnuke
Android Programmer
139 / 140 / 5
Регистрация: 08.12.2010
Сообщений: 421
03.08.2011, 17:18 #14
Цитата Сообщение от Kastaneda Посмотреть сообщение
По поводу псевдокода, я так понял - это шутка)

А данная форма вызова деструктора, если верить Б.Эккелю ("Философия С++"), возможна только если память под объект была выделенна placement new.

Добавлено через 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
        SM(const SM<T>& k)
    {
        _count=k._count;
        ++(*_count);
        _data=k._data;
    }
        ~SM()
    {
        --(*_count);
        if(!(*_count)){
            if(_data)
                delete _data;
            delete _count;
            _data=NULL;
            _count=NULL;
        }
    }
    SM<T> operator=(SM<T>& obj)
    {
        this->~SM();
        _count=obj._count;
                ++(*_count);
        _data=obj._data;
        return *this;
    }
вот примерный код, где хотел вызвать явно конструктор копирования)
если б тогда знал про эту фичу, не было бы никакого смысла дублировать код копирования.=)
пример довольно грубый, написанный на коленке)
0
Kastaneda
Форумчанин
Эксперт С++
4656 / 2864 / 228
Регистрация: 12.12.2009
Сообщений: 7,276
Записей в блоге: 2
Завершенные тесты: 1
03.08.2011, 17:21 #15
Цитата Сообщение от OstapBender Посмотреть сообщение
мне стыдно но я не знаю что такое placement new
C++
1
2
3
4
    int mas[10];
    int *ptr=new(mas) int;//вместо mas можно задать и число, если понимаешь, что делаешь)
    *ptr=10;
    std::cout<<mas<<" "<<ptr<<" "<<mas[0]<<" "<<*ptr<<std::endl;
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.08.2011, 17:21
Привет! Вот еще темы с ответами:

Deep copy and Shadow copy - C++
Этот проект компилируется нормально. И функциональность всех элементов на первый взгляд нормальная. ПРОБЛЕМА: Надо сделать нормально =...

Class & operator's |Error: undefined reference to operator - C++
Компилирует нормально, но когда хочу использовать оператор выдает ошибку:undefined reference to 'operator..(Fraction const&amp;, Fraction...

operator char() или operator int() - C++
Здорова госпдо! Снова ничо не ясно как всегда. Разбираю программку из книги Страуструпа, там он описывает класс String в нем есть ...

Вызов operator[] через operator[] const - C++
Перелистывал Майерса, наткнулся на код, подскажите пожалуйста почему он советует закомментированный вариант кода, не проще сделать как...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
03.08.2011, 17:21
Ответ Создать тему
Опции темы

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