Начал изучать С++

Модератор: Модераторы разделов

Аватара пользователя
--=Civil696=--
Сообщения: 227
ОС: Gentoo o_O

Re: Начал изучать С++

Сообщение --=Civil696=-- »

andreas90 писал(а):
02.03.2008 19:35
Расшифруйте, пожалуйста, мне необразованному что такое ОПП

ООП аббревиатура от "Обьектно Ориентированное Программирование"
НЕ ПАНИКУЙ © ^_~
Спасибо сказали:
Аватара пользователя
andreas90
Сообщения: 158
ОС: Bluewhite64 12.2

Re: Начал изучать С++

Сообщение andreas90 »

--=Civil696=-- писал(а):
02.03.2008 19:46
andreas90 писал(а):
02.03.2008 19:35
Расшифруйте, пожалуйста, мне необразованному что такое ОПП

ООП аббревиатура от "Обьектно Ориентированное Программирование"

А что значит объектно-ориентированное программирование? В чем отличие от необъектно-ориентированного? Конкретным простеньким примером показать сможете?Так чтоб понятно было (если умеете объяснять)
"Ubuntu" is an ancient African word, that means "I can't configure Slackware"
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Начал изучать С++

Сообщение v04bvs »

andreas90 писал(а):
02.03.2008 19:35
Да, вы правы. gcc -o proga proga.cc -lstdc++ действительно работает. Буду знать на будущее. Вы говорите "g++ отличается от gcc тем, что при вызове компоновщика указывает некоторые дополнительные библиотеки, специфичные для C++ кода". Если я вас правильно понял, это основное отличие gcc от g++? А сколько всего этих отличных библиотек и как они называются?

Судя по всему libstdc++ это она и есть. Не копал глубоко в этом направлении.
Спасибо сказали:
Аватара пользователя
azrael
Сообщения: 73
ОС: KUbuntu 8.04 Hardy Heron

Re: Начал изучать С++

Сообщение azrael »

ООП - это объектно-ориентированное программирование. Если читаете книжку по Си++, в которой не рассказывается, что это такое, можете смело выбрасывать книгу. От ее прочтения будет только хуже.
Спасибо сказали:
Аватара пользователя
andreas90
Сообщения: 158
ОС: Bluewhite64 12.2

Re: Начал изучать С++

Сообщение andreas90 »

azrael писал(а):
02.03.2008 20:19
ООП - это объектно-ориентированное программирование. Если читаете книжку по Си++, в которой не рассказывается, что это такое, можете смело выбрасывать книгу. От ее прочтения будет только хуже.


Да, вы знаете в моих книгах упомянутых выше это не раскрыто. Вернее нашел только вот что
' объектная ориентированность означает что он поддерживает стиль программирования упрощающий кодирование крупномасштабных проектов и обеспечивающий их расширение" - не густо. Голые слова, суть я не понял.
" идея ОПП - технологии, позволяющие достичь простоты структуры и управляемости очень крупных систем" - тоже ничего не понятно.
Везде общие слова, все об этом говорят, но объяснить конкретно ничего не могут.
Возьмите любой необъектно ориентированный язык - разве нельзя с их помощью управлять крупными системами? (Примеры?)
И вообще что значит крупная система(примеров нет)
"Ubuntu" is an ancient African word, that means "I can't configure Slackware"
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: Начал изучать С++

Сообщение Portnov »

Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Начал изучать С++

Сообщение v04bvs »

andreas90 писал(а):
02.03.2008 20:35
Да, вы знаете в моих книгах упомянутых выше это не раскрыто. Вернее нашел только вот что
' объектная ориентированность означает что он поддерживает стиль программирования упрощающий кодирование крупномасштабных проектов и обеспечивающий их расширение" - не густо. Голые слова, суть я не понял.
" идея ОПП - технологии, позволяющие достичь простоты структуры и управляемости очень крупных систем" - тоже ничего не понятно.
Везде общие слова, все об этом говорят, но объяснить конкретно ничего не могут.
Возьмите любой необъектно ориентированный язык - разве нельзя с их помощью управлять крупными системами? (Примеры?)
И вообще что значит крупная система(примеров нет)



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

Сразу скажу, что можно писать на С в ОО-стиле, так что к языку это отношения не имеет.

Ещё скажу, что ссылок не дам, т.к. читал про это давно.

Ну и добавлю напоследок, что поначалу можно не забивать себе этим голову. Я считаю, что начал понимать ООП примерно после полугода программирования на джаве, имея уже пару лет опыта на С++. Просто после n-й книжки и n-й килостроки кода мне в голову стукнуло, что ООП это просто полиморфизм. А наследование с виртуальной таблицей всего лишь способ реализации полиморфизма. И это не более чем инструмент, которому надо не молиться а использовать когда это удобно. Так же как и функционалный стиль, например.
Спасибо сказали:
Аватара пользователя
--=Civil696=--
Сообщения: 227
ОС: Gentoo o_O

Re: Начал изучать С++

Сообщение --=Civil696=-- »

andreas90 писал(а):
02.03.2008 19:58
--=Civil696=-- писал(а):
02.03.2008 19:46
andreas90 писал(а):
02.03.2008 19:35
Расшифруйте, пожалуйста, мне необразованному что такое ОПП

ООП аббревиатура от "Обьектно Ориентированное Программирование"

А что значит объектно-ориентированное программирование? В чем отличие от необъектно-ориентированного? Конкретным простеньким примером показать сможете?Так чтоб понятно было (если умеете объяснять)

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

надеюсь если что меня поправят

Первое что как я думаю бросится вам в глаза будет скажем так "размер строительных блоков" из которых вы строите программу
если в структурном программировании таким "блоком" является функция которая в свою очередь состоит из операторов языка и других функций
то в обьектно-ориентированном программировании "блоком" является обьект заключающий в себе некие данные и набор функций для работы с ними
при этом они (данные и функции) могут быть открытыми (доступными функциям не принадлежащим данному обьекту) - public
и закрытыми (доступными только функциям содержащимся в данном обьекте) - private
для создания обьекта используется класс (т.е в C++ для этих целей используется класс) класс это своего рода "чертёж" для строительства обьекта, несущий в себе описание его структуры т.е во первых перечисление того какие функции и данные являются у нас открытыми, какие закрытыми, а во вторых собственно объявления этих функций и данных
при этом на основе одного и того же класса мы можем создать много одинаковых обьектов хранящих в себе разные (по значениям) данные

вобщем всё выше написанное в данном посте демонстрирует лишь то что объяснять я не умею, зато очень люблю давать советы, и пользуясь случаем советую вам раздобыть книжку в которой доступно обьясняется "что есть что и почему оно не одно и тоже"
НЕ ПАНИКУЙ © ^_~
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Начал изучать С++

Сообщение Uncle_Theodore »

Вот что такое ООП.

Код: Выделить всё

#include<iostream>

using namespace std;

class shape{
public:
  virtual void draw()=0;
  virtual ~shape(){};
};

class square: public shape{
public:
  double side;
  void draw(){
    cout << "drawing a square of side " << side << endl;
  };
  square(double ss){
    side = ss;
  };
};

class circle: public shape{
public:
  double radius;
  void draw(){
    cout << "drawing a circle of radius " << radius << endl;
  };
  circle(double rad){
    radius = rad;
  };
};

int main(){

  shape *arr[2];
  arr[0]=new square(12.0);
  arr[1] = new circle(3.0);

  for (int i=0;i<2;i++){
    arr[i]->draw();
    delete arr[i];
  };

  return 0;
}


Полиморфизм и оверлоадинг.
Спасибо сказали:
Olegator
Сообщения: 2493
ОС: SuseLinux 11.2 KDE 4.3

Re: Начал изучать С++

Сообщение Olegator »

Лафоре "Объектно орентированное программирование в С++" автору в помощь
Спасибо сказали:
Аватара пользователя
andreas90
Сообщения: 158
ОС: Bluewhite64 12.2

Re: Начал изучать С++

Сообщение andreas90 »

Olegator писал(а):
02.03.2008 21:37
Лафоре "Объектно орентированное программирование в С++" автору в помощь

Спасибо за наводку, уже скачиваю
"Ubuntu" is an ancient African word, that means "I can't configure Slackware"
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: Начал изучать С++

Сообщение deninok »

(drBatty) писал(а):разница вот в чём: С++ это ООП, а просто Си - нет. Ну это грубо, конечно, так, приближённо.

Это очень приближенно.
Во-первых, С++ - это не только ОО-язык. Объектно-ориентированное программирование - это лишь одна из пяти парадигм, поддерживаемых С++. Да, ОО-парадигме уделяется весьма большое внимание, и можно сказать, что именно эта парадигма для С++ является основной (и то как посмотреть), но она никак не единственная.
Во-вторых, на С тоже можно писать объектно-ориентированные программы. Однако этот язык не поддерживает ООП непосредственно. Впрочем, этот факт не делает С плохим языком, просто С не задумывался как ОО-язык (по историческим причинам).
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: Начал изучать С++

Сообщение deninok »

(andreas90) писал(а):' объектная ориентированность означает что он поддерживает стиль программирования упрощающий кодирование крупномасштабных проектов и обеспечивающий их расширение" - не густо. Голые слова, суть я не понял.

И не удивительно, что вы не поняли! Это действительно голые слова, совершенно не объясняющие суть ООП. Это лишь косвенная характеристика преимуществ ООП, однако никак не раскрытие ее сути.

(andreas90) писал(а):" идея ОПП - технологии, позволяющие достичь простоты структуры и управляемости очень крупных систем" - тоже ничего не понятно.

Елки-палки, да что там за книги у вас? Эти слова также не объясняют, что такое ООП.

(andreas90) писал(а):Возьмите любой необъектно ориентированный язык - разве нельзя с их помощью управлять крупными системами?

Можно. И примеры тому есть.

(andreas90) писал(а):И вообще что значит крупная система

Ну, понятие "крупная", конечно, относительно, однако примеры привести можно.
Например, ядро Linux. Уже к версии 2.6.20 ядро насчитывало около 20 тысяч файлов исходников и заголовочников, а количество фактических строк кода было около 6 миллионов. Вот это крупная система.
Или OpenOffice. Количество фактических строк кода в нем, насколько я знаю, около 30 миллионов.
Хотя, конечно, количество строк кода как таковое может не совсем объективно отражать истинную величину и сложность программного продукта.
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: Начал изучать С++

Сообщение deninok »

(v04bvs) писал(а):Статистика говорит, что если писать систему в чистом процедурном стиле, то примерно после 100 тысяч строк проект станет невозможно сопровождать.

Ну, не то что невозможно, а (скорее всего) очень трудно.

(v04bvs) писал(а):Грамотное применение ОО-стиля позволяет избежать этого.

Во-во! Чрезвычайно важное уточнение: грамотное применение. Как бы странно ни звучало, но неграмотное применение ОО-парадигмы может сделать программу только хуже. Это я на собственном опыте убедился.

(v04bvs) писал(а):Сразу скажу, что можно писать на С в ОО-стиле, так что к языку это отношения не имеет.

Как и на С++ - не в ОО-стиле...

(Uncle_Theodore) писал(а):Вот что такое ООП.



Полиморфизм и оверлоадинг.

Ну, уважаемый Uncle_Theodore, разве можно вот так сразу! Человек же про фундаментальные азы спрашивал, а вы ему сразу чисто виртуальные функции показываете.

(v04bvs) писал(а):Ну и добавлю напоследок, что поначалу можно не забивать себе этим голову. Я считаю, что начал понимать ООП примерно после полугода программирования на джаве, имея уже пару лет опыта на С++. Просто после n-й книжки и n-й килостроки кода мне в голову стукнуло, что ООП это просто полиморфизм. А наследование с виртуальной таблицей всего лишь способ реализации полиморфизма. И это не более чем инструмент, которому надо не молиться а использовать когда это удобно. Так же как и функционалный стиль, например.

Вот тут, уважаемый v04bvs, готов с вами подискутировать.
Во-первых, я убежден в том, что чем раньше начинающий программист поймет сущность ОО-парадигмы, тем лучше для него самого. Честно говоря, несколько удивлен, что вы начали понимать ООП, имея уже пару лет опыта на С++. Сущность ООП, на мой взгляд, предельно проста для понимания. Сложными могут быть лишь частные случае реализации ООП в конкретном проекте.
Сущность ООП состоит в том, что в центре внимания при разработке программного проекта стоит объект, являющийся частным выражением некоторого класса. А весь программный продукт является, по сути, системой из (некоторым образом) взаимодействующих друг с другом объектов одного или более классов. В принципе, все.
Во-вторых, вы сказали, что "ООП - это просто полиморфизм". Не могу согласиться с таким мнением. В центре ОО-парадигмы стоит не полиморфизм (даже при всей его важности и значимости), а инкапсуляция. Потому что полиморфизм относится к категории взаимоотношений объектов, а инкапсуляция - к сущности самого объекта. Полиморфное поведение объектов может быть чрезвычайно полезным (или даже необходимым) в конкретной программе, однако лично я считаю, что отсутствие полиморфизма в программе вовсе не говорит об отсутствии в ней ОО-парадигмы. Впрочем, я знаю, что многие авторы прекрасных книг по С++ с моим последним утверждением не согласились бы.
Спасибо сказали:
Аватара пользователя
unisky
Сообщения: 32
ОС: Debian GNU/Linux, *ubuntu

Re: Начал изучать С++

Сообщение unisky »

Выбросьте вы этих отечественных недоавторов.
Для начинающих:
Лучшая книга по C++ Лафоре Р. - Объектно-ориентированное программирование в С++
Дейтелы последней редакции Как программировать на C++ тоже хороши.
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Начал изучать С++

Сообщение v04bvs »

deninok писал(а):
03.03.2008 11:07
Вот тут, уважаемый v04bvs, готов с вами подискутировать.

С удовольствием.

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

Я убеждён в том, что сначала нужно хорошо понять алгоритмы и структуры данных. Чтобы не пугаться слов «хеш-таблица» например. Дальше уже можно накручивать разнообразные парадигмы.

Честно говоря, несколько удивлен, что вы начали понимать ООП, имея уже пару лет опыта на С++.

Возможно я не так выразился. Объекты я писал ещё в 9 классе и полиморфизм понимал. Но это, как бы сказать.. Не думал я этим. Я думал процедурами, и потом транслировал эту модель на объекты. Я, честно говоря, затрудняюсь формально описать что я имел в виду под пониманием ООП.

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

Это слова, не более. И они никак не помогут писать ОО-системы. Я могу создать класс Main и писать в процедурном стиле, используя его методы в качестве процедур и его поля в качестве глобальных переменных. Очевидно, это не совсем то, что надо.

Во-вторых, вы сказали, что "ООП - это просто полиморфизм". Не могу согласиться с таким мнением. В центре ОО-парадигмы стоит не полиморфизм (даже при всей его важности и значимости), а инкапсуляция.

Инкапсуляция стоит в центре всегда. Простейший пример на С:

Код: Выделить всё

   #ifndef STACK_H
   #define STACK_H

     struct stack;

     struct stack *stack_create();
     void stack_push(struct stack *stack, void *value);
     void *stack_pop(struct stack *stack);
     void stack_free(struct stack *stack);

   #endif /* STACK_H */

Это, конечно не ООП-стиль. Но он вполне демонстрирует инкапсуляцию, и, вообще говоря, подобный стиль используется практически во всех программах среднего и крупного размеров, которые я видел.
Я бы сказал, что без инкапсуляции и модульности программировать нетривиальные системы, командами из более чем двух программистов, не получится вообще. И здесь ООП никак не поможет. Максимум — небольшой синтаксический сахарок даст.

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

В общем моя мысль такая: если я использую С++, я получаю удобный механизм для полиморфизма. Он действительно намного удобней, чем вручную использовать таблицы виртуальных методов в С. Но особых плюсов для инкапсуляции я не получаю.
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: Начал изучать С++

Сообщение deninok »

(v04bvs) писал(а):
Сущность ООП, на мой взгляд, предельно проста для понимания. Сложными могут быть лишь частные случае реализации ООП в конкретном проекте.
Сущность ООП состоит в том, что в центре внимания при разработке программного проекта стоит объект, являющийся частным выражением некоторого класса. А весь программный продукт является, по сути, системой из (некоторым образом) взаимодействующих друг с другом объектов одного или более классов. В принципе, все.

Это слова, не более. И они никак не помогут писать ОО-системы. Я могу создать класс Main и писать в процедурном стиле, используя его методы в качестве процедур и его поля в качестве глобальных переменных. Очевидно, это не совсем то, что надо.

Да, это просто слова, однако они являются выражением моего понимания того, что есть ООП. Вы действительно можете написать такой класс и использовать его поля в качестве глобальных переменных. Однако, как вы верно заметили, это не совсем то, что надо. Я бы сказал, это совсем не то, что надо. Ведь если вы позволяете прямой доступ к полям класса, то это грубейшее нарушение инкапсуляции. Фактически, экземпляр такого класса - это даже не объект, а С-подобная структура, представляющая собой, по сути, собранные вместе данные. Но это не объект с точки зрения ООП.

(v04bvs) писал(а):Инкапсуляция стоит в центре всегда.

Согласен с вами. Инкапсуляция стоит не только в центре ООП.

(v04bvs) писал(а):В общем моя мысль такая: если я использую С++, я получаю удобный механизм для полиморфизма. Он действительно намного удобней, чем вручную использовать таблицы виртуальных методов в С. Но особых плюсов для инкапсуляции я не получаю.

И здесь я согласен с вами в том, что С++ предоставляет удобный механизм для полиморфизма.
Вообще, утверждение о том, что инкапсуляция стоит в центре ОО-парадигмы - это не мое мнение. Так в своей книге "Новые сложные задачи на С++" написал Герб Саттер, глава Комитета по стандартизации С++. Мнению такого профессионала я доверяю. Он вообще говорит, что полиморфизм - это частный случай инкапсуляции. Вот его слова: "Инкапсуляция - не всегда полиморфизм, но полиморфизм - всегда форма инкапсуляции".
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Начал изучать С++

Сообщение v04bvs »

deninok писал(а):
03.03.2008 21:27
Да, это просто слова, однако они являются выражением моего понимания того, что есть ООП. Вы действительно можете написать такой класс и использовать его поля в качестве глобальных переменных. Однако, как вы верно заметили, это не совсем то, что надо. Я бы сказал, это совсем не то, что надо. Ведь если вы позволяете прямой доступ к полям класса, то это грубейшее нарушение инкапсуляции.

Отчего же. У нас есть только методы этого класса, все его поля вполне можно сделать закрытыми.

Вообще, утверждение о том, что инкапсуляция стоит в центре ОО-парадигмы - это не мое мнение. Так в своей книге "Новые сложные задачи на С++" написал Герб Саттер, глава Комитета по стандартизации С++. Мнению такого профессионала я доверяю. Он вообще говорит, что полиморфизм - это частный случай инкапсуляции. Вот его слова: "Инкапсуляция - не всегда полиморфизм, но полиморфизм - всегда форма инкапсуляции".

То, что полиморфизм - форма инкапсуляции, звучит интересно. Я об этом не задумывался. На досуге обязательно почитаю. Впрочем это, честно говоря, уже больше игра словами и определениями. Для меня это слишком тонкая материя :) Я предпочитаю более конкретные примеры, которые полезны в практическом плане.
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: Начал изучать С++

Сообщение deninok »

(v04bvs) писал(а):Отчего же. У нас есть только методы этого класса, все его поля вполне можно сделать закрытыми.

Вот именно! Можно сделать. Впрочем, не просто можно, но нужно, потому что члены-данные класса всегда должны быть закрытыми (если только это не С-подобная структура).

(v04bvs) писал(а):То, что полиморфизм - форма инкапсуляции, звучит интересно... Впрочем это, честно говоря, уже больше игра словами и определениями.

Да, вероятно, вы правы.
Спасибо сказали:
Akayama
Сообщения: 2

Re: Начал изучать С++

Сообщение Akayama »

Извините что я не в тему, но я ведь тоже "Начал изучать С++", точнее хочу! но я правда потратил много времени на поиски ответа на этом форуме, но не смог найти, подскажите пожалуйста, буду очень благодарен!

Я создал файл-программу с расширением welcom.C следующего содержания:

// Первая программа на C++
#include <iostream.h>

main ()
{
cout << "Добро пожаловать в C++!\n";

return 0; //показывает, что программа успешно окончена
}

Скомпилировал файл командой: g++
У меня появился исполняемый загрузочный модуль, т.е. файл a.out
Далее, как написано в книжке Х.Дейтел.
Следующий этап называется загрузка. Это делается с помощью загрузчика, который забирает исполняемй модуль с диска и перемещает его в память.
Я не понял, как это делается, т.е. с помощью какого "загрузчика"? как это сделать, разместить программу в памяти и выполнить ее?
Спасибо сказали:
Аватара пользователя
Voice
Сообщения: 1073
Статус: столлманист
ОС: Debian GNU/Linux

Re: Начал изучать С++

Сообщение Voice »

Akayama писал(а):
06.11.2008 00:46
Я не понял, как это делается, т.е. с помощью какого "загрузчика"? как это сделать, разместить программу в памяти и выполнить ее?

Забудьте про это, пока.

Файл можете запустить так:
./a.out
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
Спасибо сказали:
Nymin
Сообщения: 1095
Статус: -
ОС: GNU/Linux

Re: Начал изучать С++

Сообщение Nymin »

Akayama вот тут почитайте еще
http://ubuntuforums.org/showthread.php?t=689635
Спасибо сказали:
Akayama
Сообщения: 2

Re: Начал изучать С++

Сообщение Akayama »

Voice спасибо большое, получилось, программа выполнилась, буду знать :) , а то для меня это было просто головоломкой.
Nymin, спасибо, прочитаю.
Спасибо сказали: