| 
			| 
					
						| Boriska 
								Помогающий    Offline | 
								|  | «  : 24-09-2021 10:49 »  |  | 
 
 Либерти С за 21 день. стр 164 https://ibb.co/K5sNsvm Они - объекты, они же изолированы, каждый имеет свое и только функции общие... |  
						| 
								|  |  
								| « Последнее редактирование: 24-09-2021 11:45 от Boriska » |  Записан | 
 |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #1 : 24-09-2021 12:52 »  |  | 
 
 Не понятно, какая связь между цитатой из книги и Си.
 По цитате: вообще написано нечто недостаточно ясное. Я так понял: Cat::some_method(Cat &other) { ... other.itsAge ... }. Да, так можно. Код не различает "свой" объект и "чужой".
 |  
						| 
								|  |  
								| « Последнее редактирование: 24-09-2021 12:57 от RXL » |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| Boriska 
								Помогающий    Offline | 
								|  | « Ответ #2 : 24-09-2021 13:37 »  |  | 
 
 А как же пресловутая фраза, что методы объекта предназначены для работы с членами-полями объекта. А они значит могут вывести нутро другого, такого же ? А где про это можно глянуть, чтоб понять, почему так. |  
						| 
								|  |  
								| « Последнее редактирование: 24-09-2021 13:59 от Boriska » |  Записан | 
 |  |  | 
	| 
			| 
					
						| Finch 
								СпокойныйАдминистратор    Offline 
								Пол:    
								Пролетал мимо
								
								
								
								
								
							 | 
								|  | « Ответ #3 : 24-09-2021 15:29 »  |  | 
 
 Я так понял, что тут говорится примерно про такой случай #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 | 
								|  | « Ответ #4 : 24-09-2021 22:42 »  |  | 
 
 Код для класса один. Объектов может быть сколько угодно. Скрывать поля объекта своего класса только потому что он не this? А смысл? Дело не только в копировании. Любой метод, например сравнение, может иметь доступ к приватным членам другого объекта своего класса. Если, конечно, у него есть указать или ссылка на него. Ну или копия. 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 
								Помогающий    Offline | 
								|  | « Ответ #5 : 30-09-2021 04:34 »  |  | 
 
 А почитать например про конструктор копирования. Или почитать на переопределение различных операторов. Ну если это оставлено специально для целей копирования или перегрузки операторов, почему оставлено и для всех остальных случаев. Это же можно было бы как-то урезать ? И потом оговорить это в литературе. А так как-то в период изучения конструкторов как-то не обращаешь на эту особенность внимания, а потом возникают вопросы. Да как по мне, страдает концепция защиты полей или стройность. Это создание бэк доров   void steal_secret(const Cat& otherCat) { secret = otherCat.secret; } |  
						| 
								|  |  
								| « Последнее редактирование: 30-09-2021 04:41 от Boriska » |  Записан | 
 |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #6 : 30-09-2021 20:01 »  |  | 
 
 "В литературе" все оговорено. Скока там? 1857 страниц? |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #7 : 01-10-2021 03:29 »  |  | 
 
 Boriska, выдача копий или ссылок на константы наружу из класса не нарушают целостность класса, поэтому это можно свободно делать (с многопоточностью, правда, немного сложнее)
 а чтобы случайно не "портить" поля класса в тех методах, где это не должно произойти, сам метод можно пометить как const
 |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| Boriska 
								Помогающий    Offline | 
								|  | « Ответ #8 : 01-10-2021 09:14 »  |  | 
 
 "В литературе" все оговорено. Скока там? 1857 страниц? "Литературу" скачал.  Как в ней ориентироваться, ну к примеру с нашим случаем ? Литература гласит http://ibb.co/q0nC365  только друзья и мемберы. Нет я понимаю, что доступ есть, как это найти ?  |  
						| 
								|  |  
								| « Последнее редактирование: 01-10-2021 10:25 от Boriska » |  Записан | 
 |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #9 : 01-10-2021 12:53 »  |  | 
 
 Код класса имеет доступ к мемберам и методам согласно простым правилам, описанным во всех самоучителях и справочниках.Для кода класса нет своих и чужих объектов. Если имеется от "чужого" объекта своего класса значение, ссылка или указатель, имеет те же права доступа к его мемберам и методам, как и с this.
 |  
						| 
								|  |  
								| « Последнее редактирование: 01-10-2021 13:10 от RXL » |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| Finch 
								СпокойныйАдминистратор    Offline 
								Пол:    
								Пролетал мимо
								
								
								
								
								
							 | 
								|  | « Ответ #10 : 01-10-2021 20:35 »  |  | 
 
 Почитать внимательно про private, protected и public области более внимательно. В чем у них принципиальная разница. Также понять в чем разница между понятиями "класс" и "экземпляр класса". То, что ты пишеш в реализации методов класса, ты сам себе злобный буратино. Компилятор не должен и не может отлавливать твои логические ошибки. А начальство и коллеги просто будут очень сильно стучать по рукам, выпремляя их. А если не будет  помогать, то скорее всего отправят в свободное плавание.  |  
						| 
								|  |  
								| « Последнее редактирование: 01-10-2021 20:37 от Finch » |  Записан | 
 
 Не будите спашяго дракона.              Джаффар (Коша) |  |  | 
	| 
			| 
					
						| Finch 
								СпокойныйАдминистратор    Offline 
								Пол:    
								Пролетал мимо
								
								
								
								
								
							 | 
								|  | « Ответ #11 : 02-10-2021 05:00 »  |  | 
 
 Кстати, когдв решишся изучать python. То после С++ будут последние волосы на затылке вставать дыбом. В python вполне возможна такое использование переменных class a:def __init__(self):
 pass
 
 
 b = a()
 b.a = 6
 print(b.a)
 Т.е. завести переменную вне класса в экземпляре класса и использовать ее извне. При этом никак не влияя на работу класса. |  
						| 
								|  |  
								|  |  Записан | 
 
 Не будите спашяго дракона.              Джаффар (Коша) |  |  | 
	| 
			| 
					
						| Boriska 
								Помогающий    Offline | 
								|  | « Ответ #12 : 26-01-2022 07:40 »  |  | 
 
 Привет. Коллеги разъясните пожалуйста. 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 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #13 : 26-01-2022 08:36 »  |  | 
 
 Boriska, второй вариант правильный. Как выделялось, так и должно удаляться: char* p_item = new char;delete p_item;
 
 char* p_array = new char[5];
 delete [] p_array;
 при других сочетания будет неопределённое поведение программы А подчёркивает статический анализатор - он может такие ошибки выявлять иногда |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| Boriska 
								Помогающий    Offline | 
								|  | « Ответ #14 : 26-01-2022 12:43 »  |  | 
 
 Погоди Алексей.В С++ указатель на char, он же ничего не может знать кроме как про char.
 Я понимаю, что в доке написано надо delete [] pointer;
 Тогда поясни.
 Мы когда записываем char* p_item = new char; мы же делаем два действия
 1.Запрашиваем чтобы ОС выделила нам память.
 2.Запоминаем адрес начала куска этой памяти и ОС уже знает что это наша память.
 
 теперь я рассуждаю как в С#, если я удаляю ссылку и ссылок больше нет, ею может воспользоваться кто угодно и мусорщик ее помечает что она ничья.
 в С++ же по идее если мы делаем delete pointer, мы как я понимаю помечаем что этот кусок уже ни чей - пользуйтесь, а что там лежит уже никого не интересует.
 
 В нашем случае что несет информацию сколько памяти освободить ? скобки-бред
 Я так понимаю ОС выделила память и отдала дескриптор, и она знает сколько памяти выделено на данный дескриптор, поступил запрос отдать память по этому дескриптору, она разберется сколько.
 Нифига не пойму зачем скобки, а главное как "[]pointer" превращается в  pointer, ведь для delete нужен pointer(адрес).
 
 
 
 
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    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_newhttps://en.cppreference.com/w/cpp/memory/new/operator_delete а ещё а ещё есть placement вариант вызова new, когда можно конструировать объект в заранее выделенной памяти. И это единственный случай, когда нужно вручную вызывать деструктор |  
						| 
								|  |  
								| « Последнее редактирование: 27-01-2022 03:32 от Алексей++ » |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #16 : 27-01-2022 21:23 »  |  | 
 
 С точки зрения управления памятью, со скобками или без — пофиг. Не пофиг деструкторам объектов. Одно дело массив символов, другое дело — массив объектов. Без скобок будет вызван деструктор только для первого объекта в массиве, на который и указывает указатель. Со скобками он вызовет деструктор на каждом объекте в массиве (размер он знает).В любом случае лучше писать корректно. Положены скобки — пиши со скобками. Заведи себе правило компилироваться с максимумом предупреждений. Доводи программу до их полного отсутствия.
 
 Массив символов в современном C++ — это архаично. Попробуй std::string. Не забивай себе мозги ерундой, пока не знаешь достаточно.
 |  
						| 
								|  |  
								| « Последнее редактирование: 27-01-2022 21:25 от RXL » |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| Boriska 
								Помогающий    Offline | 
								|  | « Ответ #17 : 04-02-2022 14:33 »  |  | 
 
 Привет.static_cast<>, dinamic_cast<>, reinterprit_cast<>.... Липман пишет, что более читаемо, но также опасно как и раньше (int)m1 (double)m2..., надо чтобы программист по прежнему держал под контролем.
 Подскажите что же нового, прогрессивного оно нам принесло, мне так старый синтаксис получше будет. Или они генерируют исключения ?
 И если исключения генерит, нельзя ли было сделать чтобы скобки их генерировали ?
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #18 : 04-02-2022 17:11 »  |  | 
 
 |  
						| 
								|  |  
								| « Последнее редактирование: 04-02-2022 17:13 от RXL » |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| Boriska 
								Помогающий    Offline | 
								|  | « Ответ #19 : 04-02-2022 17:55 »  |  | 
 
 Липман. Стенли Липман автор некоротого числа книг по С++.В спецификации языка ничего на мой вопрос нет, там только какие типы и чем могут быть преобразованы. А как он поведет себя при не совпадении, зачем выдуман более сложный синтаксис - там такого не пишут, ну или я не умею читать спецификацию.
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Boriska 
								Помогающий    Offline | 
								|  | « Ответ #20 : 15-12-2023 10:19 »  |  | 
 
 Это как С++ такое может быть. char code_page_ru[256] = {     [' '] = ' ',     ['/'] = '/',     ['.'] = '.', }; |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #21 : 15-12-2023 10:31 »  |  | 
 
 Boriska, это в Си так можно, а в C++ неможно ) |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| Boriska 
								Помогающий    Offline | 
								|  | « Ответ #22 : 15-12-2023 10:33 »  |  | 
 
 а  какова идея, как оно фунциклит ? Этж против всех законов физики. И по идее все законное в С - должно работать С++
 |  
						| 
								|  |  
								| « Последнее редактирование: 15-12-2023 10:35 от Boriska » |  Записан | 
 |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #23 : 15-12-2023 10:39 »  |  | 
 
 Boriska, инициализация только элементов с индексами(size_t)' '
 (size_t)'/'
 (size_t)'.'
 остальные элементы - обнуляются
 
 Добавлено через 25 секунд:
 >>И по идее все законное в С - должно работать С++
 нет, это разные языки
 |  
						| 
								|  |  
								| « Последнее редактирование: 15-12-2023 10:40 от Алексей1153 » |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #24 : 15-12-2023 10:43 »  |  | 
 
 ещё в Си вот так можно struct A{
 int i1;
 int i2;
 int i3;
 int i4;
 };
 
 struct A a={.i2=7, .i4=42};
 |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| Boriska 
								Помогающий    Offline | 
								|  | « Ответ #25 : 15-12-2023 11:23 »  |  | 
 
 вообще это какая то недокументированная фича или ...? |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	|  | 
	| 
			| 
					
						| Boriska 
								Помогающий    Offline | 
								|  | « Ответ #27 : 15-12-2023 12:33 »  |  | 
 
 спсб |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Boriska 
								Помогающий    Offline | 
								|  | « Ответ #28 : 02-02-2024 16:30 »  |  | 
 
 Привет. Писал под контроллер и вдруг обнаружил, что char это не 8 а 16. В студии кодировка двухбайтовая вот и пожалуйста. В связи с этим вопрос о типах. Как нынче определять размер типа без sizeof. Вот допустим char будет зависеть не от контроллера или ПК, а от студии. А допустим int. По идее от платформы ? |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	|  | 
	|  |