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

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

Войти
Регистрация
Восстановить пароль
 
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
#1

Конструктор копий. Оператор присваивания - C++

04.09.2012, 14:42. Просмотров 775. Ответов 11
Метки нет (Все метки)

В классе есть массив char (не динамический) размером 40 байт.
Вопрос1: нужно ли для такого класса определять конструктор копий или перегружать оператор присваивания или вполне подойдёт конструктор копий и оператор присваивания по умолчанию???
Вопрос2:Если в объект вышеописанного класса присвоить другому объекту того же класса, то верно ли, что при этом адрес массива в обоих объектах будет одинаковым или они будут ссылаться на разные участки памяти?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.09.2012, 14:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Конструктор копий. Оператор присваивания (C++):

Создать конструктор копий и оператор присваивания для класса компьютер и члена класса марка - C++
Создать конструктор копий и оператор присваивания для класса компьютер и члена класса марка. Всем огромное спасибо за помощь! |

Для шаблонного класса перегрузить оператор присваивания, copy-конструктор, объекты cin и cout, оператор * - C++
Помогите в следующем: Для класса шаблона следует перегрузить оператор присваивания, конструктор копирования, бинарный оператор суммы «*»,...

Конструктор копий и перегруженный оператор копирования - C++
Привет! Изучил конструктор копий и перегруженный оператор копирования. Но не могу понять зачем в одном классе реализовывать и конструктор...

Конструктор копирования и оператор присваивания - C++
Не понимаю, когда используется один, а когда другой. Написал простой пример с комплексными числами - при компиляции в VS2010 и CodeBlock 10...

Оператор присваивания через конструктор - C++
Здравствуйте! Насколько плохо (или совсем не плохо) реализовывать операторы присваивания через соответствующие конструкторы с помощью...

Перемещающий конструктор и оператор перемещающего присваивания - C++
Правильно у меня написаны перемещающий конструктор и оператор присваивания? И исправьте ошибку в операторе "ссылка rvalue не может быть...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
04.09.2012, 14:46 #2
bgm313, 1) Подойдут.
2) На разные.
1
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
04.09.2012, 14:58  [ТС] #3
Цитата Сообщение от ForEveR Посмотреть сообщение
1) Подойдут.
2) На разные.
Можете объяснить почему так. По моим представлениям массив это константный указатель, а оператор присваивание просто адрес одного массива присваивает другому.
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
04.09.2012, 14:59 #4
bgm313, Это массив, а не указатель. Делается копирование элементов массива.
1
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
04.09.2012, 15:04  [ТС] #5
Массив это разме не тоже самое, что, например, char * const val?
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
04.09.2012, 15:05 #6
bgm313, Очевидно нет. Массив не является указателем. Он может приводиться к указателю, но сам является массивом.
0
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
04.09.2012, 15:10  [ТС] #7
Цитата Сообщение от ForEveR Посмотреть сообщение
bgm313, Очевидно нет. Массив не является указателем. Он может приводиться к указателю, но сам является массивом.
А чем они отличаются вы можете сказать? Такому указателю, который я описал выше необходимо присвоить алрес при объявлении, который далее нельзя изменять.
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
04.09.2012, 15:14 #8
bgm313, Я даже не могу объяснить чем отличаются абсолютно разные сущности... Ну как бэ... Чем отличается пиво и чипсы? Вырезка из стандарта про массивы.

In a declaration T D where D has the form
D1 [ constant-expressionopt ] attribute-specifier-seqopt
and the type of the identifier in the declaration T D1 is “derived-declarator-type-list T”, then the type
of the identifier of D is an array type; if the type of the identifier of D contains the auto type-specifier, the
program is ill-formed. T is called the array element type; this type shall not be a reference type, the (possibly
cv-qualified) type void, a function type or an abstract class type. If the constant-expression (5.19) is present,
it shall be an integral constant expression and its value shall be greater than zero. The constant expression
specifies the bound of (number of elements in) the array. If the value of the constant expression is N, the array
has N elements numbered 0 to N-1, and the type of the identifier of D is “derived-declarator-type-list array of N
T”. An object of array type contains a contiguously allocated non-empty set of N subobjects of type T. Except
as noted below, if the constant expression is omitted, the type of the identifier of D is “derived-declarator-type-
list array of unknown bound of T”, an incomplete object type. The type “derived-declarator-type-list array of
N T” is a different type from the type “derived-declarator-type-list array of unknown bound of T”, see 3.9. Any
type of the form “cv-qualifier-seq array of N T” is adjusted to “array of N cv-qualifier-seq T”, and similarly for
“array of unknown bound of T”. The optional attribute-specifier-seq appertains to the array.
Ну и про указатели.

In a declaration T D where D has the form attribute-specifier-seqopt cv-qualifier-seqopt D1
and the type of the identifier in the declaration T D1 is “derived-declarator-type-list T,” then the type of
the identifier of D is “derived-declarator-type-list cv-qualifier-seq pointer to T.” The cv-qualifiers apply to the
pointer and not to the object pointed to. Similarly, the optional attribute-specifier-seq (7.6.1) appertains to
the pointer and not to the object pointed to.
1
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
04.09.2012, 15:19  [ТС] #9
Цитата Сообщение от ForEveR Посмотреть сообщение
Я даже не могу объяснить чем отличаются абсолютно разные сущности.
Я немного подумал) Вот смотрите, если массив объявлен допустим из 40 элементов, то компилятор гарантировано не отдаст ни одну из этих ячеек памяти на стеке кому-то другому. Но, если мы имеем констатный указатель, то любая из ячеек на, который он указывает, если она не занята, может быть кому-то отдана. Может быть этим?
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
04.09.2012, 15:26 #10
Но, если мы имеем констатный указатель, то любая из ячеек на, который он указывает, если она не занята, может быть кому-то отдана
Смысла фразы не понял абсолютно.
0
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
04.09.2012, 16:01  [ТС] #11
Допустим в программе объявляется переменная. И если у нас есть константный указатель, то программа
может разместить эту переменную, например, в том месте, куда ссылается указатель. А если у нас есть массив из 40 элементов, то cpp гарантировано, не разместит эту переменную, ни в одной из этих ячеек.
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
08.09.2012, 21:54 #12
bgm313, если указатель не инициализирован, то он и указывает непонятно куда. Там может оказаться всё, что угодно, и эта память вообще может оказаться не принадлежащей вашей программе. Если же указатель указывает на выделенный по правилам блок памяти, то этот блок наверняка никто другой уже забрать и использовать не сможет, как и в случае с массивом.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.09.2012, 21:54
Привет! Вот еще темы с ответами:

Про конструктор копирования, оператор присваивания - C++
Объясните, пожалуйста, принцип действия конструктора копирования и операции присваивания. На что указывает указатель this в этих функциях?...

Очередь, конструктор копирования и перегруженный оператор присваивания - C++
#include <iostream> using namespace std; typedef char type; struct Node { type element; Node *pNext; };

Конструктор копирования и оператор присваивания - общая часть, выделять ли в отдельный метод - C++
Как лучше? // конструктор копирования Fraction::Fraction( const Fraction& rhs ) { // инициализируем данными параметра функции и...

Ребят, уже запарился, гляньте, что не так!? конструктор копирования и оператор присваивания - C++
#include <iostream> using namespace std; struct SNode { SNode*next; int val; SNode(){} SNode(SNode*...


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

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

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