Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
4 / 4 / 2
Регистрация: 01.12.2015
Сообщений: 36

Почему я могу легально получить доступ к private полю у ссылочного типа на класс?

02.03.2019, 01:26. Показов 1896. Ответов 5

Студворк — интернет-сервис помощи студентам
Здравствуйте, я недавно решила написать длинную арифметику по памяти (годовой давности) и как можно быстрее. В итоге, я получила такой код:
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
39
40
41
42
43
44
45
46
47
48
49
50
class BigInt {
private:
    vector<int> d;
    const int base = 1e9;
 
public:
    // Get i-th digit starting from the right
    int operator[](size_t i) const {
        return i >= d.size() ? 0 : d[i];
    }
 
    // Return the length of the number
    size_t size() const {
        return d.size();
    }
 
    // Sum implementation
    BigInt & operator+=(const BigInt &b) {
        // Resize d to the size of b to guarantee that index-wise
        // digits can be directly sum up
        if (size() < b.size())
            d.resize(b.size(), 0);
 
        int carry = 0;
        for (size_t i = 0; i < size(); i++) {
            int res = d[i] + b[i] + carry;
            carry = res / base; // Detect overflow
            res %= base;
            d[i] = res;
        }
 
        if (carry)
            d.pb(carry);
 
        return *this;
    }
 
    // Plus operator wrapping
    friend BigInt operator+(BigInt a, const BigInt & b) {
        a += b;
        return a;
    }
 
    // Resize d and copy the contents of b to d
    BigInt & operator=(const BigInt & b) {
        d.resize(b.size());
        copy(b.d.begin(), b.d.end(), d.begin());
        return *this;
    }
};
Так вот, меня интересует конкретно эта строчка:

C++
1
copy(b.d.begin(), b.d.end(), d.begin());
d ведь объявлен в private секции класса, но почему тогда я могу получить к нему доступ из вне, то биж из opeator=? Может быть, потому что b типа BigInt&? Хотя, как по мне, это было бы странно...

Простите, если это глупенький вопрос и я упускаю что-то очеидное, но мне правда очень интересно. Я не очень знакома с ООП частью C++, поэтому мне было бы приятно узнать, в любом случае, о нём что-то новое.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.03.2019, 01:26
Ответы с готовыми решениями:

Получить доступ к private полю объекта
Возможно я не правильно поставил свой вопрос но вопрос в следующем. Там где реализация метода poly_calc () я пытаюсь через указатель на...

Не могу получить доступ к private данным через дружественную функцию
Заголовочный файл: class Vector { private: int * vect; int size; public: Vector(); explicit Vector(int size1); ...

Доступ к private полю родителя из наследника
Здравствуйте! Изучаю Java, столкнулся с таким вопросом: Допустим, в родительском классе есть private-поле и private-метод. Вопрос: есть...

5
Мозгоправ
 Аватар для L0M
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
02.03.2019, 01:37
Лучший ответ Сообщение было отмечено SupremeEP как решение

Решение

Цитата Сообщение от SupremeEP Посмотреть сообщение
d ведь объявлен в private секции класса, но почему тогда я могу получить к нему доступ из вне, то биж из opeator=
Тормозите. Дико тормозите. opeator= у вас член класса. Поэтому все члены и методы класса в нём доступны. И передаваемый аргумент является также членом этого же класса. Так что никаких чудес.
1
4 / 4 / 2
Регистрация: 01.12.2015
Сообщений: 36
02.03.2019, 02:44  [ТС]
Цитата Сообщение от L0M Посмотреть сообщение
Тормозите. Дико тормозите. opeator= у вас член класса. Поэтому все члены и методы класса в нём доступны. И передаваемый аргумент является также членом этого же класса. Так что никаких чудес.
Ни фига себе! Я никогда об этом даже не задумывалась! Я думала, что методы класса могут получать доступ ко всем полям только для конкретного экземпляра. То есть, я бы думала, что
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <cstdio>
using namespace std;
 
class A {
public:
    A(int n) : n(n) {}
    
    int sum (A b) {
        return n + b.n;
    }
 
private:
    int n;
};
 
int main() {
    A a(5), b(6);
    printf("%d\n", a.sum(b));
    return 0;
}
не скомпилируется, хах, ведь экземляр класса A a попытается получить доступ к приватному полю экземпляра b, что, по идее, нарушает инкапсуляцию.

Но вы правы. Когда я прочитала ваш пост, до меня долго не могло дойти. Думаю, эта строчка из википедии расставила всё на места (мне в голове):
... Under this definition, encapsulation means that the internal representation of an object is generally hidden from view outside of the object's definition. Typically, only the object's own methods can directly inspect or manipulate its fields...
То есть не важно, что за экземляр; важно то, что эта функция -- есть член этого класса, по определению. А значит у неё есть полномочия для получения доступа ко всем его полям.

Спасибо большое! Поняла
1
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
02.03.2019, 09:53
Цитата Сообщение от SupremeEP Посмотреть сообщение
ведь экземляр класса A a попытается получить доступ к приватному полю экземпляра b, что, по идее, нарушает инкапсуляцию.
Наоборот, это правильно.
Вы водите машину?! Так вот, представьте себе что первый класс - это механик, а второй класс - это Вы, водитель.
Первый класс (механик) знает что в машине есть двигатель, второй класс - водитель, об этом не знает и просто управляет автомобилем. Когда вы приезжаете на ремонт, не важно к какому механику (экземпляр) приехали, все они знают, что у машины есть двигатель
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
02.03.2019, 10:00
Цитата Сообщение от SupremeEP Посмотреть сообщение
Я думала, что методы класса могут получать доступ ко всем полям только для конкретного экземпляра.
В некоторых ООП языка так и работает, это инкапсуляция на уровне объекта, в С++ инкапсуляция на уровне класса.
2
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
02.03.2019, 10:44
SupremeEP,
Цитата Сообщение от SupremeEP Посмотреть сообщение
Ни фига себе! Я никогда об этом даже не задумывалась!
Не вы одна. Но вы одна из не многих кто задал такой вопрос. А вопрос стоит того, чтобы снять шляпу. Как минимум.
Ведь везде в литературе говорится о том, что доступ к приватным полям имеет объект и функции и классы объявленные друзьями. Различие лишь в том, что методы объекта используют скрытый this, а друзья не могут этого сделать и потому вынуждены использовать объект как получаемый аргумент.
Но поскольку объекты класса имеют доступ к полям объектов этого же класса, остаётся сделать вывод, что каждый класс - сам себе друг. В принципе, это логично.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.03.2019, 10:44
Помогаю со студенческими работами здесь

Может ли метод вложенного типа иметь доступ к private полям внешнего типа
A) Да, если метод вложенного типа имеет модификатор public B) Да, если вложенный тип имеет модификатор public C) Нет D) Да

Получить доступ к полю типа "Дата"
Всем привет. Есть 2 вопроса: 1) &lt;input id=&quot;birthday&quot; name=&quot;birthday&quot; type=&quot;date&quot; onkeyup=&quot;checkText('birthday', '7')&quot;&gt; ...

Добавить массив объектов ссылочного типа в класс
Задан у меня какой-то класс P. Задаю новый класс R, в нем массив объектов класса Р. class R { private P pl; int c; ...

Не могу получить доступ к экземплярам класс в case
Доброго времени суток. Имеется вопрос. Почему я не могу использовать созданные экземпляры класса?; соответственно не могу и воспользоваться...

Почему оператор lock() предназначен для принятия параметров только ссылочного типа?
Почему оператор lock() предназначет для принятия параметров только ссылочного типа?


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru