Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
10 / 10 / 5
Регистрация: 30.01.2013
Сообщений: 99
1

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

25.09.2013, 16:02. Просмотров 728. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.09.2013, 16:02
Ответы с готовыми решениями:

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

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

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

Ошибка в конструкторе копирования
Всем привет, не могу понять проблему, у меня есть структура: struct WindowRender : public...

11
Эксперт С++
4964 / 3070 / 456
Регистрация: 10.11.2010
Сообщений: 11,159
Записей в блоге: 10
25.09.2013, 16:13 2
Цитата Сообщение от murtukov Посмотреть сообщение
Если да, то как сделать так, чтобы разные объекты не имели доступа в полям друг друга?
Да. А зачем такое понадобилось?
1
10 / 10 / 5
Регистрация: 30.01.2013
Сообщений: 99
25.09.2013, 17:06  [ТС] 3
castaway,
Какая разница, зачем? В зависимости от моего ответа код будет различным?
0
136 / 128 / 59
Регистрация: 13.12.2012
Сообщений: 293
25.09.2013, 17:11 4
Потому что private видны классу, к которому они относятся и друзьям этого класса.
1
Эксперт С++
4964 / 3070 / 456
Регистрация: 10.11.2010
Сообщений: 11,159
Записей в блоге: 10
25.09.2013, 17:14 5
Цитата Сообщение от murtukov Посмотреть сообщение
Какая разница, зачем? В зависимости от моего ответа код будет различным?
Никакой. Мне просто было интересно зачем это может понадобится. А ответа в виде кода я не знаю, поэтому различных ответов не будет в любом случае.
0
10 / 10 / 5
Регистрация: 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
5340 / 1405 / 331
Регистрация: 23.12.2010
Сообщений: 2,078
Записей в блоге: 1
25.09.2013, 18:06 7
Потому, что может быть только
C++
1
2
Person p 
p.Person = "Max"
0
:)
Эксперт С++
4763 / 3257 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
25.09.2013, 18:07 8
murtukov, 15 строку надо подправить:
C++
1
Person(const Person& n)
1
10 / 10 / 5
Регистрация: 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" :D

0
Croessmah
25.09.2013, 18:32
  #11

Не по теме:


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

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

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

"Автостопом по галактике" )
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.09.2013, 18:46

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

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

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