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

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

Войти
Регистрация
Восстановить пароль
 
murtukov
8 / 8 / 3
Регистрация: 30.01.2013
Сообщений: 99
#1

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

25.09.2013, 16:02. Просмотров 540. Ответов 11
Метки нет (Все метки)

Доброго времени суток всем присутствующим.
Интересует маленький вопрос. В 15-й строке происходит прямое обращение к полю входного объекта (a.data), хотя оно объявлено как private. Вопрос: почему это возможно? Потому-что оба объекты одного класса? Если да, то как сделать так, чтобы разные объекты не имели доступа в полям друг друга?

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
#include <iostream>
using namespace std;
///////////////////////////////////////////////////////////
class alpha
{
private:
    int data;
public:
    alpha() // 
    { }
    alpha(int d) // конструктор с одним аргументом
    { data = d; }
    alpha(alpha& a) // конструктор копирования
    {
    data = a.data;
    cout << "\nЗапущен конструктор копирования";
    }
    void display() // display
    { cout << data; }
    void operator=(alpha& a) // overloaded = operator
    {
    data = a.data;
    cout << "\nЗапущен оператор присваивания";
    }
};
///////////////////////////////////////////////////////////
int main()
{
    alpha a1(37);
    alpha a2;
    a2 = a1; // запуск перегружаемого =
    cout << "\na2 ="; a2.display(); // вывести a2
    alpha a3(a1); // запуск конструктора копирования
// alpha a3 = a1; // эквивалентное определение a3
    cout << "\na3 ="; a3.display(); // вывести a3
    cout << endl;
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.09.2013, 16:02     О конструкторе копирования
Посмотрите здесь:

Указатель this в конструкторе копирования - C++
Добрый всем вечер. Подскажите пожалуйста, как правильно применить в конструкторе копирования указатель this? Вот есть код. ...

Параметр в конструкторе копирования - C++
Есть класс class CMatrix{ valarray&lt;valarray&lt;double&gt; &gt; matrix; public: CMatrix(const CMatrix &amp;M); ..... }; ...

Ошибка в конструкторе копирования - C++
Здравствуйте. Есть один класс для работы с многочленами, который хранит элементы многочлена в списке. Так вот, в конструкторе копирования...

Ошибка в конструкторе копирования класса - C++
Хотя и делал по образцу, но почему то лезет ошибка записи за пределы динамического массива, хотя и переменные копируются верно (отладчик...

Зачем нужна ссылка в конструкторе копирования - C++
Вопрос такой, Зачем нужна ссылка в конструкторе копирования? Почему не передавать напр. по указателю?

Ссылка rvalue в конструкторе копирования и операторе присваивания - C++
Здравствуйте. Решил попробовать ссылки rvalue в классе. Привожу часть: \\BinaryArray.h class BinaryArray { protected: ...

Можно ли в конструкторе копирования поменять один параметр? - C++
Здравствуйте. Мне нужно при создании объекта через конструктор копирования поменять один параметр в конструкторе. Такое можно реализовать?

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
25.09.2013, 16:13     О конструкторе копирования #2
Цитата Сообщение от murtukov Посмотреть сообщение
Если да, то как сделать так, чтобы разные объекты не имели доступа в полям друг друга?
Да. А зачем такое понадобилось?
murtukov
8 / 8 / 3
Регистрация: 30.01.2013
Сообщений: 99
25.09.2013, 17:06  [ТС]     О конструкторе копирования #3
castaway,
Какая разница, зачем? В зависимости от моего ответа код будет различным?
ViktorKozlov
133 / 125 / 2
Регистрация: 13.12.2012
Сообщений: 293
25.09.2013, 17:11     О конструкторе копирования #4
Потому что private видны классу, к которому они относятся и друзьям этого класса.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
25.09.2013, 17:14     О конструкторе копирования #5
Цитата Сообщение от murtukov Посмотреть сообщение
Какая разница, зачем? В зависимости от моего ответа код будет различным?
Никакой. Мне просто было интересно зачем это может понадобится. А ответа в виде кода я не знаю, поэтому различных ответов не будет в любом случае.
murtukov
8 / 8 / 3
Регистрация: 30.01.2013
Сообщений: 99
25.09.2013, 17:54  [ТС]     О конструкторе копирования #6
В 24-й строке вылетает ошибка: no matching function for call to 'Person::Person(Person)'

Если вместо Person p = "Max" написать Person p("Max"), все начинает работать, хотя эти объявления эквиваленты (опираясь на информацию из книги Лафоре).

Вопрос: Почему не работает объявление Person p = "Max" ?

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
#include <iostream>
#include <cstring>
using namespace std;
///////////////////////////////////////////////////////////////////////////////
class Person
{
private:
    char *name;
public:
    Person(char const *n)
    {
        name = new char[strlen(n) + 1];
        strcpy(name, n);
    }
    Person(Person& n)
    {
        name = new char[strlen(n.name) + 1];
        strcpy(name, n.name);
    }
};
///////////////////////////////////////////////////////////////////////////////
int main()
{
    Person p = "Max";
 
    return 0;
}
KoGG
5258 / 1330 / 314
Регистрация: 23.12.2010
Сообщений: 2,014
Записей в блоге: 1
25.09.2013, 18:06     О конструкторе копирования #7
Потому, что может быть только
C++
1
2
Person p 
p.Person = "Max"
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
25.09.2013, 18:07     О конструкторе копирования #8
murtukov, 15 строку надо подправить:
C++
1
Person(const Person& n)
murtukov
8 / 8 / 3
Регистрация: 30.01.2013
Сообщений: 99
25.09.2013, 18:15  [ТС]     О конструкторе копирования #9
KoGG,

что за чушь, извините?
Цитата Сообщение от KoGG Посмотреть сообщение
p.Person = "Max"
Добавлено через 1 минуту
Tulosba,

А, все понял. Спасибо за дельный ответ.

Добавлено через 1 минуту
castaway,

Пока ни для чего не нужно, просто хочу знать на будущее. Вообще, знать нужно по возможности все)
Tulosba
25.09.2013, 18:20
  #10

Не по теме:

Цитата Сообщение от murtukov Посмотреть сообщение
Вообще, знать нужно по возможности все)
Ответ всё равно "42"

Croessmah
25.09.2013, 18:32
  #11

Не по теме:


Цитата Сообщение от Tulosba Посмотреть сообщение
Ответ всё равно "42"
Само собой ))) 52

Цитата Сообщение от murtukov Посмотреть сообщение
хотя эти объявления эквиваленты (опираясь на информацию из книги Лафоре).
Не совсем. Когда столкнетесь с explicit - увидите сами

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.09.2013, 18:46     О конструкторе копирования
Еще ссылки по теме:

Исправить ошибку в конструкторе копирования пользовательского класса Sort - C++
Здравствуйте. Такая вот проблема. Обычный конструктор работает без ошибок и подчеркиваний: Sort::Sort() { cout &lt;&lt; &quot;len = &quot;; ...

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

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

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

Исключения в конструкторе - C++
Допустим, при конструировании объекта необходимо выделить память для двух указателей-членов и правильно обработать все ошибки исключений....


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

Или воспользуйтесь поиском по форуму:
murtukov
8 / 8 / 3
Регистрация: 30.01.2013
Сообщений: 99
25.09.2013, 18:46  [ТС]     О конструкторе копирования #12
Tulosba,

"Автостопом по галактике" )
Yandex
Объявления
25.09.2013, 18:46     О конструкторе копирования
Ответ Создать тему
Опции темы

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