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

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

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

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

25.09.2013, 16:02. Просмотров 559. Ответов 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.09.2013, 16:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос О конструкторе копирования (C++):

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

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

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

Ошибка в конструкторе копирования C++ - C++
Помогите, пожалуйста создать конструктор копирования, который будет копировать элемент и добавлять его в список. У меня получился такой...

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

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

11
castaway
Эксперт С++
4915 / 3023 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
25.09.2013, 16:13 #2
Цитата Сообщение от murtukov Посмотреть сообщение
Если да, то как сделать так, чтобы разные объекты не имели доступа в полям друг друга?
Да. А зачем такое понадобилось?
1
murtukov
8 / 8 / 3
Регистрация: 30.01.2013
Сообщений: 99
25.09.2013, 17:06  [ТС] #3
castaway,
Какая разница, зачем? В зависимости от моего ответа код будет различным?
0
ViktorKozlov
133 / 125 / 2
Регистрация: 13.12.2012
Сообщений: 293
25.09.2013, 17:11 #4
Потому что private видны классу, к которому они относятся и друзьям этого класса.
1
castaway
Эксперт С++
4915 / 3023 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
25.09.2013, 17:14 #5
Цитата Сообщение от murtukov Посмотреть сообщение
Какая разница, зачем? В зависимости от моего ответа код будет различным?
Никакой. Мне просто было интересно зачем это может понадобится. А ответа в виде кода я не знаю, поэтому различных ответов не будет в любом случае.
0
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;
}
0
KoGG
5263 / 1336 / 314
Регистрация: 23.12.2010
Сообщений: 2,015
Записей в блоге: 1
25.09.2013, 18:06 #7
Потому, что может быть только
C++
1
2
Person p 
p.Person = "Max"
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
25.09.2013, 18:07 #8
murtukov, 15 строку надо подправить:
C++
1
Person(const Person& n)
1
murtukov
8 / 8 / 3
Регистрация: 30.01.2013
Сообщений: 99
25.09.2013, 18:15  [ТС] #9
KoGG,

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

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

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

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

Не по теме:

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

0
Croessmah
25.09.2013, 18:32
  #11

Не по теме:


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

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

0
murtukov
8 / 8 / 3
Регистрация: 30.01.2013
Сообщений: 99
25.09.2013, 18:46  [ТС] #12
Tulosba,

"Автостопом по галактике" )
0
25.09.2013, 18:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.09.2013, 18:46
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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