какая разница между использованием структур и классов
в c++ разница только по дефолтовым модификаторам доступа и наследования. У struct - public, у class - private
И еще есть какая-то тонкая разница, настолько тонкая, что я ее не помню...
механизм конструкторов и деструкторов по умолчанию был создан именно для struct-ов
я вот подозреваю, что если написал
struct X{int x;};
class Y{int y;}
то так уже не напишешь:
struct Y yyy;
class X xxx;
я просто к тому что структура не может быть описана без конструктора/деструктора по умолчанию, а класс может.
class A
{
public:
A(int, int){}
};
struct B
{
public:
B(int, int){}
};
int main
{
B y;
A x;
}
d:\Users\Sergey\printf_test\printf_test.cpp(19) : error C2512: 'B' : no appropriate default constructor available
d:\Users\Sergey\printf_test\printf_test.cpp(20) : error C2512: 'A' : no appropriate default constructor available
ты про такое?.. и в чем разница?
Контраргумент:
struct A {
int a_;
A(int a) : a_(a) {};
};
main {
A a;
}
$ gcc 1.cpp -o 1
1.cpp: In function `int main':
1.cpp:6: error: no matching function for call to `A::A'
1.cpp:1: error: candidates are: A::A(const A&)
1.cpp:3: error: A::A(int)
gcc (GCC) 3.3.3 (Debian 20040429)
у меня ms cl 13.10.3077
для структуры обязательно наличие по умолчанию:
конструктора, деструктора, оператора присванивания и конструктора копирования, потому как если этого не будет описано
то семантика типа данных "структура" изменится.
Для класса же эти обязательные условия не важны.
с точки зрения реализации в языке С++ особой разницы нет, поэтому были введены понятия конструкторов
деструктров и т.д. по умолчанию дабы можно было реализовать стандартную "структуру" языка С.
А Atilla с самого начала всё сказал правильно.
я просто дополнил атиллу
ну это скорее концептуальная поправка... чем структура Си или структура Си++ ведущая себя как структура Си, отличается от класса Си++
нужно было иметь возможность заставить пользователя не менять семантику типа данных "С-структуры", сделать это можно было введя ограничения. И все это дерьмо только из соображений совместимости с С. Без этих изъебов с совместимостью получился бы намного красивый, гибкий и простой язык программирования
да какое ограничение? есть дефолтовый конструктор. Пока в классе/структуре никакого конструктора нет (а в Си-шных структурах это так он есть, как только ты какой-либо конструктор объявляешь - он пропадает. Это касается как класса, так и структур Си++. Так что синтаксической разница в ключевых словах struct и class - только в public/private
считай что Строуструпу было влом заниматься тупой реализацией структур и он решил облегчить себе жизнь более изощренным способом.
поэтому в такой реализации разницы нет, кроме как модификаторов доступа по умолчанию.
кстати вот в шарпе структуры и классы принципиально различаются.
а
С и С++ - ацтой
как и все остальное.
С и С++ по сравнению с имеющимися средствами - ацтой.
Что скажешь?
все имеющееся хуже чем ацтой.
Для удобного написания оптимальных программ именно c++ лучше всего подходит, по крайней мере я больше не знаю языка, подходящего под эту задачу.
А ты, вообще, много языков знаешь?
Расшифруй, плиз, что значит словосочетание "оптимальная программа".
Ну из основынх на сегодня, вроде бы со всеми знакомился, на некоторых работал проффесионально, разве что с Адой не разбирался.
По большому счету в смысле производительности по процессору.
Лучше список "основных на сегодня" приведи, тогда будет проще дисскутировать.
Про какой класс программ ты говоришь?
C++, Delphi, VB, C#, Java.
А какая разница если речь о производительности.
Если ты это всё знаешь на уровне, то "профессионально" - это неверная оценка
А ты посмотри сколько времени уже прошло... В то время я только начинал на с++ профессионально.
Программы для того же Крея на C++ тоже не напишешь.
Программы, которые обрабатывают большие объемы данных пишут на Sql-е, а не на C++
Высокопроизводительный телекомуникационный софт пишут на всякой экзотике
и т.д.
Поэтому стоит очертить класс-задач для которых ты объявляешь C++ высокопроизводительным языком.
Гы-гы
Ладно, подождём, пока ты напишешь очередную лажу
Инерция мышления.
интересно, на чём написан биллинг МТС-а, что он тормозной такой
Ну дык на фортране библиотек научных море, вот и пишут, хотя и на с++ под суперкомпьютеры нередко пишут.
>Программы, которые обрабатывают большие объемы данных пишут на Sql-е, а не на C++
Ты лучше подумай на чем сами базы данных пишут...
>Высокопроизводительный телекомуникационный софт пишут на всякой экзотике
Тут ничего не скажу, но наверняка и с++ используют.
>Поэтому стоит очертить класс-задач для которых ты объявляешь C++ высокопроизводительным языком.
В общем я имею в виду системное ПО ну и игры.
С утм сравнил?
На С их тоже прекрасно пишут, очень много и самых разных
Статистики не имею, но сдаётся мне, что фортран всё-таки постепенно умирает
>Программы, которые обрабатывают большие объемы данных пишут на Sql-е, а не на C++
Это команды для них пишут на sql, а вот сами они как раз на С (С++ ?) написаны
Ну почему ж обязательно на с или с++, подойдет любой из вышеназванных языков, все они с SQL запросами умеют работать.
Не тупи.
Я говорю про популярные реализации СУБД, а не про прикладной (к ним) софт.
perl рулит?
В язык фортран специально оговаривается, как проводятся вычисления, для того, чтобы не было проблем с окрулениями, потерями точности и т.д.
Поэтому там где компилятор C++ пытается выжать максимум скорости, компилятор фортрана старается получить правильный результат.
Пример:
[c]
double sum = 0;
for (int i = 0; i < 1e8; ++i)
{
sum = 100 - f(i);
}
[/c]
Оптимизирующий компилятор C++ из этого сделает следующее:
[c]
double sum = 1e10;
for (int i = 0; i < 1e6; ++i)
sum -= f(i);
[/c]
и это будет неправильно, т.к. если f(i) очень маленькая, то будет идти потеря точности, и результат будет неправильным.
угу. а больше всего в мире VB-программистов тоже почему-то
Это команды для них пишут на sql
если имел ввиду реализации так бы и писал - реализации, а не команды на sql...
А на C++ пишут только команды, которые указывают компилятору, какие маш. коды надо генерировать.
Это продолжение твоей логики.
Тебе абсурдность твоего утверждения видна?
В теории - да. На практике, никто не умеет на нем писать программы (отличные от тривиальных которые работают быстрее чем C.
поэтому периодически в с-коде мелькают вставки ассемблера
Ну дык они, как правило, тривиальны...
ты наверное не пробовал написать что-нибудь махонькое на асме и фортране и сравнить производительность? попробуй. удивишься
я не считаю, что маленький по размеру == тривиальный, дальше говори только о своих вставках
> На практике, никто не умеет на нем писать программы
Я с тобой согласен, поэтому и намекаю, что язык надо рассматривать не с идеальной точки зрения, а с реальной.
Насколько быструю программу напишет на этом языке реальный программист за реальное время, и насколько реальное качество (масштабируемость, изменяемость, отсутствие ошибок, переносимость, повторность использования и т.д.) будет у получившейся программы.
Т.е. все твои маленькие вставки нетривиальны, силен
Поэтому маш. код является более высокопроизводительном в идеальном случае.
забавная логика
Написанному на С/С++ компилятору, кстати
>Это продолжение твоей логики.
Абсурдное, причём
>Тебе абсурдность твоего утверждения видна?
Неа.
Сложности задач по написанию sql-запроса и по разработке СУБД, которая эти запросы перемалывает, отличаются на несколько порядков. (И, как правило, уровень интеллекта разработчиков примерно так же )
И как видим, вторую (сложную) задачу, научились пока только с помощью С нормально решать.
У тебя тоже, я же написал: "как правило"
Не факт.
Компиляторы чаще пишут на чем-нибудь своем (более заточенном для написанния компиляторов но при этом активно используют, конечно, C++-вставки.
"Легкую" (на твой взгляд) задачу по обработке больших сложных данных научились решать только на sql-е (на языке реляционной алгебры).
>Компиляторы чаще пишут на чем-нибудь своем (более заточенном для написанния компиляторов но при этом активно используют, конечно, C++-вставки.
Ну да, только все эти средства тоже на С написаны
Как и ОС, под которой это делается. И все остальные нетривиальные программы
интересно, на чём написан биллинг МТС-а, что он тормозной такой
на c++ и oracle sql.
с++ позволяет писать тормозные программы
Аргументы нужны?
естественно позволяет Как и любой другой язык программирования из ныне здравствующих.
Каким боком ты сюда C++ присобачишь? Хочешь сказать, что процессор будет на C++ написан?
Но как уже было выше сказано, asm не является реальным высокопроизводительным языком для больших систем.
>Каким боком ты сюда C++ присобачишь? Хочешь сказать, что процессор будет на C++ написан?
Но никому (пока?) не нужно.
У железячников своя специфика, VHDL или чо там щас модно.
Наезд насчёт "присобачишь" не понял, извини.
Основная масса кода все равно на с/с++...
> Это команды для них пишут на sql, а вот сами они как раз на С (С++ ?) написаны
Тоже самое можно сказать про любую программу и процессор.
Это только команды для них пишут на asm/C++/Java, а вот сами они (в данном случае процессоры) как раз на языке логический схем написаны.
Хочешь сказать, что из этого можно сделать вывод, что самым высокопроизводительным языком является язык логических схем?
Только речь шла о языках программирования, а язык логических схем вроде как не совсем к ним относится...
> Ну из основынх на сегодня, вроде бы со всеми знакомился, на некоторых работал проффесионально, разве что с Адой не разбирался.
> C++, Delphi, VB, C#, Java.
Это основые языки для написания программ десктопного класса.
Для написания программ из других классов используется еще масса языков.
И утверждение про C++ справедливо в первую очередь опять же только для десктопного класса программ.
На нем до сих пор пишут, например, когда разрабатывают какие-нибудь мелкие контроллеры (например, контроллер управления регулятора света и т.д.).
Ну не знаю, вот, например, под многие котроллеры/процессоры есть только с/с++ компилятор, ну и ассемблерный. Так что и там с++ властвует, а не только на десктопе.
Тогда давай и электронные схемы или чертежи доменной печи языками программирования назовем...
Это уже большие контроллеры.
В смысле?
Есть еще специализированные контроллеры (более мелкие) для которых C-компиляторов нет.
Ну не знаю, восьмибитовый контроллер это большой? Ну так вот, под них в основом либо только ассемблер, либо еще в придачу с/с++.
В случае, компилирующих языков таким исполнителем является компилятор, который генерирует набор команд уже непосредственно понятных исполнителю.
Для языка sql, исполнителем является база данных.
Для Java - JVM.
Для asm-а - процессор.
> Тогда давай и электронные схемы или чертежи доменной печи языками программирования назовем...
Электронные схемы - язык? А исполнитель кто? электрический ток?
чертежи - это язык программирования, т.к. есть исполнитель, например, строитель, и есть система команд (условные обозначения и т.д.)
да, большой, т.к. используется уже универсальный процессор.
DSP тоже вроде как в основном на с/с++ программируются, они ж не универсальные вроде как...
хуливоины.
Обращайся в администрацию (к модераторам)
а то порождает большое количество хуливоинов
Смысл использования языка логических схем следующий: пишется программа на этом языке, далее она компилируется для использования на универсальном контролере или даже обычном компьютере, далее при получении большого кол-во заказов и ее длительной отладки, данная программа опускается в процессор, т.е. выпускается специальная версия процессора, которая, напрямую, может выполнять данную программу.
А для логических схем исполнитель дух всевышний?
Не ну мы так в терминологии сейчас закопаемся. Вообще все вышеперечиленное это язык, только вот языком программироавния называется то, что предназначено для выполнения на процессоре.
ЯЗЫКИ ПРОГРАММИРОВАНИЯ, формальные языки для описания данных (информации) и алгоритма (программы) их обработки на ЭВМ. Основу языков программирования составляют алгоритмические языки. Первыми языками программирования были машинные языки, представляющие собой системы команд для конкретных ЭВМ. С развитием вычислительной техники появились более сложные языки программирования, ориентированные на решение различных задач: обработка экономической информации (кобол инженерные и научные расчеты (фортран обучение программированию (алгол-60, паскаль моделирование (слэнг, симула) и др. Расширение сферы использования ЭВМ привело к появлению многоцелевых (универсальных) языков программирования для записи алгоритмов решения задач практически из любой области (алгол-68, СИ, ПЛ/1 и др. а также языков программирования для персональных ЭВМ (бейсик, паскаль и др.). Для перевода (трансляции) описаний алгоритмов с одного языка программирования на другой, преимущественно на машинный язык, применяют специальные программы трансляторы.
www.km.ru
Транзистор/микросхема
Прога, доставшаяся мне в лабе по наследству, написана на фортране. Никаких особых библиотек вроде не используется, по крайней мере, когда я сумел-таки перегнать её в c++, ничего нового мне писать не пришлось.
Так вот фортрановский вариант почему-то просчитывается в десятки раз быстрее. ХЗ почему. Жаль.
Видимо, плохо перегнал.
Просто там реально много считается.
Не то что бы и пишется, сейчас CAD всякий используется, так что это писание вроде как и не писание, а drag & drop сплошной. Что ничем не отличает это "программирование" от любой другой инженерной деятельности...
на RISC процессорах зачастую компилятор генерирует более производительный код, чем человек может написать сам
во-вторых: понятие "Эвм" можно трактовать очень широко.
Глоссарий.ру: словари по естественным наукам
Язык программирования - искусственный (формальный) язык, предназначенный для записи алгоритмов. Язык программирования задается своим описанием и реализуется в виде специальной программы: компилятора или интерпретатора.
То же и для электронных схем...
значит электронные схемы являются тоже языком программирования
Тем не менее. Не может быть, чтобы фортран был в десятки раз быстрее С. Где-то что-то не учел, специфичное для С.
Допустим, автомобиль очень хорошо можно описать на каком нибудь языке, ну и съэмулировать его на компе. Ты хочешь сказать, что когда что-то эмулируют на компе, то это обязательно должно называться программированием?
Моё предположение - хреново реализован класс комплексных чисел
Когда ты для поисковой машины (yandex-а и т.д.) формируешь условие запроса - это тоже программирование (ты формируешь набор команд, а далее исполнитель(поисковая машина) - эту программу выполняет).
Сама эмуляция - нет
Формирование правил, по которым идет эмуляция - это программирование.
зы
Скажу сильнее: любое манипулирование чем-то/кем-то - это фактически программирование.
Запросто. Неправильные опции компилятора могут какой-то эффект дать.
Опции - по умолчанию для MSVS6.0. Вроде там оптимизация на максимуме. Как и у Compaq Visual Fortran 6.5.
По моему уж слишком все размыто, тебе не кажется?
может. точнее, если писать вычислительную хрень, особо не думая, там и там, то будет именно такой эффект
Высокопроизводительный телекомуникационный софт пишут на всякой экзотикеНа C что ли?
Все-таки манипулирование кодом и напрямую алгоритмами существенно отличается от прочей деятельности на компьютере.
> Программы, которые обрабатывают большие объемы данных пишут на Sql-е, а не на C++В качестве SQL там Oracle.
интересно, на чём написан биллинг МТС-а, что он тормозной такой
> Расчетные программы (в том числе и высокопроизводительные например, пишут почему-то на фортране.
Инерция мышления.
Отнюдь нет. У меня был сосед, который принимает участие в разработке Gaussian (химики в курсе). Он говорил, что fortran действительно самый подходящий язык.
>Программы, которые обрабатывают большие объемы данных пишут на Sql-е, а не на C++
Ты лучше подумай на чем сами базы данных пишут...
Ага, а в конце концов все можно свести к ассемблеру. И что?
Я в начале еще об удобстве писал...
>Программы, которые обрабатывают большие объемы данных пишут на Sql-е, а не на C++Грамотно написанное хранилище данных содержит бизнес логику в хранимых процедурах и триггерах на PL/SQL (или аналоге). Для алгоритмического (или ОО) языка остается только UI.
Это команды для них пишут на sql, а вот сами они как раз на С (С++ ?) написаны
Значит так написал, что второй человек тебя недопонял..
Пойду посыпать голову пеплом
> На C что ли?
например, тот же erlang
Да, размыто. И что в этом плохого?
ps
Самый высокоуровневым языком является "хочу программу, чтобы работала".
Сейчас компиляция такого языка занимает от полгода до 3 лет, и в качестве исполнителя требует команду программистов, и результат получается не совсем тот, что хотелось.
Но заметно, что с каждым годом (с каждым новым уровнем "машинных" языков) IT-отрасль все ближе и ближе подходит к этому языку.
Появились sql-базы (которым говорится, что есть такие данные, и что необходимо получить такую-то выборку а далее комп уже сам определяет, как эту выборку сделать.
Появились скрипты в большом кол-ве (perl, php, python и т.д. которые опять же просто определяют, что с данными надо сделать.
Появились языки Java и С#, в которых не надо разбираться с памятью напрямую, и которые сами проверяют разработчика, чтобы он не допустил ошибку по порче памяти.
Но всеж давай разделять конструирование с помощью компьютера, и программиорвание в узком смысле на языке программиорвания. Второе отличается от первого, тем что программисту приходится в явном виде формулировать алгоритмы, именно в этом смысле и был рзаговор о языках программирования в самом начале.
Какая мне разница, как программисту (как пользователю что там происходит внутри?
Я задал условие (входные данные) , задал то, что я хочу получить. Далее получил результат
Какая разница - как я задавал входные данные и как я задавал то, что хочу получить.
Главное, чтобы входные данные были корректными и задание того, что я хочу - было правильным (непротиворечивым, разрешимым и т.д.) - вот это и есть программирование.
Правильно описать, что у нас есть, и правильно описать то, что мы хотим получить - это и есть исскуство программирования. Все остальное - это некая рутинная работа, которая доступна любому рядовому кодировщику, любому рядовому (в будущем) компьютеру.
Если я неким формальным образом написал алгоритм, который может быть понятен другим человеком, но пока не может быть понятен компьютером, то почему - это не является языком программирования?
Взять тот же мат. аппарат - это язык программирования (причем даже полностью формальный т.к. мы можем формально задать условия задачи и формально с помощью мат. аппарата получить результат.
Но при этом компьютеры еще не умеют эффективно оперировать этим мат аппаратом.
В общем все уперлось в терминологию, считаю, что спор исчерпан...
Хм.
Только для некоторых видов "сложности".
Тождественность sql и реляционной алгебры мне тоже сомнительна.
Примеры:
- задачи, относящиеся обычно к области ИИ - причём даже модель данных там может быть реляционная
- поиск в слабоструктурированных данных - на обычных императивных языках вроде делают
иначе как ты сделаешь класс (для структуры тоже самое) с специальными конструктарами и без дефолтного
ОЧЕНЬ ВАЖНО иметь такую возможность
Для обработки больших объемов данных - да SQL, но... Согласно ISO9072 от 92 года этот язык был признан языком общения с БД, для которых и разрабатывался. А в другом формате хранить большие объемы данных неудобно и накладно.
Что кроме С(С++) или Java можешь предложить для прикладного использования и того же SQL для обычного человека?
А как же ASM? Самый рульный язык. Быстрее и мощнее его ещё не придумали (исклычая машинный код, что в принципе не сильно отличается)
"зачем читать, если можно писать?" (с)
Инерция мышления.
Причём здесь мышление ? Просто привычка.
5 баллов. Да, мышление может не использоваться в этих случаях.
Пиздёж, IMHO. Очень многие программы если написать на асме и на с,
то сишный вариант будет быстрее работать. Просто ты многих тонкостей
асемблера не знаешь -- в каком порядке лучше команды в цикле переставить и т.п.
двух векторов на си/фортране/асме и сравнить скорость.
И от него я слышал, что никто ещё ему не писал так, чтобы асемблер быстрее других
вариантов работал.
в такой постановке задача легко решается таймаутами
если я напишу скалярное произведение с помощью MMX/SSE, а компайлер их не поддерживает, то можно получить выигрыш раза в два-три
ms compiler что-ли ?
да в приниципе любой, если с дефолтовыми настройками. Вообще, компиляторы сильно разные бывают (в смысле производительности) и ведут себя по-разному.
> Пиздёж, IMHO. Очень многие программы если написать на асме и на с,
то сишный вариант будет быстрее работать.
Посмотри на это по другому.:
1. Пишем прогу на C
2. Компилируем
3. Смотрим на получившийся asm.
4. Руками чистим отдельные места
с#, vb
Оставить комментарий
marizha
в vc++ведь, как я понимаю они обладают одинаковыми возможностями... ну разве что кроме наследия, но оно мне сейчас не нужно и все что с ним связано...