ну под рукой нет конечно. но на самом деле - так и есть. конечно, компилятор может и не так считать. ЧСХ - стандарт это позволяет. С++ специально так построен - там костыль на костыле: например
глупый вопрос, а где стандарт скачать?
Настоятельно просим вас при общении соблюдать Правила форума и законы РФ. Наша тематика вне политики, поэтому воздержитесь от обсуждения ситуации на Украине и связанных с ней событий, независимо от того, какую сторону вы поддерживаете.
Также напоминаем, что наш форум находится в доменной зоне .ru, физически расположен на российских серверах и мы соблюдаем действующее законодательство России. Любые сообщения о политике будут удаляться.
Linux Forum → Разговоры о Linux и не только → Различия в языках программирования C и C++
Чтобы отправить ответ, вы должны войти или зарегистрироваться
ну под рукой нет конечно. но на самом деле - так и есть. конечно, компилятор может и не так считать. ЧСХ - стандарт это позволяет. С++ специально так построен - там костыль на костыле: например
глупый вопрос, а где стандарт скачать?
нагуглил стандарт 98-го года... похоже всё так и есть, т.е. при записи "int a;" идёт речь о создании объекта a типа int... но ИРЛ отичий от си нет...
но ИРЛ отичий от си нет...
в том-то и дело, что IRL с int никто дела не имеет...
т.е. при записи "int a;" идёт речь о создании объекта a типа int... но ИРЛ отичий от си нет...
тут основное отличие в том, что вообще говоря, в С++ пишется
int x(17);// конструктор копий int::int(int)а в Си
int x = 17;/* обявление переменной x и запись туда 17и */в ++ тоже можно как в Си, но это костыль для совместимости.
конструктор копий и оператор = в плюсах (для совместимости) заданы по умолчанию, и осуществляют копирование байт-в-байт. Эти грабли могут очень больно долбануть кодера по его глупой башке. Посему, обычно конструктор копий и оператор= закрываются:
class foo
{
private:
const foo &operator=(const foo &) {}
foo(const foo &) {}
public:
};пользователь класса лишается возможности случайно сделать копию.
Тут про наследование говорили - те ещё вилы
Дело в том, что деструктор не наследуется в базовом классе от производного. Потому, если в производном классе выделено 100500 памяти, и уничтожается объект как базовый (обычная практика) - привет утечки памяти
Лекарство - надо делать виртуальные деструкторы. (виртуальные нормально наследуются).
ну и опять таки: в Си есть операторы (+,-,%,^...), а вот в С++ есть методы (которые, ЧСХ, называются oerator'ы). В итоге:
x = y + z; /* складываем y с z, и результат пишем в x */А в С++
x = y + z;// эквивалентно
x.operator=(y.operator+(z));// причём все эти операторы могут быть разные, для разных x, y и z.
// ИЧСХ по умолчанию задан лишь operator=, и то, всего один
// ИЧСОХ для встроенных типов есть встроенные операторы, которые работают почти как в СиdrBatty пишет:да не разу он не совместим. встроенный тип int на самом деле - встроенный тип. Это имитация целого числа. На самом деле, это класс, со своими методами и со своими конструкторами.
вас опять понесло? это в java так вроде
Ни фига подобного wink
Ни фига подобного
моя ошибка... перепутал с чем-то... в каком-то ЯП можно даже наследовать от базовых типов(в каком не помню...)
Fat-Zer, Basic вроде бы...
Delphi очень похоже.
я не понял.
в с++ код утилизируется при помощи классов, если длинна кода в обоих случаях (с и с++) одинакова, как заявил док, то как он утилизируется в с?
он жеж структурный.. нет классов.. за счет чего длинна кода равная?
Basic вроде бы...
Delphi очень похоже.
странно... ни то ни другое почти не знаю))
в с++ код утилизируется при помощи классов, если длинна кода в обоих случаях (с и с++) одинакова, как заявил док, то как он утилизируется в с?
всё так только в теории... на практике для простых типов машинный код получается одинаковый с точностью до порядка некоторых команд и некоторых странных действий... на самом деле в стандарте я нашёл только косвенные намёки на то, что для простых типов вызываются "операторы"... так что голову этим можно себе не забивать. (ещё раз подчеркну, что речь идёт только о простых типах)
в с++ код утилизируется при помощи классов, если длинна кода в обоих случаях (с и с++) одинакова, как заявил док, то как он утилизируется в с?
обычно длинна кода в С++ несколько больше. КАЖУЩАЯСЯ простота кода С++ объясняется просто: мы например можем использовать чужие классы, причём делать это очень элегантно. К примеру, у нас есть массив в С, мы хотим его отсортировать. Если в С для этого применить qsort (из стандартной либы), получится:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static int
cmpstringp(const void *p1, const void *p2)
{
/* The actual arguments to this function are "pointers to
pointers to char", but strcmp(3) arguments are "pointers
to char", hence the following cast plus dereference */
return strcmp(* (char * const *) p1, * (char * const *) p2);
}
int
main(int argc, char *argv[])
{
int j;
if (argc < 2) {
fprintf(stderr, "Usage: %s <string>...\n", argv[0]);
exit(EXIT_FAILURE);
}
qsort(&argv[1], argc - 1, sizeof(char *), cmpstringp);
for (j = 1; j < argc; j++)
puts(argv[j]);
exit(EXIT_SUCCESS);
}Совсем другой коленкор, если мы имеем абстрактный базовый класс collection. Нам надо сделать следующее:
1) унаследовать свой класс element от класса collection_element
2) перезагрузить функцию collection_element::compare() своей element::compare()
3) и всё. теперь мы смело можем писать my_collection.qsort();
Вот только, qsort от этого не стала не проще, и не быстрее. (медленнее тоже не стала, ибо оптимизирующий компилятор выкинет весь лишний синтаксический мусор. И указатель на функцию так и останется, правда спрятанный в VTable экземпляра класса.).
он жеж структурный.. нет классов.. за счет чего длинна кода равная?
процессор всё равно не структурный, а функциональный. В процессоре нету никаких классов. Потому, из C++ получается что-то вроде C, а уж него - ассемблер.
В моём примере, на самом деле, компилятор превращает гламурное my_collection.qsort(); в готичное
qsort(&argv[1], argc - 1, sizeof(char *), cmpstringp);
при этом, сам подставляет все эти ужасные типы, и сам заботится о деталях (в частности, куда указывает cmpstringp в данный момент времени. Это плюшка на самом деле приколочена к любому классу с виртуальными функциями. Только кодер её не видит. Но она есть. Дизассемблер вам поможет её увидеть.).
на практике для простых типов машинный код получается одинаковый с точностью до порядка некоторых команд и некоторых странных действий... на самом деле в стандарте я нашёл только косвенные намёки на то, что для простых типов вызываются "операторы"... так что голову этим можно себе не забивать.
угу. вот только не следует думать, что если ваш класс отлично работает с типом int, то вы можете отдать его другим программистам, и он будет хоть как-то работать с их типами. Сила С++ в том и заключается, что можно один раз написать класс который сортирует, а потом им сортировать что угодно. Если "не забивать голову", то ваш класс никому будет не нужен. В том числе и вам. Ибо отсортировать ваши инты проще без создания отдельного класса только для этого.
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Linux Forum → Разговоры о Linux и не только → Различия в языках программирования C и C++
Форум работает на PunBB, при поддержке Informer Technologies, Inc