LINUX.ORG.RU

с++ поля класса

 


0

2

привет объясните пожалуйста простую вещь


#include <iostream>

class foo{
public:
foo *p;// я создал поле класса , что является указателем типа foo.
создавать то я создаю, но видимо всей сути не понимаю.
на что влияет тип foo ? о чем он будет говорить компилятору?
};
int main(){


return 0;
}
мне даже самому не посебе от мысли, что не понимаю таких вещей. не поленитесь-растолкуйте


Ответ на: комментарий от linuxpc

Можно вернуться к твоим первоначальным вопросам. Дальше тебе станет понятно, или ты совсем запутаешься.

#include <iostream>

class foo {
   public:
    foo *p;
};

int main(){
    return 0;
}

В большинстве случаев синтаксис C++, читается справа на лево.

class foo { – это строчка читается так. Мы объявили идентификатор (имя) foo. Дальше foo это идентификатор класса. После этой строчки компилятор уже знает, что обозначает foo. Никакого выделения памяти еще нету.

Дальше в секции public идет строчка foo *p;. Она читается так . Объявляется идентификатор p. Который обозначает указатель, т.к. слева стоит звездочка. Дальше, p это указатель на класс foo. Память опять же, еще не выделяется.


Мы знаем, что любой указатель занимает в памяти 8 байт (в 64-битной системе) и по сути является целым числом обозначающим адрес памяти.

Теперь, чем отличаются

foo *p;
int *i;

Здесь я могу привести два примера:

  1. Звёздочка, в зависимости от места применения в коде, может обозначать разыменование указателя. Например, *i = 5. Здесь важно знать тип указателя. Иначе, мы просто не будем знать, что хранится в области памяти, на который указывает указатель, и не сможем сделать присвоение.

  2. Работа с наборами объектов, хранящимися последовательно в памяти (можно сказать, что с массивами). Мы можем выделить память из несколько объектов foo *p = new foo[10]; и затем, используя указатель, работать с этим массивом объектов: p[1] – первый объект массива являющимся классом foo. Т.к. зная тип указателя, мы знаем размер объекта по расположенного по этому адресу.

neon1ks ★★
()
Ответ на: комментарий от linuxpc

Автор, а зачем вообще тебе всё это?

Deleted
()

о чем он будет говорить компилятору?

Для начала, о размере поля p - внезапно, не все указатели имеют одинаковый размер, например, указатель на метод класса может иметь размер больше void*

А в остальном поведение будет во много похоже на поведение foo p, только с косвенными обращениями (->)

annulen ★★★★★
()
Ответ на: комментарий от linuxpc

а почему foo нужен для указателя ? почему не int?

Чтобы ты получил ошибку компиляции при несоотвествии типов в коде. Так-то можно и в void* почти все (см. выше) хранить и кастить перед использованием

annulen ★★★★★
()
Ответ на: комментарий от thunar

огромное спасибо

можно еще вопрос?

class foo{
int x;
int *dump;
int a=3;
while(a--){
*p=new foo;
p->x=a;
}
std::cout <<2+p->x;// на бредовый пример не обращайте внимания. это просто так.
вот когда я захочу получить доступ ко второму элементу, который лежит в динамически выделенной памяти, с помощью указателя на эту память, то как это все будет происходить?

цикл завершить свою работу, в «p' будет лежать указатель на какой-то адрес. то есть, когда цикл только совершил одну итерацию он присвоил четыре. на последней итерации он присвоил нуль. так что будет лежать в „p“ когда я к ней обращусь вот так++p ? адрес нуля или четверки, перед тем как „P“ будет инкремирована? дело в том,что я хоть делаю так --p хоть так++p разницы нет. пожалуйста скажите, чтобы ходить вот так по адресам, нужно только инкремировать? --P это действие компилятор не понимает?

linuxpc
() автор топика
Ответ на: комментарий от linuxpc
while(a--){
    *p=new foo;
}

Здорово память потекла С:

когда цикл только совершил одну итерацию он присвоил четыре

откуда взялось 4?

так что будет лежать в „p“ когда я к ней обращусь вот так++p ?

Ты сдвинешь значение указателя на размер p, обратившись к следующему элементу. Вот только, если смотреть на тот цикл, что ты написал, то он нифига не гарантирует, что слева или справа от p будет то, что ты навыделял, потому ты запросто попадёшь на какой-то мусор.

пожалуйста скажите, чтобы ходить вот так по адресам, нужно только инкремировать? --P это действие компилятор не понимает?

Понимает. Но ты что-то страшное творишь в своём коде, потому я бы не обижался на компилятор.

Reineke
()
Ответ на: комментарий от thunar

Доебать нас идиоскими вопросами.

anonymous
()
Ответ на: комментарий от Reineke

давайте уточним пожалуйста... то есть если я выделял динамическую память p=new foo например в цикле с тремя итерациями, то на последней итерации я могу вернутся вот таким способом --p; я могу вернуться на предпоследний кусок выделенной димически памяти. так? могу же?

linuxpc
() автор топика
Ответ на: комментарий от thunar

да я хочу изучить c++ . учитель в нашей шараге явно не преследует такой цели. сначала мы начали изучить чистый си. он нам говорил, что когда познакомимся со структурами, то плавно передем на классы в с++ и так постепенно изучим ооп. потому как си с++ имеют почти одинаковый синтаксис.и действительно все было разумно, мы подготавливали базу для изучения ооп.

и тут учитель делает какую-то страшную вещь: он начинает объяснять нам классы на примере с# то есть мы бросаем все что изучали, берем вообще незнакомый нам язык программирования и на его примере будет изучать классы и ооп в целом. ну да ладно, казалось бы, что такого... изучим язык с# ну и потом ооп на его примере. да не изучим. нам отведено часов с гулькин член. сейчас пока ознакомимся с синтаксисом с# останется часов 15, и тогда препод выдаст за эти часы полную кашу,постоянно будет отсылать нас к сИ , говоря, вот классы это как структуры, помните мы с вами изучали их на си? но вот это почти тоже самое. блииииин!!!!!!! зачем ? откуда такая тупость. бросить все, взять полностью незнакомый язык и на его примере изучать такую сложную вещь, как ооп. есть же C++! синтаксис один в один. почти тот же си но с возможностью ооп. так бери и изучай на его примере. все правильно, одно вытекает из другого. что я неправ? ну давайте тогда переменные начнем изучать на паскале, функции на примере питона, циклы на примере jawa, а ооп на примере c#. такое чувство что специально делают чтобы ничего не поняли. а потом приходися заходить на форум и просить ПОЖАЛУйста объясните тему уважаемые форумчане, что такое классы, что поля. где помогут, где пошлют на х.... ну вас понять можно. вам то это нафиг. вот преподы, им прощения нет. но еще больше вымораживает группа псевдо гениев, которая делает вид что все понимает, но не понимает главного, что их имеют во все мыслимые и не мыслимые места, весь преподавательский состав вместе с администрацией учебного заведения, то есть шараги. но это отдельная тема не связанная с ооп.

linuxpc
() автор топика
Ответ на: комментарий от linuxpc

кто обосрался? все. преподы дают фигню, одногруппники «делают вид, что понимают». Один ты Д'Артаньян. Haha, classic Может наконец сядешь сам чему-то учиться, а не будешь спихивать вину на одних и задрачивать других?

anonymous
()
Ответ на: комментарий от anonymous

а я что делаю? на новый год я не телок целовал и наплясывал ,а плюсы изучал. правильно, преподы будут в носу ковырять, а я буду лет пять пытаться сам изучить то,что можно было изучить за пару месяцев,если бы вдруг они вспомнили что они преподаватели, а клоуны.

то что Вы сказали очень интересно... это как если бы Вы сели в автобус,чтобы доехать до работы например, а водитель бы вышел и сказал: слушай,может быть ты уже сам будешь ходить до работы, своими ножками , а не ждать,когда я тебя довезу.... ну маразм же. правда? только тогда будет лад,когда каждый начнет делать то что должен. я должен учиться, учитель должен-учить. свою функцию я выполняю. дело за учителями. тут точка.

linuxpc
() автор топика
Ответ на: комментарий от linuxpc

я буду лет пять пытаться сам изучить то,что можно было изучить за пару месяцев,если бы вдруг они вспомнили что они преподаватели, а клоуны.

Ору в голос.

я должен учиться

Ну вот иди и учись.

anonymous
()
Ответ на: комментарий от linuxpc

я должен учиться

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

anonymous
()
Ответ на: комментарий от anonymous

да, знаете ли в тех условиях,что я, где -40, даже притащить свою тушку в шарагу, это уже подвиг. учителя это даже за деньги делают с трудом. для них обучение, это реально труд. ведь именно за труд они деньги получают. но иногда они переигрывают. поверьте , если бы бог и родители постарались и я имел бы ум, хотя бы столько чтобы мог читать маны и понимать их, то не унижался бы на форумах в просьбах объяснить. взял бы да прочитал. а так приходится. но я уже привык. и любой подачке и снисхождению форумчан, когда они по причине может быть хорошего настроения изволят мне объяснить что-то , то я рад больше ребенка, получившиму конфету. так что не надо обвинять меня за то что я достал весь форум тупыми вопросами. что мол не хочу учиться и прочее. это очень глупо с вашей стороны . думаю,что многие помнят темы,где я даже не мог включить пк. сегодня благодаря форуму ,я это делаю легко и непринужденно.

linuxpc
() автор топика
Ответ на: комментарий от linuxpc

Тут такое дело: если ты в принципе не в состоянии самообучаться и находить решения своих проблем в интернетах, программист из тебя получится никакой. И никакие шараги тебе не помогут.

annulen ★★★★★
()
Ответ на: комментарий от linuxpc

Давайте, вы всё таки просто постараетесь спокойно и предметно сформулировать вопрос?

Изучение программирования, это всё таки прежде всего изучение алгоритмов, структур данных, парадигм и теории типов, это вполне можно изучить и в том числе на других языках, местами даже проще, т.к. С/С++ довольно запутаны и полны UB из за крайне неудачного синтаксиса. Но, тем не менее они вполне изучается самостоятельно, в т.ч. по онлайн курсам.

thunar ★★★★★
()
Последнее исправление: thunar (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.