Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Можно ли защититься от пабитного копирования? 
:(
    Опции темы
Dims
Дата 21.10.2009, 19:18 (ссылка)  | (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 1
Всего: 11



Если в классе определён конструктор по ссылке и оператор присваивания, гарантирует ли это от того, что объекты этого класса НИКОГДА не будут копироваться побитово, то есть, в обход этих операторов?
PM MAIL   Вверх
zim22
Дата 21.10.2009, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(Dims @  21.10.2009,  19:18 Найти цитируемый пост)
Если в классе определён конструктор по ссылке и оператор присваивания,

чтобы взять копирование объекта в свои руки, нужно переопределить
1) конструктор копирования
2) оператор присвоения

по-умолчанию, компилятор генерирует их так, что они копируют побитово.


--------------------
PM MAIL   Вверх
Alek86
Дата 21.10.2009, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



zim22, и все равно от memcpy это не спасет smile


--------------------
user posted image    user posted image
PM MAIL   Вверх
UnrealMan
Дата 21.10.2009, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(zim22 @  21.10.2009,  20:29 Найти цитируемый пост)
чтобы взять копирование объекта в свои руки, нужно переопределить

Что в твоём понимании значит "переопределить"? smile

Цитата(zim22 @  21.10.2009,  20:29 Найти цитируемый пост)
по-умолчанию, компилятор генерирует их так, что они копируют побитово. 

Т.е., по-твоему, следующая программа "1" должна вывести? smile 

Код
#include <iostream>

struct A
{
    A() {}
    A(const A&) : n(2) {}
    int n;
};

struct B
{
    A a;
};

int main()
{
    B b1;
    b1.a.n = 1;
    B b2 = b1;
    std::cout << b2.a.n << '\n';
}

PM MAIL   Вверх
niXman
Дата 21.10.2009, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 4.7.2009

Репутация: 0
Всего: 0



Цитата(UnrealMan @  21.10.2009,  18:56 Найти цитируемый пост)
B b2 = b1;

Здесь неявный вызов конструктора копирования.

Добавлено через 22 секунды
Т.е.
Код

B b2(b1);

--------------------
if ( !c++ ) {   *power--;   this->wussiness += 10;}
PM MAIL   Вверх
UnrealMan
Дата 21.10.2009, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(niXman @  21.10.2009,  21:00 Найти цитируемый пост)
Здесь неявный вызов конструктора копирования. 

С его слов следует, что представление B должно копироваться побитово.
PM MAIL   Вверх
niXman
Дата 21.10.2009, 21:02 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 4.7.2009

Репутация: 0
Всего: 0



Еще
Код

return 0;

забыл.

Добавлено через 1 минуту и 20 секунд
Цитата(UnrealMan @  21.10.2009,  19:01 Найти цитируемый пост)
С его слов следует, что представление B должно копироваться побитово. 

Так и есть, если написать так:
Код

#include <iostream>
struct A
{
    A() {}
    A(const A&) : n(2) {}
    int n;
};
struct B
{
    A a;
};
int main()
{
    B b1;
    b1.a.n = 1;
    B b2;
    b2 = b1;
    std::cout << b2.a.n << '\n';

    return 0;
}

--------------------
if ( !c++ ) {   *power--;   this->wussiness += 10;}
PM MAIL   Вверх
UnrealMan
Дата 21.10.2009, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(niXman @ 21.10.2009,  21:02)
Еще
Код

return 0;

забыл.

Кто и где? smile 
PM MAIL   Вверх
niXman
Дата 21.10.2009, 21:05 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 4.7.2009

Репутация: 0
Всего: 0



UnrealMan, Ты. В функции int main()
--------------------
if ( !c++ ) {   *power--;   this->wussiness += 10;}
PM MAIL   Вверх
UnrealMan
Дата 21.10.2009, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(niXman @  21.10.2009,  21:02 Найти цитируемый пост)
Так и есть, если написать так

А если б да кабы, выросли б во рту грибы.

Цитата(niXman @  21.10.2009,  21:05 Найти цитируемый пост)
Ты. В функции int main() 

А зачем оно там? smile 

PM MAIL   Вверх
Dims
Дата 21.10.2009, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 1
Всего: 11



Ясно, что от memcpy не спасёт. Мне больше интересно, не возникает ли побитовое копирование в каких-то частных случаях.

Например, есть класс A, в котором есть конструктор по ссылке и оператор присваивания. Допустим, есть ещё класс B, в котором ничего этого нет, но есть член типа A. 

Что будет при присваивании B к B? Член типа A как скопируется?
PM MAIL   Вверх
Alek86
Дата 21.10.2009, 21:17 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



UnrealMan, зачем демагогию устраивать?
конструтор копирования B копирует свою часть класса (которой типа нету) побитово и вызывает конструктор копирования A, который уже не по-умолчанию.
смысл придираться?


--------------------
user posted image    user posted image
PM MAIL   Вверх
niXman
Дата 21.10.2009, 21:20 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 4.7.2009

Репутация: 0
Всего: 0



Цитата(Dims @  21.10.2009,  19:16 Найти цитируемый пост)
класс A, в котором есть конструктор по ссылке

Это называется конструктор копирования.

UnrealMan, Не нужно путать инициализацию и присваивание.
--------------------
if ( !c++ ) {   *power--;   this->wussiness += 10;}
PM MAIL   Вверх
Alek86
Дата 21.10.2009, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(Dims @  21.10.2009,  21:16 Найти цитируемый пост)
Что будет при присваивании B к B? Член типа A как скопируется?

в твое случае член типа A скопируется c помощью своего оператора присваивания
если переопределить operator= и конструктор копирования, то побитово класс уже копироваться не будет
если хотят сделать класс некопируемым, то часто просто запихивают обе эти функции в приват (ну, или наследуют от boost::noncopyable)


--------------------
user posted image    user posted image
PM MAIL   Вверх
zim22
Дата 21.10.2009, 21:36 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(niXman @  21.10.2009,  21:20 Найти цитируемый пост)
UnrealMan, Не нужно путать инициализацию и присваивание.

я думаю небо с землёй поменяются местами, когда UnrealMan начнёт путать инициализацию и присваивание. smile
Цитата(Alek86 @  21.10.2009,  21:17 Найти цитируемый пост)
смысл придираться?

смысл есть. я вот открыл Стандарт и вычитал, что члены копируются не побитово, а почленно. 
Цитата

12.8.8
The implicitly-defined copy constructor for class X performs a memberwise copy of its subobjects.  
...
 Each subobject is copied in the manner appropriate to its type:
—  if the subobject is of class type, the copy constructor for the class is used;
—  if the subobject is an array, each element is copied, in the manner appropriate to the element type;
—  if the subobject is of scalar type, the built-in assignment operator is used


Цитата(UnrealMan @  21.10.2009,  20:56 Найти цитируемый пост)
Что в твоём понимании значит "переопределить"?

define. declare. 
короче говоря, объявить функцию, которая имеет следующий вид:
Код

ИмяКласса(const ИмяКласса&);


Цитата(UnrealMan @  21.10.2009,  20:56 Найти цитируемый пост)
zim22: (по-умолчанию, компилятор генерирует их так, что они копируют побитово.) 
>Т.е., по-твоему, следующая программа "1" должна вывести? 

нет. 2 выведет, т.к. в иерархии наследования если в производном классе не определён конструктор копирования, то используется его версия из базового класса. 


Это сообщение отредактировал(а) zim22 - 21.10.2009, 21:42


--------------------
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0968 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.