Обсуждение:Си++

Материал из Викиучебника — открытых книг для открытого мира
Перейти к навигации Перейти к поиску
Это страница обсуждений и предложений для статьи Си++
Правила обсуждений

Жду ваших комментариев[править]

Жду ваших комментариев! 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)

  • Автор использует явно что-то более старое, чем C89 для сравнения. --89.179.243.131 15:04, 1 августа 2010 (UTC)

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

Комментарии[править]

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

Только в C99, с которым сравнивать некорректно, потому что нигде не реализовано. В C89 их НЕТ. --Urod 13:54, 30 августа 2010 (UTC)
Оба вида комментариев C99 поддерживаются тем же gcc(1), и, IIRC, довольно давно. — Ivan Shmakov (talk) 02:33, 27 августа 2013 (UTC)

Встроенные функции[править]

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

Только в C99, с которым сравнивать некорректно, потому что нигде не реализовано. В C89 их НЕТ. --Urod 13:55, 30 августа 2010 (UTC)
Inline-функции C99 поддерживаются тем же gcc(1), и, IIRC, довольно давно. — Ivan Shmakov (talk) 02:33, 27 августа 2013 (UTC)
Чем плохи макросы - см в любом руководстве по C++, начиная со Страуструпа. --Urod 13:55, 30 августа 2010 (UTC)

Описание переменных в середине блока[править]

Описание переменных в середине блока появилось в C99 и поддерживается тем же gcc(1); причем, IIRC, довольно давно. — Ivan Shmakov (talk) 02:33, 27 августа 2013 (UTC)

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

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

Они есть, но требуют void в скобках, что в C89, что в C99. В Си++ - не требуют. Как и сказано в тексте. --Urod 13:58, 30 августа 2010 (UTC)
Функции с неизвестными аргументами в Си действительно есть, но реализованы криво, см. [1] --Urod 13:58, 30 августа 2010 (UTC)

Зачем нужны ссылки?[править]

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

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

чем передача самой структуры --Urod 13:59, 30 августа 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)

static в функциях[править]

Не нашел в учебнике описания применения static к переменным в функциях и к глобальным переменным, может стоит добавить? Dis 12:30, 21 ноября 2010 (UTC)dis

Пространства имён[править]

Тут перепутаны и слеплены в одну кучу две разных сущности - пространства имён и области видимости. Надо что-то с этим делать. Либо переименовать подраздел, чтоб соответствовал контенту, что плохо, либо разбить на два, но это почти полная реструктуризация.

Уже начал реструктуризацию, но пока не закончил. Посему прошлое наполнение не трогал. Вообще же, похоже, от него мало что останется.

Фух. Вроде, всё. Осталось придумать, куда воткнуть безымянные пространства имён, и будет совсем всё.

Окончательно закончил. Вычитывайте. Qraizer (обсуждение) 17:37, 7 сентября 2013 (UTC)