powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Объясните по синтаксису С++
24 сообщений из 49, страница 2 из 2
Объясните по синтаксису С++
    #34672512
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
const после нестатической функции-мембера класса Some означает, что в этой функции указатель this объявляется не как
Код: plaintext
1.
Some* this
, а как
Код: plaintext
1.
const Some* this
...
Рейтинг: 0 / 0
Объясните по синтаксису С++
    #34672514
Фотография tAZAR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan) tAZARНасчет книг еще: Александреску?

слишком жестоко для новичка :)
Писал с опаской :-) Просто чтобы человек и о такой знал..
...
Рейтинг: 0 / 0
Объясните по синтаксису С++
    #34672525
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivconst после нестатической функции-мембера класса Some означает, что в этой функции указатель this объявляется не как
Код: plaintext
1.
Some* this
, а как
Код: plaintext
1.
const Some* this


Вместь "не так, а как", надо "так или так".
...
Рейтинг: 0 / 0
Объясните по синтаксису С++
    #34672846
Непонимаю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akh tAZARНасчет книг еще: Александреску?

Не рановато ли человеку не умеющему работать с ООП?

Александреску, имхо, следует проходить после GoF(или хотябы дорости до уровня, что можно свободно читать).
Со стороны виднее. Может и не умею работать с ООП, но вообще я из Delphi, С#... там таких заморочек нет. Там не приходится думать, где ты сейчас - в стеке или в куче...

Чтобы вызвать метод, по крайней мере объект класса должен быть инициализирован. Само объявление переменной типа (пользуюсь нотацией С++):

Код: plaintext
SomeClass e;

Ничего кроме null не дает... Т.е. - однозначно память под экземпляр не отводится, указатель = null/
Попытаться вызывать некий метод до инициализации... Не пробовал! А может и пробовал, но компилятор быстро отбил эту привычку. Не помню. Там просто нета такой практики... не принято.
Использовал static если была нужна функция без экземпляра.

Вместо передачи значения по ссылке используется var или out (C#). И сразу понятно что к чему..

Пошел в книжный. Очень понравилась QT.
...
Рейтинг: 0 / 0
Объясните по синтаксису С++
    #34672943
Фотография tAZAR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НепонимаюСо стороны виднее. Может и не умею работать с ООП, но вообще я из Delphi, С#... там таких заморочек нет. Там не приходится думать, где ты сейчас - в стеке или в куче...

Чтобы вызвать метод, по крайней мере объект класса должен быть инициализирован. Само объявление переменной типа (пользуюсь нотацией С++):

Код: plaintext
SomeClass e;

Ничего кроме null не дает... Т.е. - однозначно память под экземпляр не отводится, указатель = null/
Попытаться вызывать некий метод до инициализации... Не пробовал! А может и пробовал, но компилятор быстро отбил эту привычку. Не помню. Там просто нета такой практики... не принято.
В C# компилятор на такое объявление и попытку потом использовать объект вывалит ошибку попытки использования неинициализированной переменной. ООП там валом, и разобраться с ним нужно было еще там :-) Кстати, указателей там тоже нет (в чистом managed code).. А Qt - да, хорошая вещь :-) К студии дебаггер не прикрутил. Вернулся пока на последний билд Code::Blocks, блин, еще б туда рефакторинг. :-( Хоть на emacs переходи..
...
Рейтинг: 0 / 0
Объясните по синтаксису С++
    #34673088
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Непонимаю Akh
Александреску, имхо, следует проходить после GoF(или хотябы дорости до уровня, что можно свободно читать).
Со стороны виднее. Может и не умею работать с ООП, но вообще я из Delphi, С#... там таких заморочек нет. Там не приходится думать, где ты сейчас - в стеке или в куче...

Чтобы вызвать метод, по крайней мере объект класса должен быть инициализирован. Само объявление переменной типа (пользуюсь нотацией С++):

Код: plaintext
SomeClass e;

Ничего кроме null не дает... Т.е. - однозначно память под экземпляр не отводится, указатель = null/
Попытаться вызывать некий метод до инициализации... Не пробовал! А может и пробовал, но компилятор быстро отбил эту привычку. Не помню. Там просто нета такой практики... не принято.
Использовал static если была нужна функция без экземпляра.

Вместо передачи значения по ссылке используется var или out (C#). И сразу понятно что к чему..

Пошел в книжный. Очень понравилась QT.

Тогда - уметь работать с классами в С++.

Ваш пример в С++ уже определил рабочий объект "e" класса "SomeClass". Он инициализирован конструктором по умолчанию. SomeClass::SomeClass(). Если вы такой конструктор для класса не определяли, то компилятор его создаст сам. Все свойства класса, также будут инициализированны кострукторами по умолчанию.

Это элементарные правила. Сначала надо вникнуть в них. Это я и имел виду, только слишком обощил на все ООП, не зная, что у вас опыт в других языках есть.
...
Рейтинг: 0 / 0
Объясните по синтаксису С++
    #34673148
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НепонимаюТам не приходится думать, где ты сейчас - в стеке или в куче...


В C++ об этом думать приходится
и это хорошо
...
Рейтинг: 0 / 0
Объясните по синтаксису С++
    #34673185
Ми
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот удачная книга, про const - очень подробно :)
Джефф Элджер "C++ Библиотека программиста".
Только для новичка сложновато может быть.
Скачать можно тут
...
Рейтинг: 0 / 0
Объясните по синтаксису С++
    #34673281
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МиВот удачная книга, про const - очень подробно :)
Джефф Элджер "C++ Библиотека программиста".
Только для новичка сложновато может быть.
Скачать можно тут

На мой взгляд не слишком удачная. Много апломба
...
Рейтинг: 0 / 0
Объясните по синтаксису С++
    #34674192
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Непонимаю wrote:

> Вызвать не могу, потому что не могу присвоить:
> QDialog* pd; //9
> pd = new QDialog(); //10
> d = *pd; // -- вот здесь //11
Значит, так делать нельзя. Создавайте сразу с конструктором:
QDialog d(параметры);

> Говорит, что оператор = private:
>А зачем так сделано то?
Очевидно, что реализация не позволяет его копировать, и конструктор в
private запихнут чтобы это явно запретить, например.

>А можно сказать так:
>d: - это потенциально адрес экземпляра класса (начальной точки, первого
>байта массива памяти), память под который будет выделена в куче ?
Нельзя, потому что память под него УЖЕ выделена, и выделена в стеке.
Статически, так сказать

>Если объявляется ссылка на.. что то то в стеке выделится ровно место для
>хранения адреса и все.
>А место под сам объект выделяется в куче.
>ПравильНо??
Почти. ссылка может указывать на объект в стеке.

>А в QT запретили передачу по значению чтобы не закакивали стек. ?.
Не вижу связи. Там очень много классов, которые можно передавать по
значению. QImage, например, QString и т.д. Там специально реализация
сделана так, чтобы предотвратить излишнее дублирование одинаковых строк и
т.д. и т.п.

>Две нашел для начинающих... На 600 страниц растянута манная каша про
>оператор for while и объявление переменных.
(пожимает плечами)

>И Страутструп тоже такой фигней страдает. Его вообще тяжело читать.
Зато у него расписаны все возможности языка. Когда учил, к книжке долго
обращался, пока не выучил, как объявлять typedef'ом указатель а фукнцию.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Объясните по синтаксису С++
    #34674217
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh wrote:

> Врядли. В asp10 для одного потока выделяется 10 метров стека. :)
Тут тонкость есть. под Windows стек динамически расти (т.е. увеличивать свой
максимально возможный размер) не может, под *nix'ом, как я понимаю - может.
Из-за этого есть проблемы, например, с Open Dynamics Engine под виндой...

Непонимаю wrote:
> 1) В каком случае функцию можно вызвать вот так ? :
В любом.

>2) Есть ли разница между функциями объявляемыми внутри класса (внутри {}
>относящихся к объявлению класса) и функциями объявляемыми пожже в любом
>месте со значком ::
Функцию класса нельзя объявить за пределами класса. НО можно разместить
объявление фукнции (т.е. int asdf();) внутри класса, а реализацию засунуть
в другое место.

>Со стороны виднее. Может и не умею работать с ООП, но вообще я из Delphi,
>С#... там таких заморочек нет. Там не приходится думать, где ты сейчас - в
>стеке или в куче...
Вообще-то, смотря как работать. Иногда очень даже приходится. Ну и плюс -
это дельфийские классы позвляют иногда об этом забыть, так как,
фактически, являютсяуказателями. А вот объект (пришедшие из паскаля),
помнится, можно и в стек засунуть...

>Чтобы вызвать метод, по крайней мере объект класса должен быть
>инициализирован. Само объявление переменной типа (пользуюсь нотацией С++):
А как насчет Дельфйиского ClassName, например? помнится, она и несколько
других функций (GetInstanceSize, вроде бы) могут быть вызваны без
экземпляра класса.

>Ничего кроме null не дает... Т.е. - однозначно память под экземпляр не
>тводится, указатель = null/
Он не может быть "null". И память в стеке не может быть НЕ выделена.
Приведите полный проблемный код.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Объясните по синтаксису С++
    #34674312
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErV
Akh wrote:

> Врядли. В asp10 для одного потока выделяется 10 метров стека. :)
Тут тонкость есть. под Windows стек динамически расти (т.е. увеличивать свой
максимально возможный размер) не может, под *nix'ом, как я понимаю - может.
Из-за этого есть проблемы, например, с Open Dynamics Engine под виндой...


Ну, а объекты-то в стеке создавать можно?
...
Рейтинг: 0 / 0
Объясните по синтаксису С++
    #34674528
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh wrote:

> Ну, а объекты-то в стеке создавать можно?
Можно.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Объясните по синтаксису С++
    #34675356
ErV
>Чтобы вызвать метод, по крайней мере объект класса должен быть
>инициализирован. Само объявление переменной типа (пользуюсь нотацией С++):
А как насчет Дельфйиского ClassName, например? помнится, она и несколько
других функций (GetInstanceSize, вроде бы) могут быть вызваны без
экземпляра класса.

>Ничего кроме null не дает... Т.е. - однозначно память под экземпляр не
>тводится, указатель = null/
Он не может быть "null". И память в стеке не может быть НЕ выделена.
Приведите полный проблемный код.

Да проблем то никаких. В Delphi, например я и не задумывался о неявной инициализации, потому как там она не имеля смысла просто. Но кстати, все написанное заставило задуматься и провести ряд экспериментов дома.
Итак... проверка на nil объявленной переменной.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 procedure  Form1.DoSomeThing;
 var  f: TForm2;
 begin 
   if  f= nil   then  ShowMessage('11');
  ShowMessage(IntToStr(f.InstanceSize));
  f:=TForm2.CreateNew(self);
  ShowMessage(IntToStr(f.InstanceSize));
 end ;

Код после then НЕ выполняется. Второй ShowMessage кажет 536. Третий ShowMessage кажет 748 .
Что происходит? Видимо объявление var таки запускает некий конструктор по умолчанию... Явное присвоение меняет значение f (адрес становится другой - я проверял). Куда же деваются первые 536 байт выделенные под f при объявлении? Ну... видимо болтаются в стеке пока не произойдет выход из процедуры.

Дальше... Объявим f как поле класса TForm1:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 type  TForm1 =  class (TForm)

  public 
  f: TForm2;

 end ;

 procedure  Form1.DoSomeThing;
 begin 
   if  f= nil   then  ShowMessage('11');
  f:=TForm2.CreateNew(self);
  ShowMessage(IntToStr(f.InstanceSize));
 end ;

Отрабатывает первый ShowMessage после then! Таким образом, поле класса НЕ инициализируется конструктором по умолчанию... А как это происходит в C++?! Так же?
Я говорю -никогда не задумывался над этими тонкостями, потому что всегда действовал по схеме:
Объявление->Инициализация->Использование.

Далее еще интереснее - безусловно Второй ShowMessage отрабатывает и показывает 748 байт, но! если сделать вот так:

Код: plaintext
1.
2.
3.
4.
5.
 procedure  Form1.DoSomeThing;
 var  f2: TForm2;
 begin 
  ShowMessage(IntToStr(f2.InstanceSize));
  ShowMessage(IntToStr(f.InstanceSize));
 end ;

... то не выбрасывается ни первый , ни второй ShowMessage, а сразу вываливается runtime ошибка AccessViolation. Такое впечатление, что перед выполнением процедуры Delphi как бы просматривает код вперед и пытается вычислить выражения заранее и дойдя до второго натыкается на отсутствующий объект.

Вот такие темные углы компиляции...
...
Рейтинг: 0 / 0
Объясните по синтаксису С++
    #34675569
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начинаюпонимать wrote:

> var f: TForm2;
> begin
> if f=nil then ShowMessage('11');
Можно вопрос? А почему вы, собственно, решили, что в неинициализированной
переменной будет nil? Там указатель "в никуда", мусор, на самом деле.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Объясните по синтаксису С++
    #34675744
daevaorn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Начинаюпонимать А как это происходит в C++?! Так же?
нет. поле имеющее не тривиальный конструктор по умолчанию будет им "проинициализировано".
...
Рейтинг: 0 / 0
Объясните по синтаксису С++
    #34676013
Непонимаю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
МиВот удачная книга, про const - очень подробно :)
Джефф Элджер "C++ Библиотека программиста".
Только для новичка сложновато может быть.
Скачать можно тут

http://proklondike.com

Офигенный ресурс.
...
Рейтинг: 0 / 0
Объясните по синтаксису С++
    #34676075
Непонимаю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
МиВот удачная книга, про const - очень подробно :)
Джефф Элджер "C++ Библиотека программиста".
Только для новичка сложновато может быть.
Скачать можно тут
И кстати, действительно, это то что я искал. Без воды по с тысячеразным объяснением что такое переменная и как ветвится программа объясняется самая соль. Самые проблемные места.
...
Рейтинг: 0 / 0
Объясните по синтаксису С++
    #34676258
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErV
Akh wrote:

> Ну, а объекты-то в стеке создавать можно?
Можно.

Ну, вот. Тогда это не последовательное предположение.
...
Рейтинг: 0 / 0
Объясните по синтаксису С++
    #34678680
Непонимаю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что подразумевается под объявлением:

int &j;

и что потом можно сделать с этой переменной ваще?
...
Рейтинг: 0 / 0
Объясните по синтаксису С++
    #34678774
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Объясните по синтаксису С++
    #34679899
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Непонимаю wrote:

> Что подразумевается под объявлением:
>
> int &j
>
> и что потом можно сделать с этой переменной ваще?
>
Опять? Это уже обсуждалось.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Объясните по синтаксису С++
    #34679948
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErVОпять? Это уже обсуждалось.

Чукча не читатель, чукча писатель. :)
...
Рейтинг: 0 / 0
Объясните по синтаксису С++
    #34681971
Непонимаю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akh ErVОпять? Это уже обсуждалось.

Чукча не читатель, чукча писатель. :)
ой ой
...
Рейтинг: 0 / 0
24 сообщений из 49, страница 2 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Объясните по синтаксису С++
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]