Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Объясните по синтаксису С++ / 25 сообщений из 49, страница 1 из 2
20.07.2007, 03:33:32
    #34671911
Непонимаю
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните по синтаксису С++
Плохо знаю С++... А книжки читаю, там таких тонкостей нет...
Объясните в следующем объявлении:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Qt::ItemFlags MyModel::flags(const QModelIndex &index) const 
{
    Qt::ItemFlags flags = QSqlQueryModel::flags(index);
     if (index.column() >=  1  && index.column() <  4 )
         flags |= Qt::ItemIsEditable;
     if (index.column() ==  4 )
         flags |= Qt::ItemIsUserCheckable;
     return flags;
}

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

> зачем после объявления функции const?
Это означает, что функция не меняет состояния класса ни при каких условиях.
Это позволяет вызывать её из константного указателя на класс. Кстати, об
этом отлично рассказано во встроенной справке Visual Studio (статьи
находятся по слову "const").
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
20.07.2007, 04:47:35
    #34671938
Непонимаю
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните по синтаксису С++
Ок. Почитаю. Спасибо...
Еще вопрос, навернео совсем простой. Про ссылки и указатели. Ну никак не могу понять!
Например я объявляю переменную:
Код: plaintext
1.
  QDialog* pd = new QDialog();
И я объявляю другую переменную:
Код: plaintext
1.
 QDialog d;
Я понимаю, что переменная pd, это адрес экземпляра класса.... И для неё я могу вызвать метод show(), воспользовавшись конструкцией:
Код: plaintext
1.
 pd->show();
Тогда что такое переменная d?? Я могу чем то её заполнить имея pd? И почему я не могу вызвать для неё
Код: plaintext
d.show();
?
Речь идет о библиотеке QT.
...
Рейтинг: 0 / 0
20.07.2007, 05:53:46
    #34671950
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните по синтаксису С++
Непонимаю wrote:

> Я понимаю, что переменная pd, это адрес экземпляра класса.... И для неё я
> могу вызвать метод show(), воспользовавшись конструкцией:

> Тогда что такое переменная d??
Это экземпляр класса, находящийся в стеке программы

> Я могу чем то её заполнить имея pd?
Да. d = *pd. Но лучше в документацию сначала залезть и посмотерть по поводу
присваивания и т.д. Насколько помню, большинство классов Qt заточены под
передачу по значению (т.е. можно возвратить в функции экземпляр класса, а
не указатель на класса), так что проблем не должно быть.

> И почему я не могу вызвать для неё d.show(); ?
Это почему это? Программу, строчку и сообщение об ошибке в студию.


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

> А книжки читаю, там таких тонкостей нет...
У строуструпа такое должно быть. Гарантии не даю.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
20.07.2007, 06:30:08
    #34671960
Непонимаю
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните по синтаксису С++
ErV
> И почему я не могу вызвать для неё d.show(); ?
Это почему это? Программу, строчку и сообщение об ошибке в студию.

Вызвать не могу, потому что не могу присвоить:
Код: plaintext
1.
2.
    QDialog* pd;           //9
    pd = new QDialog();           //10
    d = *pd;   // -- вот здесь      // 11 

Говорит, что оператор = private:

Код: plaintext
1.
2.
../include/QtGui/../../src/gui/dialogs/qdialog.h: In function `int qMain(int, char**)':
../include/QtGui/../../src/gui/dialogs/qdialog.h:103: error: `QDialog& QDialog::operator=(const QDialog&)' is private
proba.cpp: 11 : error: within this context

А зачем так сделано то?
...
Рейтинг: 0 / 0
20.07.2007, 06:51:49
    #34671974
Непонимаю
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните по синтаксису С++
ErV
> Тогда что такое переменная d??
Это экземпляр класса, находящийся в стеке программы
А можно сказать так:
d: - это потенциально адрес экземпляра класса (начальной точки, первого байта массива памяти), память под который будет выделена в куче ?

А pd, это тогда адрес некой другой ячейки памяти, в которой уже в свою очередь хранится адрес на начальную точку экземпляра класса QDialog.
?
...
Рейтинг: 0 / 0
20.07.2007, 08:26:33
    #34672029
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните по синтаксису С++
ErV
Непонимаю wrote:

> А книжки читаю, там таких тонкостей нет...
У строуструпа такое должно быть. Гарантии не даю.
Posted via ActualForum NNTP Server 1.4

У Саттера и Майерса стопроцентно есть
Уж и не знаю что за КНИЖКИ читает автор
...
Рейтинг: 0 / 0
20.07.2007, 08:33:22
    #34672034
Непонимаю
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните по синтаксису С++
я кажется догадался...
все переменные помещаются в стеке и занимат столько места в стеке сколько весит объект, который они представляют.
Например, если на хранение QDialog нужно 200 байт со всеми полями... (а кстати, таблица функций и тем более их исполняемый код в каждый экземпляр не копируется же?), то в стеке будет отведено именно 200 байт на это дело.
Если это Int, то будет 4 байта, и так далее.
Если объявляется ссылка на.. что то то в стеке выделится ровно место для хранения адреса и все.
А место под сам объект выделяется в куче.

ПравильНо??

А в QT запретили передачу по значению чтобы не закакивали стек. ?
...
Рейтинг: 0 / 0
20.07.2007, 08:36:23
    #34672039
Непонимаю
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните по синтаксису С++
Gluk (Kazan)У Саттера и Майерса стопроцентно есть
Уж и не знаю что за КНИЖКИ читает автор
Две нашел для начинающих... На 600 страниц растянута манная каша про оператор for while и объявление переменных.

И Страутструп тоже такой фигней страдает. Его вообще тяжело читать.

Саттер ии Маерс... Угу
...
Рейтинг: 0 / 0
20.07.2007, 08:56:08
    #34672070
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните по синтаксису С++
Непонимаю
Две нашел для начинающих...

И НИКОГДА не читайте перед едой советских газет !!! (с)
...
Рейтинг: 0 / 0
20.07.2007, 09:01:30
    #34672080
tAZAR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните по синтаксису С++
Непонимаю Gluk (Kazan)У Саттера и Майерса стопроцентно есть
Уж и не знаю что за КНИЖКИ читает автор
Две нашел для начинающих... На 600 страниц растянута манная каша про оператор for while и объявление переменных.

И Страутструп тоже такой фигней страдает. Его вообще тяжело читать.

Саттер ии Маерс... Угу
1) Ну не надо так про Страуструпа :-) Отличная книга, все в ней написано.
2) Не путайте, главное, в самом начале значения понятий "ссылка" и "указатель".
Например если переменная заведена в стэке (int a) - то чтобы передать ее в функцию, требующую указатель - вы передаете &a (взятие адреса/передача по ссылке).
в int *a уже хранится адрес, т.к. это указатель.
...
Рейтинг: 0 / 0
20.07.2007, 09:39:12
    #34672155
Непонимаю
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните по синтаксису С++
tAZAR
1) Ну не надо так про Страуструпа :-) Отличная книга, все в ней написано.


Видимо дело вкуса. В электронном виде можно посмотреть Саттера где-то?
...
Рейтинг: 0 / 0
20.07.2007, 09:40:51
    #34672163
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните по синтаксису С++
Непонимаю ErV
> И почему я не могу вызвать для неё d.show(); ?
Это почему это? Программу, строчку и сообщение об ошибке в студию.

Вызвать не могу, потому что не могу присвоить:
Код: plaintext
1.
2.
    QDialog* pd;           //9
    pd = new QDialog();           //10
    d = *pd;   // -- вот здесь      // 11 

Говорит, что оператор = private:

Код: plaintext
1.
2.
../include/QtGui/../../src/gui/dialogs/qdialog.h: In function `int qMain(int, char**)':
../include/QtGui/../../src/gui/dialogs/qdialog.h:103: error: `QDialog& QDialog::operator=(const QDialog&)' is private
proba.cpp: 11 : error: within this context

А зачем так сделано то?

Для этого и сделано. Чтобы не возможно было присвоить один диалог другому. По всей видимости, диалог не может обладать логически и/или физически правельно операцией присваивания. Скорее всего заблокирован и копирующий конструктор.
...
Рейтинг: 0 / 0
20.07.2007, 09:44:30
    #34672174
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните по синтаксису С++
Непонимаюя кажется догадался...
все переменные помещаются в стеке и занимат столько места в стеке сколько весит объект, который они представляют.
Например, если на хранение QDialog нужно 200 байт со всеми полями... (а кстати, таблица функций и тем более их исполняемый код в каждый экземпляр не копируется же?),

угу.

Непонимаю то в стеке будет отведено именно 200 байт на это дело.
Если это Int, то будет 4 байта, и так далее.
Если объявляется ссылка на.. что то то в стеке выделится ровно место для хранения адреса и все.
А место под сам объект выделяется в куче.

ПравильНо??

да.
Непонимаю

А в QT запретили передачу по значению чтобы не закакивали стек. ?

Врядли. В asp10 для одного потока выделяется 10 метров стека. :)
...
Рейтинг: 0 / 0
20.07.2007, 09:47:08
    #34672179
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните по синтаксису С++
Непонимаю Gluk (Kazan)У Саттера и Майерса стопроцентно есть
Уж и не знаю что за КНИЖКИ читает автор
Две нашел для начинающих... На 600 страниц растянута манная каша про оператор for while и объявление переменных.

И Страутструп тоже такой фигней страдает. Его вообще тяжело читать.

Саттер ии Маерс... Угу

Ну, это плохие авторы. Про синтаксис языка, я бы предпочел лаконичное изложение.

Страуструпа, обычно, на философию (размышления) тянет.

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

На мой вкус хорошие
а о вкусах как известно не спорят

Не все книги должны быть похожи на расписание пригородных поездов

P.S. Крокодил Гена любил читать умные книги (с)
...
Рейтинг: 0 / 0
20.07.2007, 10:00:53
    #34672223
Непонимаю
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните по синтаксису С++
Akh Страуструпа, обычно, на философию (размышления) тянет.
Вот именно это и раздражает.

Еще момент не понимаю.
1) В каком случае функцию можно вызвать вот так ? :
Код: plaintext
1.
SomeClass u;
u.DoSomeThing();

насколько я видел в объявлении функции, которая потом вызывается таким образом слова static нет.

2) Есть ли разница между функциями объявляемыми внутри класса (внутри {} относящихся к объявлению класса) и функциями объявляемыми пожже в любом месте со значком ::

Например:

Код: plaintext
1.
2.
3.
4.
SomeClass::DoSomeThing()
{

}
...
Рейтинг: 0 / 0
20.07.2007, 10:19:06
    #34672287
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните по синтаксису С++
1. В том который Вы показали тут дело не в определении метода а в том как создается класс на стеке или куче (и соответственно осуществляется доступ через указатель или нет) static ТУТ не при чем

2. есть, но очччень маленькая они inline
...
Рейтинг: 0 / 0
20.07.2007, 10:29:35
    #34672335
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните по синтаксису С++
Gluk (Kazan) AkhНу, это плохие авторы.

На мой вкус хорошие
а о вкусах как известно не спорят

Не все книги должны быть похожи на расписание пригородных поездов

P.S. Крокодил Гена любил читать умные книги (с)

ты меня не понял. Сообщение автора было из 3-х утверждений, я привел 3 довода по этим утверждениям. Соотвтетсвенно, это относилось к автору, который for расписал на 600 страниц.

Саттер и Маейерс, содержат много полезного. У меня они были как подготовительный этап, т.е. отточка использования конструкций(синтаксиса?) языка, для изучения проектных решений.
...
Рейтинг: 0 / 0
20.07.2007, 10:39:17
    #34672377
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните по синтаксису С++
Непонимаю
Еще момент не понимаю.
1) В каком случае функцию можно вызвать вот так ? :
Код: plaintext
1.
SomeClass u;
u.DoSomeThing();

насколько я видел в объявлении функции, которая потом вызывается таким образом слова static нет.


Таким образом вызываются как раз не статик методы класса. Статик методы можно вызывать без указания конкретного экземляра (в этом случае u). Статик вы можете вызвать так:
Код: plaintext
1.
SomeClass::DoSomeThing();

Т.е. вам не нужен конкретный экземляр.

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

Например:

Код: plaintext
1.
2.
3.
4.
SomeClass::DoSomeThing()
{

}


Для самого метода - нет. Разница в использвовании. Допустим вы хотите скрыть реализацию, что бы не перекомпиливались все модули использующие данных класс, при модификации реализации функции или чтобы не было копий реализаций в модулях их использующих.

Обычно, реализацию выносят в cpp-файл, за исключением, как сказал Gluk, inline, а также шаблонных методов или методов шаблонных классов.
...
Рейтинг: 0 / 0
20.07.2007, 10:49:19
    #34672413
tAZAR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните по синтаксису С++
Непонимаю
2) Есть ли разница между функциями объявляемыми внутри класса (внутри {} относящихся к объявлению класса) и функциями объявляемыми пожже в любом месте со значком ::

Например:

Код: plaintext
1.
2.
3.
4.
SomeClass::DoSomeThing()
{

}

Правила хорошего тона. Обычно в хидерах описывают только inline функции, остальные выносят в файл реализации..
Насчет книг еще: Александреску?
...
Рейтинг: 0 / 0
20.07.2007, 10:52:48
    #34672430
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните по синтаксису С++
tAZARНасчет книг еще: Александреску?

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

Александреску, имхо, следует проходить после GoF(или хотябы дорости до уровня, что можно свободно читать).
...
Рейтинг: 0 / 0
20.07.2007, 11:06:49
    #34672484
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните по синтаксису С++
Akhты меня не понял. Сообщение автора было из 3-х утверждений, я привел 3 довода по этим утверждениям. Соотвтетсвенно, это относилось к автору, который for расписал на 600 страниц.

Саттер и Маейерс, содержат много полезного. У меня они были как подготовительный этап, т.е. отточка использования конструкций(синтаксиса?) языка, для изучения проектных решений.

ага, понял
...
Рейтинг: 0 / 0
20.07.2007, 11:12:00
    #34672504
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните по синтаксису С++
tAZARНасчет книг еще: Александреску?

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


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