Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Это как С++ такое может быть.  (Прочитано 6457 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Boriska
Помогающий

ua
Offline Offline

« : 24-09-2021 10:49 » 

Либерти С за 21 день. стр 164 https://ibb.co/K5sNsvm
Они - объекты, они же изолированы, каждый имеет свое и только функции общие...
« Последнее редактирование: 24-09-2021 11:45 от Boriska » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 24-09-2021 12:52 » 

Не понятно, какая связь между цитатой из книги и Си.

По цитате: вообще написано нечто недостаточно ясное. Я так понял: Cat::some_method(Cat &other) { ... other.itsAge ... }. Да, так можно. Код не различает "свой" объект и "чужой".
« Последнее редактирование: 24-09-2021 12:57 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Boriska
Помогающий

ua
Offline Offline

« Ответ #2 : 24-09-2021 13:37 » 

А как же пресловутая фраза, что методы объекта предназначены для работы с членами-полями объекта. А они значит могут вывести нутро другого, такого же ? А где про это можно глянуть, чтоб понять, почему так.
« Последнее редактирование: 24-09-2021 13:59 от Boriska » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 24-09-2021 15:29 » 

Я так понял, что тут говорится примерно про такой случай
Код: (C++)
#include <iostream>
#include <string>

class Cat {
public:
    Cat(const std::string& Name, int Age) {
        name = Name;
        itsAge = Age;
    }
   
    Cat(const Cat& obj) {
        name = obj.name;
        itsAge = obj.itsAge;
    }
   
    void print() {
        std::cout << "Cat name is " << name << " and  " << itsAge
                  << " years old" << std::endl;
    }
private:
    std::string name;
    int itsAge;

};


int main() {
    Cat Fresske("Freeske", 5);
    Cat Boots(Fresske);
    Boots.print();
    return 0;
}
А почитать например про конструктор копирования. Или почитать на переопределение различных операторов. В принципе для этого это нужно.
« Последнее редактирование: 24-09-2021 15:37 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 24-09-2021 22:42 » 

Код для класса один. Объектов может быть сколько угодно. Скрывать поля объекта своего класса только потому что он не this? А смысл?
Дело не только в копировании. Любой метод, например сравнение, может иметь доступ к приватным членам другого объекта своего класса. Если, конечно, у него есть указать или ссылка на него. Ну или копия.
Код: (C++)
class X {
        int v;
    public:
        X(int v) : v(v) {}
        bool operator< (const X& other) { return v < other.v; }
};
« Последнее редактирование: 24-09-2021 22:44 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Boriska
Помогающий

ua
Offline Offline

« Ответ #5 : 30-09-2021 04:34 » 

Цитата
А почитать например про конструктор копирования. Или почитать на переопределение различных операторов.
Ну если это оставлено специально для целей копирования или перегрузки операторов, почему оставлено и для всех остальных случаев. Это же можно было бы как-то урезать ? И потом оговорить это в литературе. А так как-то в период изучения конструкторов как-то не обращаешь на эту особенность внимания, а потом возникают вопросы.
Да как по мне, страдает концепция защиты полей или стройность. Это создание бэк доров Улыбаюсь
Код:
void steal_secret(const Cat& otherCat) { secret = otherCat.secret; }
« Последнее редактирование: 30-09-2021 04:41 от Boriska » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 30-09-2021 20:01 » 

"В литературе" все оговорено. Скока там? 1857 страниц?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 01-10-2021 03:29 » 

Boriska, выдача копий или ссылок на константы наружу из класса не нарушают целостность класса, поэтому это можно свободно делать (с многопоточностью, правда, немного сложнее)

а чтобы случайно не "портить" поля класса в тех методах, где это не должно произойти, сам метод можно пометить как const
Записан

Boriska
Помогающий

ua
Offline Offline

« Ответ #8 : 01-10-2021 09:14 » 

Цитата
"В литературе" все оговорено. Скока там? 1857 страниц?
"Литературу" скачал.  Как в ней ориентироваться, ну к примеру с нашим случаем ?
Литература гласит http://ibb.co/q0nC365 только друзья и мемберы.
Нет я понимаю, что доступ есть, как это найти ?
« Последнее редактирование: 01-10-2021 10:25 от Boriska » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 01-10-2021 12:53 » 

Код класса имеет доступ к мемберам и методам согласно простым правилам, описанным во всех самоучителях и справочниках.
Для кода класса нет своих и чужих объектов. Если имеется от "чужого" объекта своего класса значение, ссылка или указатель, имеет те же права доступа к его мемберам и методам, как и с this.
« Последнее редактирование: 01-10-2021 13:10 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #10 : 01-10-2021 20:35 » 

Почитать внимательно про private, protected и public области более внимательно. В чем у них принципиальная разница. Также понять в чем разница между понятиями "класс" и "экземпляр класса". То, что ты пишеш в реализации методов класса, ты сам себе злобный буратино. Компилятор не должен и не может отлавливать твои логические ошибки. А начальство и коллеги просто будут очень сильно стучать по рукам, выпремляя их. А если не будет  помогать, то скорее всего отправят в свободное плавание.
« Последнее редактирование: 01-10-2021 20:37 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #11 : 02-10-2021 05:00 » 

Кстати, когдв решишся изучать python. То после С++ будут последние волосы на затылке вставать дыбом. В python вполне возможна такое использование переменных
Код: (Python)
class a:
    def __init__(self):
        pass
   
   
b = a()
b.a = 6
print(b.a)
Т.е. завести переменную вне класса в экземпляре класса и использовать ее извне. При этом никак не влияя на работу класса.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Boriska
Помогающий

ua
Offline Offline

« Ответ #12 : 26-01-2022 07:40 » 

Привет. Коллеги разъясните пожалуйста.
Код: (C++)
char* p_string = new char[5];
delete p_string;

char* p_string = new char[5];
delete []p_string;

Студия говорит - правильный второй вариант. Во втором случае подчеркивает зеленым и пишет "память была выделена при помощи оператора new [] для массивов, а удалятеся при помощи скалярного оператора delete "
Прошу разъяснить, мы когда получаем char* p_string = new char[5]; мы получаем указатель на символ, про массив указатель не знает. Почему же Липман удалят чрезе delete []p_string; и почему студия видит что это какой то не совсем указатель на char
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #13 : 26-01-2022 08:36 » 

Boriska, второй вариант правильный. Как выделялось, так и должно удаляться:

Код: (C++)
char* p_item = new char;
delete p_item;

char* p_array = new char[5];
delete [] p_array;

при других сочетания будет неопределённое поведение программы

А подчёркивает статический анализатор - он может такие ошибки выявлять иногда
Записан

Boriska
Помогающий

ua
Offline Offline

« Ответ #14 : 26-01-2022 12:43 » 

Погоди Алексей.
В С++ указатель на char, он же ничего не может знать кроме как про char.
Я понимаю, что в доке написано надо delete [] pointer;
Тогда поясни.
Мы когда записываем char* p_item = new char; мы же делаем два действия
1.Запрашиваем чтобы ОС выделила нам память.
2.Запоминаем адрес начала куска этой памяти и ОС уже знает что это наша память.

теперь я рассуждаю как в С#, если я удаляю ссылку и ссылок больше нет, ею может воспользоваться кто угодно и мусорщик ее помечает что она ничья.
в С++ же по идее если мы делаем delete pointer, мы как я понимаю помечаем что этот кусок уже ни чей - пользуйтесь, а что там лежит уже никого не интересует.

В нашем случае что несет информацию сколько памяти освободить ? скобки-бред
Я так понимаю ОС выделила память и отдала дескриптор, и она знает сколько памяти выделено на данный дескриптор, поступил запрос отдать память по этому дескриптору, она разберется сколько.
Нифига не пойму зачем скобки, а главное как "[]pointer" превращается в  pointer, ведь для delete нужен pointer(адрес).



Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #15 : 27-01-2022 03:30 » 

Boriska, нужно исходить из того, что это требуется стандарт C++:
для аллокации/освобождения на куче одного элемента используется new/delete
для аллокации/освобождения на куче массива элементов используется new[]/delete[]
если не соблюдать, будет UB

про ОС - нет ни слова. Это стандарт языка

А тонкости реализации могут быть свои у разных компиляторов - для одного элемента размер выделенного блока известен (sizeof(type)) , а для массива, я полагаю, количество элементов где-то сохраняется дополнительно.

со скобками и без - это разные операторы
https://en.cppreference.com/w/cpp/memory/new/operator_new
https://en.cppreference.com/w/cpp/memory/new/operator_delete

а ещё
а ещё есть placement вариант вызова new, когда можно конструировать объект в заранее выделенной памяти. И это единственный случай, когда нужно вручную вызывать деструктор
« Последнее редактирование: 27-01-2022 03:32 от Алексей++ » Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #16 : 27-01-2022 21:23 » 

С точки зрения управления памятью, со скобками или без — пофиг. Не пофиг деструкторам объектов. Одно дело массив символов, другое дело — массив объектов. Без скобок будет вызван деструктор только для первого объекта в массиве, на который и указывает указатель. Со скобками он вызовет деструктор на каждом объекте в массиве (размер он знает).
В любом случае лучше писать корректно. Положены скобки — пиши со скобками. Заведи себе правило компилироваться с максимумом предупреждений. Доводи программу до их полного отсутствия.

Массив символов в современном C++ — это архаично. Попробуй std::string. Не забивай себе мозги ерундой, пока не знаешь достаточно.
« Последнее редактирование: 27-01-2022 21:25 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Boriska
Помогающий

ua
Offline Offline

« Ответ #17 : 04-02-2022 14:33 » 

Привет.
static_cast<>, dinamic_cast<>, reinterprit_cast<>.... Липман пишет, что более читаемо, но также опасно как и раньше (int)m1 (double)m2..., надо чтобы программист по прежнему держал под контролем.
Подскажите что же нового, прогрессивного оно нам принесло, мне так старый синтаксис получше будет. Или они генерируют исключения ?
И если исключения генерит, нельзя ли было сделать чтобы скобки их генерировали ?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #18 : 04-02-2022 17:11 » 

А почитать пробовал? Не Липмана (кто это вообще?), а спецификацию языка.
https://en.cppreference.com/w/cpp/language/static_cast
https://en.cppreference.com/w/cpp/language/dynamic_cast
https://en.cppreference.com/w/cpp/language/reinterpret_cast
https://en.cppreference.com/w/cpp/language/const_cast

Про части const, пожалуй соглашусь, что сишное приведение проще. По остальному рекомендую читать.
« Последнее редактирование: 04-02-2022 17:13 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Boriska
Помогающий

ua
Offline Offline

« Ответ #19 : 04-02-2022 17:55 » new

Липман. Стенли Липман автор некоротого числа книг по С++.
В спецификации языка ничего на мой вопрос нет, там только какие типы и чем могут быть преобразованы. А как он поведет себя при не совпадении, зачем выдуман более сложный синтаксис - там такого не пишут, ну или я не умею читать спецификацию.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines