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

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

Восстановить пароль Регистрация
 
murtukov
 Аватар для murtukov
8 / 8 / 3
Регистрация: 30.01.2013
Сообщений: 99
25.09.2013, 16:02     О конструкторе копирования #1
Доброго времени суток всем присутствующим.
Интересует маленький вопрос. В 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
25.09.2013, 16:13     О конструкторе копирования #2
Цитата Сообщение от murtukov Посмотреть сообщение
Если да, то как сделать так, чтобы разные объекты не имели доступа в полям друг друга?
Да. А зачем такое понадобилось?
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
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
25.09.2013, 17:14     О конструкторе копирования #5
Цитата Сообщение от murtukov Посмотреть сообщение
Какая разница, зачем? В зависимости от моего ответа код будет различным?
Никакой. Мне просто было интересно зачем это может понадобится. А ответа в виде кода я не знаю, поэтому различных ответов не будет в любом случае.
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
Модератор
 Аватар для KoGG
5192 / 1264 / 295
Регистрация: 23.12.2010
Сообщений: 1,922
Записей в блоге: 1
25.09.2013, 18:06     О конструкторе копирования #7
Потому, что может быть только
C++
1
2
Person p 
p.Person = "Max"
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
25.09.2013, 18:07     О конструкторе копирования #8
murtukov, 15 строку надо подправить:
C++
1
Person(const Person& n)
murtukov
 Аватар для 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     О конструкторе копирования
Еще ссылки по теме:

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

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

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

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

Текущее время: 14:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru