ООП аббревиатура от "Обьектно Ориентированное Программирование"
Начал изучать С++
Модератор: Модераторы разделов
-
- Сообщения: 227
- ОС: Gentoo o_O
Re: Начал изучать С++
НЕ ПАНИКУЙ © ^_~
-
- Сообщения: 158
- ОС: Bluewhite64 12.2
Re: Начал изучать С++
--=Civil696=-- писал(а): ↑02.03.2008 19:46
ООП аббревиатура от "Обьектно Ориентированное Программирование"
А что значит объектно-ориентированное программирование? В чем отличие от необъектно-ориентированного? Конкретным простеньким примером показать сможете?Так чтоб понятно было (если умеете объяснять)
"Ubuntu" is an ancient African word, that means "I can't configure Slackware"
-
- Сообщения: 636
- ОС: Debian GNU/Linux
Re: Начал изучать С++
andreas90 писал(а): ↑02.03.2008 19:35Да, вы правы. gcc -o proga proga.cc -lstdc++ действительно работает. Буду знать на будущее. Вы говорите "g++ отличается от gcc тем, что при вызове компоновщика указывает некоторые дополнительные библиотеки, специфичные для C++ кода". Если я вас правильно понял, это основное отличие gcc от g++? А сколько всего этих отличных библиотек и как они называются?
Судя по всему libstdc++ это она и есть. Не копал глубоко в этом направлении.
-
- Сообщения: 73
- ОС: KUbuntu 8.04 Hardy Heron
Re: Начал изучать С++
ООП - это объектно-ориентированное программирование. Если читаете книжку по Си++, в которой не рассказывается, что это такое, можете смело выбрасывать книгу. От ее прочтения будет только хуже.
-
- Сообщения: 158
- ОС: Bluewhite64 12.2
Re: Начал изучать С++
Да, вы знаете в моих книгах упомянутых выше это не раскрыто. Вернее нашел только вот что
' объектная ориентированность означает что он поддерживает стиль программирования упрощающий кодирование крупномасштабных проектов и обеспечивающий их расширение" - не густо. Голые слова, суть я не понял.
" идея ОПП - технологии, позволяющие достичь простоты структуры и управляемости очень крупных систем" - тоже ничего не понятно.
Везде общие слова, все об этом говорят, но объяснить конкретно ничего не могут.
Возьмите любой необъектно ориентированный язык - разве нельзя с их помощью управлять крупными системами? (Примеры?)
И вообще что значит крупная система(примеров нет)
"Ubuntu" is an ancient African word, that means "I can't configure Slackware"
-
- Модератор
- Сообщения: 1786
- Статус: Матёрый линуксоид
- ОС: Debian testing/unstable
Re: Начал изучать С++
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
-
- Сообщения: 636
- ОС: Debian GNU/Linux
Re: Начал изучать С++
andreas90 писал(а): ↑02.03.2008 20:35Да, вы знаете в моих книгах упомянутых выше это не раскрыто. Вернее нашел только вот что
' объектная ориентированность означает что он поддерживает стиль программирования упрощающий кодирование крупномасштабных проектов и обеспечивающий их расширение" - не густо. Голые слова, суть я не понял.
" идея ОПП - технологии, позволяющие достичь простоты структуры и управляемости очень крупных систем" - тоже ничего не понятно.
Везде общие слова, все об этом говорят, но объяснить конкретно ничего не могут.
Возьмите любой необъектно ориентированный язык - разве нельзя с их помощью управлять крупными системами? (Примеры?)
И вообще что значит крупная система(примеров нет)
Статистика говорит, что если писать систему в чистом процедурном стиле, то примерно после 100 тысяч строк проект станет невозможно сопровождать. Грамотное применение ОО-стиля позволяет избежать этого.
Сразу скажу, что можно писать на С в ОО-стиле, так что к языку это отношения не имеет.
Ещё скажу, что ссылок не дам, т.к. читал про это давно.
Ну и добавлю напоследок, что поначалу можно не забивать себе этим голову. Я считаю, что начал понимать ООП примерно после полугода программирования на джаве, имея уже пару лет опыта на С++. Просто после n-й книжки и n-й килостроки кода мне в голову стукнуло, что ООП это просто полиморфизм. А наследование с виртуальной таблицей всего лишь способ реализации полиморфизма. И это не более чем инструмент, которому надо не молиться а использовать когда это удобно. Так же как и функционалный стиль, например.
-
- Сообщения: 227
- ОС: Gentoo o_O
Re: Начал изучать С++
andreas90 писал(а): ↑02.03.2008 19:58--=Civil696=-- писал(а): ↑02.03.2008 19:46
ООП аббревиатура от "Обьектно Ориентированное Программирование"
А что значит объектно-ориентированное программирование? В чем отличие от необъектно-ориентированного? Конкретным простеньким примером показать сможете?Так чтоб понятно было (если умеете объяснять)
Как я уже писал выше я тоже новичок
И не являясь не программистом, не преподавателем я наврятли смогу "на пальцах" обьяснить то что знаю и понимаю недостаточно глубоко.
надеюсь если что меня поправят
Первое что как я думаю бросится вам в глаза будет скажем так "размер строительных блоков" из которых вы строите программу
если в структурном программировании таким "блоком" является функция которая в свою очередь состоит из операторов языка и других функций
то в обьектно-ориентированном программировании "блоком" является обьект заключающий в себе некие данные и набор функций для работы с ними
при этом они (данные и функции) могут быть открытыми (доступными функциям не принадлежащим данному обьекту) - public
и закрытыми (доступными только функциям содержащимся в данном обьекте) - private
для создания обьекта используется класс (т.е в C++ для этих целей используется класс) класс это своего рода "чертёж" для строительства обьекта, несущий в себе описание его структуры т.е во первых перечисление того какие функции и данные являются у нас открытыми, какие закрытыми, а во вторых собственно объявления этих функций и данных
при этом на основе одного и того же класса мы можем создать много одинаковых обьектов хранящих в себе разные (по значениям) данные
вобщем всё выше написанное в данном посте демонстрирует лишь то что объяснять я не умею, зато очень люблю давать советы, и пользуясь случаем советую вам раздобыть книжку в которой доступно обьясняется "что есть что и почему оно не одно и тоже"
НЕ ПАНИКУЙ © ^_~
-
- Сообщения: 3339
- ОС: Slackware 12.2, ArchLinux 64
Re: Начал изучать С++
Вот что такое ООП.
Полиморфизм и оверлоадинг.
Код: Выделить всё
#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;
}
Полиморфизм и оверлоадинг.
-
- Сообщения: 2493
- ОС: SuseLinux 11.2 KDE 4.3
Re: Начал изучать С++
Лафоре "Объектно орентированное программирование в С++" автору в помощь
-
- Сообщения: 158
- ОС: Bluewhite64 12.2
Re: Начал изучать С++
Спасибо за наводку, уже скачиваю
"Ubuntu" is an ancient African word, that means "I can't configure Slackware"
-
- Сообщения: 585
- Статус: Программист С++
- ОС: Debian GNU/Linux
Re: Начал изучать С++
(drBatty) писал(а):разница вот в чём: С++ это ООП, а просто Си - нет. Ну это грубо, конечно, так, приближённо.
Это очень приближенно.
Во-первых, С++ - это не только ОО-язык. Объектно-ориентированное программирование - это лишь одна из пяти парадигм, поддерживаемых С++. Да, ОО-парадигме уделяется весьма большое внимание, и можно сказать, что именно эта парадигма для С++ является основной (и то как посмотреть), но она никак не единственная.
Во-вторых, на С тоже можно писать объектно-ориентированные программы. Однако этот язык не поддерживает ООП непосредственно. Впрочем, этот факт не делает С плохим языком, просто С не задумывался как ОО-язык (по историческим причинам).
-
- Сообщения: 585
- Статус: Программист С++
- ОС: Debian GNU/Linux
Re: Начал изучать С++
(andreas90) писал(а):' объектная ориентированность означает что он поддерживает стиль программирования упрощающий кодирование крупномасштабных проектов и обеспечивающий их расширение" - не густо. Голые слова, суть я не понял.
И не удивительно, что вы не поняли! Это действительно голые слова, совершенно не объясняющие суть ООП. Это лишь косвенная характеристика преимуществ ООП, однако никак не раскрытие ее сути.
(andreas90) писал(а):" идея ОПП - технологии, позволяющие достичь простоты структуры и управляемости очень крупных систем" - тоже ничего не понятно.
Елки-палки, да что там за книги у вас? Эти слова также не объясняют, что такое ООП.
(andreas90) писал(а):Возьмите любой необъектно ориентированный язык - разве нельзя с их помощью управлять крупными системами?
Можно. И примеры тому есть.
(andreas90) писал(а):И вообще что значит крупная система
Ну, понятие "крупная", конечно, относительно, однако примеры привести можно.
Например, ядро Linux. Уже к версии 2.6.20 ядро насчитывало около 20 тысяч файлов исходников и заголовочников, а количество фактических строк кода было около 6 миллионов. Вот это крупная система.
Или OpenOffice. Количество фактических строк кода в нем, насколько я знаю, около 30 миллионов.
Хотя, конечно, количество строк кода как таковое может не совсем объективно отражать истинную величину и сложность программного продукта.
-
- Сообщения: 585
- Статус: Программист С++
- ОС: Debian GNU/Linux
Re: Начал изучать С++
(v04bvs) писал(а):Статистика говорит, что если писать систему в чистом процедурном стиле, то примерно после 100 тысяч строк проект станет невозможно сопровождать.
Ну, не то что невозможно, а (скорее всего) очень трудно.
(v04bvs) писал(а):Грамотное применение ОО-стиля позволяет избежать этого.
Во-во! Чрезвычайно важное уточнение: грамотное применение. Как бы странно ни звучало, но неграмотное применение ОО-парадигмы может сделать программу только хуже. Это я на собственном опыте убедился.
(v04bvs) писал(а):Сразу скажу, что можно писать на С в ОО-стиле, так что к языку это отношения не имеет.
Как и на С++ - не в ОО-стиле...
Ну, уважаемый Uncle_Theodore, разве можно вот так сразу! Человек же про фундаментальные азы спрашивал, а вы ему сразу чисто виртуальные функции показываете.
(v04bvs) писал(а):Ну и добавлю напоследок, что поначалу можно не забивать себе этим голову. Я считаю, что начал понимать ООП примерно после полугода программирования на джаве, имея уже пару лет опыта на С++. Просто после n-й книжки и n-й килостроки кода мне в голову стукнуло, что ООП это просто полиморфизм. А наследование с виртуальной таблицей всего лишь способ реализации полиморфизма. И это не более чем инструмент, которому надо не молиться а использовать когда это удобно. Так же как и функционалный стиль, например.
Вот тут, уважаемый v04bvs, готов с вами подискутировать.
Во-первых, я убежден в том, что чем раньше начинающий программист поймет сущность ОО-парадигмы, тем лучше для него самого. Честно говоря, несколько удивлен, что вы начали понимать ООП, имея уже пару лет опыта на С++. Сущность ООП, на мой взгляд, предельно проста для понимания. Сложными могут быть лишь частные случае реализации ООП в конкретном проекте.
Сущность ООП состоит в том, что в центре внимания при разработке программного проекта стоит объект, являющийся частным выражением некоторого класса. А весь программный продукт является, по сути, системой из (некоторым образом) взаимодействующих друг с другом объектов одного или более классов. В принципе, все.
Во-вторых, вы сказали, что "ООП - это просто полиморфизм". Не могу согласиться с таким мнением. В центре ОО-парадигмы стоит не полиморфизм (даже при всей его важности и значимости), а инкапсуляция. Потому что полиморфизм относится к категории взаимоотношений объектов, а инкапсуляция - к сущности самого объекта. Полиморфное поведение объектов может быть чрезвычайно полезным (или даже необходимым) в конкретной программе, однако лично я считаю, что отсутствие полиморфизма в программе вовсе не говорит об отсутствии в ней ОО-парадигмы. Впрочем, я знаю, что многие авторы прекрасных книг по С++ с моим последним утверждением не согласились бы.
-
- Сообщения: 32
- ОС: Debian GNU/Linux, *ubuntu
Re: Начал изучать С++
Выбросьте вы этих отечественных недоавторов.
Для начинающих:
Лучшая книга по C++ Лафоре Р. - Объектно-ориентированное программирование в С++
Дейтелы последней редакции Как программировать на C++ тоже хороши.
Для начинающих:
Лучшая книга по C++ Лафоре Р. - Объектно-ориентированное программирование в С++
Дейтелы последней редакции Как программировать на C++ тоже хороши.
-
- Сообщения: 636
- ОС: Debian GNU/Linux
Re: Начал изучать С++
С удовольствием.
Во-первых, я убежден в том, что чем раньше начинающий программист поймет сущность ОО-парадигмы, тем лучше для него самого.
Я убеждён в том, что сначала нужно хорошо понять алгоритмы и структуры данных. Чтобы не пугаться слов «хеш-таблица» например. Дальше уже можно накручивать разнообразные парадигмы.
Честно говоря, несколько удивлен, что вы начали понимать ООП, имея уже пару лет опыта на С++.
Возможно я не так выразился. Объекты я писал ещё в 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 */
Это, конечно не ООП-стиль. Но он вполне демонстрирует инкапсуляцию, и, вообще говоря, подобный стиль используется практически во всех программах среднего и крупного размеров, которые я видел.
Я бы сказал, что без инкапсуляции и модульности программировать нетривиальные системы, командами из более чем двух программистов, не получится вообще. И здесь ООП никак не поможет. Максимум — небольшой синтаксический сахарок даст.
Потому что полиморфизм относится к категории взаимоотношений объектов, а инкапсуляция - к сущности самого объекта. Полиморфное поведение объектов может быть чрезвычайно полезным (или даже необходимым) в конкретной программе, однако лично я считаю, что отсутствие полиморфизма в программе вовсе не говорит об отсутствии в ней ОО-парадигмы. Впрочем, я знаю, что многие авторы прекрасных книг по С++ с моим последним утверждением не согласились бы.
В общем моя мысль такая: если я использую С++, я получаю удобный механизм для полиморфизма. Он действительно намного удобней, чем вручную использовать таблицы виртуальных методов в С. Но особых плюсов для инкапсуляции я не получаю.
-
- Сообщения: 585
- Статус: Программист С++
- ОС: Debian GNU/Linux
Re: Начал изучать С++
(v04bvs) писал(а):Сущность ООП, на мой взгляд, предельно проста для понимания. Сложными могут быть лишь частные случае реализации ООП в конкретном проекте.
Сущность ООП состоит в том, что в центре внимания при разработке программного проекта стоит объект, являющийся частным выражением некоторого класса. А весь программный продукт является, по сути, системой из (некоторым образом) взаимодействующих друг с другом объектов одного или более классов. В принципе, все.
Это слова, не более. И они никак не помогут писать ОО-системы. Я могу создать класс Main и писать в процедурном стиле, используя его методы в качестве процедур и его поля в качестве глобальных переменных. Очевидно, это не совсем то, что надо.
Да, это просто слова, однако они являются выражением моего понимания того, что есть ООП. Вы действительно можете написать такой класс и использовать его поля в качестве глобальных переменных. Однако, как вы верно заметили, это не совсем то, что надо. Я бы сказал, это совсем не то, что надо. Ведь если вы позволяете прямой доступ к полям класса, то это грубейшее нарушение инкапсуляции. Фактически, экземпляр такого класса - это даже не объект, а С-подобная структура, представляющая собой, по сути, собранные вместе данные. Но это не объект с точки зрения ООП.
(v04bvs) писал(а):Инкапсуляция стоит в центре всегда.
Согласен с вами. Инкапсуляция стоит не только в центре ООП.
(v04bvs) писал(а):В общем моя мысль такая: если я использую С++, я получаю удобный механизм для полиморфизма. Он действительно намного удобней, чем вручную использовать таблицы виртуальных методов в С. Но особых плюсов для инкапсуляции я не получаю.
И здесь я согласен с вами в том, что С++ предоставляет удобный механизм для полиморфизма.
Вообще, утверждение о том, что инкапсуляция стоит в центре ОО-парадигмы - это не мое мнение. Так в своей книге "Новые сложные задачи на С++" написал Герб Саттер, глава Комитета по стандартизации С++. Мнению такого профессионала я доверяю. Он вообще говорит, что полиморфизм - это частный случай инкапсуляции. Вот его слова: "Инкапсуляция - не всегда полиморфизм, но полиморфизм - всегда форма инкапсуляции".
-
- Сообщения: 636
- ОС: Debian GNU/Linux
Re: Начал изучать С++
deninok писал(а): ↑03.03.2008 21:27Да, это просто слова, однако они являются выражением моего понимания того, что есть ООП. Вы действительно можете написать такой класс и использовать его поля в качестве глобальных переменных. Однако, как вы верно заметили, это не совсем то, что надо. Я бы сказал, это совсем не то, что надо. Ведь если вы позволяете прямой доступ к полям класса, то это грубейшее нарушение инкапсуляции.
Отчего же. У нас есть только методы этого класса, все его поля вполне можно сделать закрытыми.
Вообще, утверждение о том, что инкапсуляция стоит в центре ОО-парадигмы - это не мое мнение. Так в своей книге "Новые сложные задачи на С++" написал Герб Саттер, глава Комитета по стандартизации С++. Мнению такого профессионала я доверяю. Он вообще говорит, что полиморфизм - это частный случай инкапсуляции. Вот его слова: "Инкапсуляция - не всегда полиморфизм, но полиморфизм - всегда форма инкапсуляции".
То, что полиморфизм - форма инкапсуляции, звучит интересно. Я об этом не задумывался. На досуге обязательно почитаю. Впрочем это, честно говоря, уже больше игра словами и определениями. Для меня это слишком тонкая материя

-
- Сообщения: 585
- Статус: Программист С++
- ОС: Debian GNU/Linux
Re: Начал изучать С++
(v04bvs) писал(а):Отчего же. У нас есть только методы этого класса, все его поля вполне можно сделать закрытыми.
Вот именно! Можно сделать. Впрочем, не просто можно, но нужно, потому что члены-данные класса всегда должны быть закрытыми (если только это не С-подобная структура).
(v04bvs) писал(а):То, что полиморфизм - форма инкапсуляции, звучит интересно... Впрочем это, честно говоря, уже больше игра словами и определениями.
Да, вероятно, вы правы.
-
- Сообщения: 2
Re: Начал изучать С++
Извините что я не в тему, но я ведь тоже "Начал изучать С++", точнее хочу! но я правда потратил много времени на поиски ответа на этом форуме, но не смог найти, подскажите пожалуйста, буду очень благодарен!
Я создал файл-программу с расширением welcom.C следующего содержания:
// Первая программа на C++
#include <iostream.h>
main ()
{
cout << "Добро пожаловать в C++!\n";
return 0; //показывает, что программа успешно окончена
}
Скомпилировал файл командой: g++
У меня появился исполняемый загрузочный модуль, т.е. файл a.out
Далее, как написано в книжке Х.Дейтел.
Следующий этап называется загрузка. Это делается с помощью загрузчика, который забирает исполняемй модуль с диска и перемещает его в память.
Я не понял, как это делается, т.е. с помощью какого "загрузчика"? как это сделать, разместить программу в памяти и выполнить ее?
Я создал файл-программу с расширением welcom.C следующего содержания:
// Первая программа на C++
#include <iostream.h>
main ()
{
cout << "Добро пожаловать в C++!\n";
return 0; //показывает, что программа успешно окончена
}
Скомпилировал файл командой: g++
У меня появился исполняемый загрузочный модуль, т.е. файл a.out
Далее, как написано в книжке Х.Дейтел.
Следующий этап называется загрузка. Это делается с помощью загрузчика, который забирает исполняемй модуль с диска и перемещает его в память.
Я не понял, как это делается, т.е. с помощью какого "загрузчика"? как это сделать, разместить программу в памяти и выполнить ее?
-
- Сообщения: 1073
- Статус: столлманист
- ОС: Debian GNU/Linux
Re: Начал изучать С++
Забудьте про это, пока.
Файл можете запустить так:
./a.out
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
М. В. Ломоносов
-
- Сообщения: 1095
- Статус: -
- ОС: GNU/Linux
Re: Начал изучать С++
Akayama вот тут почитайте еще
http://ubuntuforums.org/showthread.php?t=689635
http://ubuntuforums.org/showthread.php?t=689635
-
- Сообщения: 2
Re: Начал изучать С++
Voice спасибо большое, получилось, программа выполнилась, буду знать
, а то для меня это было просто головоломкой.
Nymin, спасибо, прочитаю.

Nymin, спасибо, прочитаю.