Обсуждение:Си++: различия между версиями

Содержимое страницы недоступно на других языках.
Материал из Викиучебника — открытых книг для открытого мира
Содержимое удалено Содержимое добавлено
Строка 107: Строка 107:


Небольшой комментарий: автор явно сравнивает С89 и С++. В чем-то это имеет смысл, т.к. полной поддержкой C99 пока никто похвастаться не может. [[Служебная:Contributions/195.8.36.172|195.8.36.172]] 09:59, 8 апреля 2010 (UTC)
Небольшой комментарий: автор явно сравнивает С89 и С++. В чем-то это имеет смысл, т.к. полной поддержкой C99 пока никто похвастаться не может. [[Служебная:Contributions/195.8.36.172|195.8.36.172]] 09:59, 8 апреля 2010 (UTC)
*Автор использует явно что-то более старое, чем C89 для сравнения. --[[Служебная:Contributions/89.179.243.131|89.179.243.131]] 15:04, 1 августа 2010 (UTC)


А теперь ошибки:
А теперь ошибки:

Версия от 15:04, 1 августа 2010

Жду ваших комментариев! Andreyvit 17:17, 13 Июн 2005 (UTC)

Я бы не стал называть данное произведение "Объектно-ориентированное программирование". Скорее это "Отличия С и С++" В крайнем случае - "Объектно-ориентированное программирование на С++" необходимо вынести в заглавие. Termar 08:21, 13 сентября 2005 (UTC)[ответить]

Я написал статью по препроцессорным командам, куда добавлять? Alias 09:59, 16 мая 2006 (UTC)[ответить]

Думаю, следует создать страницу с подходящим названием. Например, Препроцессорные команды Си++? Тебе лучше знать. Ramir 10:31, 16 мая 2006 (UTC)[ответить]
Си++/Препроцессорные_директивы вот создал подстатью сейчас по-тихоньку дополняю её... её можно будет увидеть в оглавлении учебника? Alias 17:54, 7 августа 2006 (UTC)[ответить]
гм.. так и не добавили твою статью. попробую дополнить. Ixpict 23:47, 18 января 2007 (UTC)[ответить]

C++ для начинающих

Где можно найти материалы по С++ для начинающих ?

P.S. ... для СОВСЕМ начинающих ... --70.55.140.213 02:11, 30 мая 2006 (UTC)[ответить]

«Совсем» начинающие должны сперва изучить принципы программирования вообще (наш учебник пока не готов, ищите другие). Ибо Си++ довольно сложен и своеобразен, многие конструкции и правила запутают. А когда хорошо изучите программирование вообще, этот викиучебник вполне подойдёт. Иначе, чисто для ознакомления, поглядите р справочное руководство от Страуструпа. Ramir 05:26, 30 мая 2006 (UTC)[ответить]

Верстка

может порезать на несколько страниц? А то нажмешь на ссылку - а от туда такой талмуд падает :(

Совсем не разумею, в чём проблема. Ramir 20:08, 6 октября 2006 (UTC)[ответить]

Да, статья получилась слишком большая. Поэтому было бы желательно, разбить на страницы, одна страничка - одна глава. --85.182.5.167 13:49, 29 апреля 2007 (UTC)[ответить]

Кеша вернулся

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

Здорово, что тема «переменные / указатели / ссылки» продолжена. Но теперь не стоит ли чётко разделить синтаксические, семантические и, как бы сказать, социальные отличия? Лично я хотел бы, чтобы сравнение ссылок и указателей отличалось от сравнения ссылок и переменных уже заголовками. Может быть, называть разделы не «Сравнение … и …», а что-то вроде «Ссылки выглядят, как просто переменные» и «Внутри ссылки — это указатели». По-моему, сравнение малопохожих вещей (ссылок и просто переменных) создаёт у читателя ощущение, что они и вправду похожи; не думаю, что это целесообразно.

В разделе «Зачем нужны ссылки» указано про социальные последствия их применения. (Под социальными я понимаю уменьшение числа способов отстрелить себе ногу.) Есть смутное желание тоже давать это понять читателю более четко, хотя как именно, в голову сразу не приходит.

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

Есть идея. Кнут в своей книге про TeX специальным значком помечает материал, который можно упустить при первом чтении, но который весьма полезен при втором. В других книгах тоже такое бывает. Может, использовать и здесь? А то объём информации быстро превратит учебник в справочник.

Andreyvit 10:17, 9 декабря 2006 (UTC)[ответить]

Ссылки

Не названо главное отличие ссылок от указателей. А именно, указатели располагаются в памяти, а ссылки - нет, они (как и имена переменных) имеются только в пространстве языка, то есть в конечном счете - нигде. Это просто имена переменных для удобства обращения с ними. Добавить сто ссылок на одну переменную не отразится на конечном коде или содержимом памяти. А сто указателей будет занимать сто ячеек памяти. Такой взгляд сразу упрощает все, многие объяснения различий становятся не нужны. Рекомендую. 212.192.181.76 10:59, 11 марта 2008 (UTC)[ответить]



Дело в том, что реализация ссылок зависит от контекста в котором они описаны в программе. И далеко не всегда ссылка имеет смысл просто алиаса пременной (ее адреса), например:

void do_work( int & reference )
{
    reference = reference + 1;
}


int a = 1;
int b = 2;
int c = 3;

void main( )
{
    do_work( a );
    do_work( b );
    do_work( c );
}

Здесь, если функция "do_work" не описана как inline, ссылка "reference" реализуется путем автоматического выделения памяти для нее (чтобы хранить там адрес переданной переменной) на стеке всякий раз при вызове этой фукции, и увеличение значений переменных a, b и c происходит не напрямую, а косвенно (как через указатель). Если бы функция была объявлена как inline, компилятор мог бы просто подставить адреса этих переменных непосредственно в код тела функции при каждом вызове этой самой функции.

P.S. Хочу только добавить, что вышеприведенный код является лишь иллюстрацией реализации ссылок в общем случае, когда в качестве переменных, на которые идет ссылка из функции, могут выступать объекты классов. На практике такой код копилятор скорее всего оптимизирует сам, убрав вызовы функций, даже без явной пометки их как inline. Тоже самое касается возможности размещения адресов в регистрах процессора (что, кстати, также является использованием памяти, только еще более критичной по наличию) -- в общем случае при передачи большего числа параметров и/или вызове подфункций (что наиболее актуально) стековая память является практическим местом хранения значений для реализации ссылок как параметров функции.

Wikibooks user 10:45, 18 июля 2008 (UTC)[ответить]



Удалил следующие строки из первого примера кода с ссылками

double a[5];
double& b=a[3]; // Теперь b указывает на a[3].
b = 1.5; // то же самое, что а[3]=1.5;
b = exp(b)+b-5; // то же самое, что a[3]=exp(a[3])+a[3]-5

Причина: b = 1.5; // то же самое, что а[3]=1.5; Разве результат a[3] не по копии(семантически) возвращается? Засомневался, проверил:

       int a[5];
       a[3] = 5;
       printf("%d\n", a);

вывод: /tmp$ ./a.out -1080954640 08:22, 23 октября 2008 (UTC)

В строке printf("%d\n", a); у вас печатается адрес массива (а не его элемент). Какое это имеет отношение к ссылкам? --Urod 00:54, 19 ноября 2009 (UTC)[ответить]

Добавил комментарий к передаче по указателю

После предложения "Мы можем передать ей не саму переменную, а указатель", добавил "(и для C, и для C++)", во избежание каких-либо недопониманий со стороны новичков не знающих чистого C. 08:10, 23 октября 2008 (UTC)

Общие положения

"ибо они были кривые", надо бы как-нибудь по обоснованнее и понятнее новичкам написать. Rilium 20:05, 25 октября 2008 (UTC)[ответить]

Основные отличия Си++ от Си

Автор слишком много излагает необоснованных домыслов, с многими из которых, например я не согласен. Надо как-то сделать статью более нейтральной, а не пропогандой C++. --Xaionaro 08:22, 8 февраля 2010 (UTC)[ответить]

Небольшой комментарий: автор явно сравнивает С89 и С++. В чем-то это имеет смысл, т.к. полной поддержкой C99 пока никто похвастаться не может. 195.8.36.172 09:59, 8 апреля 2010 (UTC)[ответить]

А теперь ошибки:

Комментарии

Оба вида комментариев давно поддерживаются в Си. --Xaionaro 08:15, 8 февраля 2010 (UTC)[ответить]

Встроенные функции

Я так и не понял чем так плохи макросы. К тому же "inline" уже давно есть и в Си --Xaionaro 08:13, 8 февраля 2010 (UTC)[ответить]

Функции без аргументов и с неизвестными аргументами

Тоже давно есть в Си --Xaionaro 08:17, 8 февраля 2010 (UTC)[ответить]

Зачем нужны ссылки?

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

чем что? Чем передача указателя? Не надо, абсолютно тоже самое --Xaionaro 08:44, 8 февраля 2010 (UTC)[ответить]

Использование констант

Возможно, вы не поверите, но в Си этого сделать было нельзя

Ну. Вообще-то давно как можно :) --Xaionaro 10:00, 8 февраля 2010 (UTC)[ответить]

Статические массивы: что да как?

k[m] = 17;
0[&x] = x + x

может быть имелось ввиду "0[m+k]=17"? --Xaionaro 10:45, 8 февраля 2010 (UTC)[ответить]

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

для того, чтобы избежать такой проблемы, не надо вычислять "на ходу", надо лишь размер массива задавать не числом, а "константой" объявленной через "#define" или в худшем случае через "const" --Xaionaro 10:48, 8 февраля 2010 (UTC)[ответить]

Стандартная библиотека

Контейнеры - это template-ы классов, поддерживающих стандартные системы организации данных, таких как массив, односвязный и двусвязный списки и т.п. По сути это оболочка над контейнером, для которого перегружены операторы: ++, *, -- и может быть другие.

Контейнеры - это по сути оболочка на контейнером? Я наверное, как-то не так читаю, либо тут просто что-то не так. :) --Xaionaro 15:29, 8 февраля 2010 (UTC)[ответить]