C++

Поделись знанием:
(перенаправлено с «.cpp»)
Перейти к: навигация, поиск
C++
Семантика:

мультипарадигмальный: объектно-ориентированное, обобщённое, процедурное, метапрограммирование

Тип исполнения:

компилируемый

Появился в:

1983

Автор:

Бьёрн Страуструп

Расширение файлов:

.cpp .cxx .cc .hpp .hxx .hh .h

Система типов:

статическая

Основные реализации:

GNU C++, Microsoft Visual C++, Intel C++ compiler, Open64 C++ Compiler, Clang, Comeau C/C++, Embarcadero C++ Builder, Watcom C++ compiler, Digital Mars C++, Oracle Solaris Studio C++ compiler, Turbo C++

Диалекты:

ISO/IEC 14882 C++

C++ — компилируемый, статически типизированный язык программирования общего назначения.

Поддерживает такие парадигмы программирования, как процедурное программирование, объектно-ориентированное программирование, обобщённое программирование, обеспечивает модульность, раздельную компиляцию, обработку исключений, абстракцию данных, объявление типов (классов) объектов, виртуальные функции. Стандартная библиотека включает, в том числе, общеупотребительные контейнеры и алгоритмы. C++ сочетает свойства как высокоуровневых, так и низкоуровневых языков.[1][2] В сравнении с его предшественником — языком C, — наибольшее внимание уделено поддержке объектно-ориентированного и обобщённого программирования.[2]

C++ широко используется для разработки программного обеспечения, являясь одним из самых популярных языков программирования[мнения 1][мнения 2]. Область его применения включает создание операционных систем, разнообразных прикладных программ, драйверов устройств, приложений для встраиваемых систем, высокопроизводительных серверов, а также развлекательных приложений (игр). Существует множество реализаций языка C++, как бесплатных, так и коммерческих и для различных платформ. Например, на платформе x86 это GCC, Visual C++, Intel C++ Compiler, Embarcadero (Borland) C++ Builder и другие. C++ оказал огромное влияние на другие языки программирования, в первую очередь на Java и C#.

Синтаксис C++ унаследован от языка C. Одним из принципов разработки было сохранение совместимости с C. Тем не менее, C++ не является в строгом смысле надмножеством C; множество программ, которые могут одинаково успешно транслироваться как компиляторами C, так и компиляторами C++, довольно велико, но не включает все возможные программы на C.





Содержание

История

Исторический этап развития[3] Год
Язык BCPL 1966
Язык Би (оригинальная разработка Томпсона под UNIX) 1969
Язык Си 1972
Си с классами 1980
C84 1984
Cfront (выпуск E) 1984
Cfront (выпуск 1.0) 1985
Множественное/виртуальное наследование 1988
Обобщённое программирование (шаблоны) 1991
ANSI C++ / ISO-C++ 1996
ISO/IEC 14882:1998 1998
ISO/IEC 14882:2003 2003
C++/CLI 2005
TR1 2005
C++11 2011
C++14 2014

Создание

Язык возник в начале 1980-х годов, когда сотрудник фирмы Bell Labs Бьёрн Страуструп придумал ряд усовершенствований к языку C под собственные нужды. [4] Когда в конце 1970-х годов Страуструп начал работать в Bell Labs над задачами теории очередей (в приложении к моделированию телефонных вызовов), он обнаружил, что попытки применения существующих в то время языков моделирования оказываются неэффективными, а применение высокоэффективных машинных языков слишком сложно из-за их ограниченной выразительности. Так, язык Симула имеет такие возможности, которые были бы очень полезны для разработки большого программного обеспечения, но работает слишком медленно, а язык BCPL достаточно быстр, но слишком близок к языкам низкого уровня и не подходит для разработки большого программного обеспечения.

Вспомнив опыт своей диссертации, Страуструп решил дополнить язык C (преемник BCPL) возможностями, имеющимися в языке Симула. Язык C, будучи базовым языком системы UNIX, на которой работали компьютеры Bell, является быстрым, многофункциональным и переносимым. Страуструп добавил к нему возможность работы с классами и объектами. В результате практические задачи моделирования оказались доступными для решения как с точки зрения времени разработки (благодаря использованию Симула-подобных классов), так и с точки зрения времени вычислений (благодаря быстродействию C). В первую очередь в C были добавлены классы (с инкапсуляцией), наследование классов, строгая проверка типов, inline-функции и аргументы по умолчанию. Ранние версии языка, первоначально именовавшегося «C with classes» («Си с классами»), стали доступны с 1980 года.

Разрабатывая C с классами, Страуструп написал программу cfront[en] — транслятор, перерабатывающий исходный код C с классами в исходный код простого C. Это позволило работать над новым языком и использовать его на практике, применяя уже имеющуюся в UNIX инфраструктуру для разработки на C. Новый язык, неожиданно для автора, приобрёл большую популярность среди коллег и вскоре Страуструп уже не мог лично поддерживать его, отвечая на тысячи вопросов.

К 1983 году в язык были добавлены новые возможности, такие как виртуальные функции, перегрузка функций и операторов, ссылки, константы, пользовательский контроль над управлением свободной памятью, улучшенная проверка типов и новый стиль комментариев (//). Получившийся язык уже перестал быть просто дополненной версией классического C и был переименован из C с классами в «C++». Его первый коммерческий выпуск состоялся в октябре 1985 года.

До начала официальной стандартизации язык развивался в основном силами Страуструпа в ответ на запросы программистского сообщества. Функцию стандартных описаний языка выполняли написанные Страуструпом печатные работы по C++ (описание языка, справочное руководство и так далее). Лишь в 1998 году был ратифицирован международный стандарт языка C++: ISO/IEC 14882:1998 «Standard for the C++ Programming Language»; после принятия технических исправлений к стандарту в 2003 году — следующая версия этого стандарта — ISO/IEC 14882:2003.[5]

Развитие и стандартизация языка

В 1985 году вышло первое издание «Языка программирования C++», обеспечивающее первое описание этого языка, что было чрезвычайно важно из-за отсутствия официального стандарта. В 1989 году состоялся выход C++ версии 2.0. Его новые возможности включали множественное наследование, абстрактные классы, статические функции-члены, функции-константы и защищённые члены. В 1990 году вышло «Комментированное справочное руководство по C++», положенное впоследствии в основу стандарта. Последние обновления включали шаблоны, исключения, пространства имён, новые способы приведения типов и булевский тип.

Стандартная библиотека C++ также развивалась вместе с ним. Первым добавлением к стандартной библиотеке C++ стали потоки ввода-вывода, обеспечивающие средства для замены традиционных функций C printf и scanf. Позднее самым значительным развитием стандартной библиотеки стало включение в неё Стандартной библиотеки шаблонов.

В 1998 году был опубликован стандарт языка ISO/IEC 14882:1998 (известный как C++98),[6] разработанный комитетом по стандартизации C++ (ISO/IEC JTC1/SC22/WG21 working group). Стандарт C++ не описывает способы именования объектов, некоторые детали обработки исключений и другие возможности, связанные с деталями реализации, что делает несовместимым объектный код, созданный различными компиляторами. Однако для этого третьими лицами создано множество стандартов для конкретных архитектур и операционных систем.

В 2003 году был опубликован стандарт языка ISO/IEC 14882:2003, где были исправлены выявленные ошибки и недочёты предыдущей версии стандарта.

В 2005 году был выпущен отчёт Library Technical Report 1 (кратко называемый TR1). Не являясь официально частью стандарта, отчёт описывает расширения стандартной библиотеки, которые, как ожидалось авторами, должны быть включены в следующую версию языка C++. Степень поддержки TR1 улучшается почти во всех поддерживаемых компиляторах языка C++.

С 2009 года велась работа по обновлению предыдущего стандарта, предварительной версией нового стандарта сперва был C++09, а спустя год C++0x, сегодня — C++11, куда были включены дополнения в ядро языка и расширение стандартной библиотеки, в том числе большую часть TR1.

C++ продолжает развиваться, чтобы отвечать современным требованиям. Одна из групп, разрабатывающих язык C++ и направляющих комитету по стандартизации C++ предложения по его улучшению — это Boost, которая занимается, в том числе, совершенствованием возможностей языка путём добавления в него особенностей метапрограммирования.

Никто не обладает правами на язык C++, он является свободным. Однако сам документ стандарта языка (за исключением черновиков) не доступен бесплатно.[7] В рамках процесса стандартизации, ISO выпускает несколько видов изданий. В частности, технические доклады и технические характеристики публикуются, когда "видно будущее, но нет немедленной возможности соглашения для публикации международного стандарта." До 2011 года не было опубликовано три технических отчета по C++: TR 19768: 2007 (также известный как C++, Технический отчет 1) для расширений библиотеки в основном интегрирован в C++11, TR 29124: 2010 для специальных математических функций, и TR 24733: 2011 для десятичной арифметики с плавающей точкой. Техническая спецификация DTS 18822:. 2 014 (по файловой системой) была утверждена в начале 2015 года, и остальные технические характеристики находятся в стадии разработки и ожидают одобрения [8]

История названия

Имя языка, получившееся в итоге, происходит от оператора унарного постфиксного инкремента C ++ (увеличение значения переменной на единицу). Имя C+ не было использовано потому, что является синтаксической ошибкой в C и, кроме того, это имя было занято другим языком. Язык также не был назван D, поскольку «является расширением C и не пытается устранять проблемы путём удаления элементов C».[4]

Философия C++

Общие принципы

В книге «Дизайн и эволюция C++» [9] Бьёрн Страуструп описывает принципы, которых он придерживался при проектировании C++. Эти принципы объясняют, почему C++ именно такой, какой он есть. Некоторые из них:

  • Получить универсальный язык со статическими типами данных, эффективностью и переносимостью языка C.
  • Непосредственно и всесторонне поддерживать множество стилей программирования, в том числе процедурное программирование, абстракцию данных, объектно-ориентированное программирование и обобщённое программирование.
  • Дать программисту свободу выбора, даже если это даст ему возможность выбирать неправильно.
  • Максимально сохранить совместимость с C, тем самым делая возможным лёгкий переход от программирования на C.
  • Избежать разночтений между C и C++: любая конструкция, допустимая в обоих языках, должна в каждом из них обозначать одно и то же и приводить к одному и тому же поведению программы.
  • Избегать особенностей, которые зависят от платформы или не являются универсальными.
  • «Не платить за то, что не используется» — никакое языковое средство не должно приводить к снижению производительности программ, не использующих его.
  • Не требовать слишком усложнённой среды программирования.

Совместимость с языком С

Выбор именно C в качестве базы для создания нового языка программирования объясняется тем, что язык C:

  1. является многоцелевым, лаконичным и относительно низкоуровневым языком;
  2. подходит для решения большинства системных задач;
  3. исполняется везде и на всём;
  4. стыкуется со средой программирования UNIX.

— Б. Страуструп. Язык программирования C++. Раздел 1.6[10]

Несмотря на ряд известных недостатков языка C, Страуструп пошёл на его использование в качестве основы, так как «в C есть свои проблемы, но их имел бы и разработанный с нуля язык, а проблемы C нам известны». Кроме того, это позволило быстро получить прототип компилятора (cfront), который лишь выполнял трансляцию добавленных синтаксических элементов в оригинальный язык C.

По мере разработки C++ в него были включены другие средства, которые перекрывали возможности конструкций C, в связи с чем неоднократно поднимался вопрос об отказе от совместимости языков путём удаления устаревших конструкций. Тем не менее, совместимость была сохранена из следующих соображений:

  • сохранение действующего кода, написанного изначально на C и прямо перенесённого в C++;
  • исключение необходимости переучивания программистов, ранее изучавших C (им требуется только изучить новые средства C++);
  • исключение путаницы между языками при их совместном использовании («если два языка используются совместно, их различия должны быть или минимальными, или настолько большими, чтобы языки было невозможно перепутать»).

Обзор языка

Стандарт C++ на 2003 год состоит из двух основных частей: описание ядра языка и описание стандартной библиотеки.

Кроме того, существует огромное количество библиотек C++, не входящих в стандарт. В программах на C++ можно использовать многие библиотеки C.

Стандартизация определила язык программирования C++, однако за этим названием могут скрываться также неполные, ограниченные, достандартные варианты языка. Первое время язык развивался вне формальных рамок, спонтанно, по мере встававших перед ним задач. Развитию языка сопутствовало развитие кросс-компилятора cfront. Новшества в языке отражались в изменении номера версии кросс-компилятора. Эти номера версий кросс-компилятора распространялись и на сам язык, но применительно к настоящему времени речь о версиях языка C++ не ведут.

Необъектно-ориентированные возможности

В этом разделе описываются возможности, непосредственно не связанные с объектно-ориентированным программированием (ООП), но многие из них, однако, особенно важны в сочетании с ООП.

Комментарии

С++ поддерживает как комментарии в стиле C:

 /*
 это комментарий, который может состоять
 из нескольких строчек
 */

так и однострочные:

 // вся оставшаяся часть строки является комментарием

где // обозначает начало комментария, а ближайший последующий символ новой строки, который не предварён символом \ (либо эквивалентным ему обозначением ??/), считается окончанием комментария. Плюс этого комментария в том, что его не обязательно заканчивать, то есть обозначать окончание комментария.

Типы

В C++ доступны следующие встроенные типы:

  • Символьные: char, wchar_t (char16_t и char32_t, в стандарте C++11).
  • Целочисленные знаковые: signed char, short int, int, long intlong long int, в стандарте C++11).
  • Целочисленные беззнаковые: unsigned char, unsigned short int, unsigned int, unsigned long intunsigned long long int, в стандарте C++11).
  • С плавающей точкой: float, double, long double.
  • Логический: bool, имеющий значения true и false.

Операции сравнения возвращают тип bool. Выражения в скобках после if, while приводятся к типу bool.[11]

Функции могут принимать аргументы по ссылке. Например, функция void f(int &x) {x=3;} присваивает своему аргументу значение 3. Функции также могут возвращать результат по ссылке, и ссылки могут быть вне всякой связи с функциями. Например, {double &b=a[3]; b=sin(b);} эквивалентно a[3]=sin(a[3]);. При программировании ссылки в определённой степени сходны с указателями, со следующими особенностями: перед использованием ссылка должна быть инициализирована; ссылка пожизненно указывает на один и тот же адрес; в выражении ссылка обозначает непосредственно тот объект или ту функцию, на которую она указывает, обращение же к объекту или функции через указатель требует разыменование указателя. Существуют и другие отличия в использовании указателей и ссылок. Концептуально ссылка — другое имя переменной или функции, другое название одного и того же адреса, существует лишь только в тексте программы, заменяемое адресом при компиляции; а указатель — переменная, хранящая адрес, к которому обращаются.

Разное

  • Спецификатор inline позволяет объявлять inline-функции. Функция, определённая внутри тела класса, является inline по умолчанию. Изначально inline-функции задумывались как функции, являющиеся хорошими кандидатами на оптимизацию, при которой в местах обращения к функции компилятор вставит тело этой функции, а не код вызова. В действительности компилятор не обязан реализовывать подстановку тела для inline-функций, но может, исходя из заданных критериев оптимизации, выполнять подстановку тела для функций, которые не объявлены как inline. Пожалуй, наиболее значимой особенностью inline-функции является то, что она может многократно определяться в нескольких единицах трансляции (при этом inline-функция должна быть определена во всех единицах трансляции, где она используется), в то время как функция, не являющаяся inline, может определяться в программе не более одного раза. Пример:

inline double Sqr(double x) {return x*x;}.

  • Описатель volatile используется в описании переменных и информирует компилятор, что значение данной переменной может быть изменено способом, который компилятор не в состоянии отследить. Для переменных, объявленных volatile, компилятор не должен применять средства оптимизации, изменяющие положение переменной в памяти (например, помещающие её в регистр) или полагающиеся на неизменность значения переменной в промежутке между двумя присваиваниями ей значения. В многоядерной системе volatile помогает избегать барьеров памяти 2-го типаК:Википедия:Статьи без источников (тип: не указан)[источник не указан 3981 день].
  • Если описана структура, класс, объединение (union) или перечисление (enum), её имя является именем типа, например:
struct Time {
    int hh, mm, ss;
};
Time t1, t2;
namespace Foo
{
   const int x=5;
   typedef int** T;
   void f(int y) {return y*x};
   double g(T);
   ...
}

то вне фигурных скобок следует обращаться к T, x, f, g как Foo::T, Foo::x, Foo::f и Foo::g соответственно. Если в каком-то файле нужно обратиться к ним непосредственно, можно написать:

using namespace Foo;

Для обращения к T без указания пространства имён в дальнейшем:

using Foo::T;

Пространства имён нужны, чтобы не возникало коллизий между пакетами, имеющими совпадающие имена глобальных переменных, функций и типов. Специальным случаем является безымянное пространство имён:

namespace
{
    ...
}

Все имена, описанные в безымянном пространстве имён, доступны в текущей единице трансляции и больше нигде.

Примером пространства имён может служить пространство имён std, которое содержит в себе стандартный набор библиотек C++:

 using namespace std;
  • Один или несколько последних аргументов функции могут задаваться по умолчанию. К примеру, если функция описана как void f(int x, int y=5, int z=10), вызовы f(1), f(1,5) и f(1,5,10) эквивалентны.
  • При описании функций отсутствие аргументов в скобках означает, в отличие от C, что аргументов нет, а не то, что они неизвестны. Если аргументы неизвестны, надо пользоваться многоточием, например, int printf(const char* fmt, ...).
  • Внутри структуры или класса можно описывать вложенные типы, как через typedef, так и через описание других классов, а также перечислений. Для доступа к таким типам вне класса, к имени типа добавляется имя структуры или класса и два двоеточия:
struct S
{
    typedef int** T;
    T x;
};
S::T y;
  • Могут быть несколько функций с одним и тем же именем, но разными типами или количеством аргументов (перегрузка функций; при этом тип возвращаемого значения на перегрузку не влияет). Например, вполне можно писать:
void Print(int x);
void Print(double x);
void Print(int x, int y);
  • Смысл некоторых операторов применительно к пользовательским типам можно определять через объявление соответствующих операторных функций. К примеру, так:
struct Date {int day, month, year;};
void operator ++(struct Date& date);

Операторные функции во многом схожи с обычными (неоператорными) функциями. За исключением операторов new, new[], delete и delete[], нельзя переопределять поведение операторов для встроенных типов (скажем, переопределять умножение значений типа int); нельзя создавать новые операторы, которых нет в C++ (скажем, **); нельзя менять количество операндов, предусмотренное для оператора, а также нельзя менять существующие приоритеты и ассоциативность операторов (скажем, в выражении a+b*c сначала будет выполняться умножение, а потом сложение, к каким бы типам ни принадлежали a, b и c). Можно переопределить операции [] (с одним параметром) и () (с любым числом параметров).

  • Добавлены шаблоны (template). Например, template<class T> T Min(T x, T y) {return x<y?x:y;} определяет функцию Min для любых типов. Шаблоны могут задавать не только функции, но и типы. Например, template<class T> struct Array{int len; T* val;}; определяет массив значений любого типа, после чего мы можем писать Array<float> x;
  • В дополнение к функциям malloc и free введены операторные функции operator new, operator new[], operator delete и operator delete[], а также операторы new, new[], delete и delete[]. Если T — произвольный объектный тип, не являющийся типом массива, X — произвольный объектный тип и A — тип массива из некоторого количества n элементов, имеющих тип X, то
    • new T выделяет память (посредством вызова функции operator new), достаточную для размещения одного объекта типа Т, возможно, инициализирует объект в этой памяти, и возвращает указатель типа Т* (например, Т* p = new T).
    • new X[n] и new A выделяют память (посредством вызова функции operator new[]), достаточную для размещения n объектов типа X, возможно, инициализируют каждый объект в этой памяти, и возвращают указатель типа X* (например, X* p = new X[n]).
    • delete p — разрушает объект (не являющийся массивом), на который ссылается указатель p, и освобождает область памяти (посредством вызова функции operator delete), ранее выделенную для него new-выражением.
    • delete [] p — разрушает каждый объект в массиве, на который ссылается указатель p, и освобождает область памяти (посредством вызова функции operator delete[]), ранее выделенную для этого массива new-выражением.

Операция delete проверяет, что её аргумент не является нулевым указателем, в противном случае она ничего не делает. Для инициализации объекта non-POD классового типа new-выражение вызывает конструктор; для уничтожения объекта классового типа delete-выражение вызывает деструктор (см. ниже).

Объектно-ориентированные особенности языка

C++ добавляет к C объектно-ориентированные возможности. Он вводит классы, которые обеспечивают три самых важных свойства ООП: инкапсуляцию, наследование и полиморфизм.

В стандарте C++ под классом (class) подразумевается пользовательский тип, объявленный с использованием одного из ключевых слов class, struct или union, под структурой (structure) подразумевается класс, определённый через ключевое слово struct, и под объединением (union) подразумевается класс, определённый через ключевое слово union.

Описание функций в теле класса

В теле класса можно указать только заголовок функции, а можно описать всю функцию (см. пример с функцией Alloc ниже. В этом случае она считается встраиваемой (inline))

Константные функции-члены

Нестатические функции-члены (и только они) могут иметь описатель const

class Array
{
...
    inline double operator[] (int n) const;

Такие функции не имеют права изменять поля класса (кроме полей, определённых как mutable). Если они пытаются это сделать, компилятор должен выдать сообщение об ошибке.

Наследование

В C++ при наследовании одного класса от другого наследуется реализация класса, плюс класс-наследник может добавлять свои поля и функции или переопределять функции базового класса. Множественное наследование разрешено.

Конструктор наследника вызывает конструкторы базовых классов, а затем конструкторы нестатических членов-данных, являющихся экземплярами классов. Деструктор работает в обратном порядке.

Наследование бывает публичным, защищённым и закрытым (то есть закрытого типа):

Доступ члена базового класса/режим наследования private-член protected-член public-член
private-наследование недоступен private private
protected-наследование недоступен protected protected
public-наследование недоступен protected public

Наследник — это больше чем базовый класс, поэтому, если наследование открытое, то он может использоваться везде, где используется базовый класс, но не наоборот. Одно из применений наследования - возможность закрыть исходный код, доступный в базовом классе, для производных классов [12]

Полиморфизм

Семантика системы типов С++ не полиморфна, однако есть несколько способов обеспечить полиморфное поведение. Прежде всего это перегрузка методов классов при наследовании — традиционный для ООП способ обеспечения абстракции данных. Затем есть два способа реализации параметрического полиморфизма (в С++-сообществе обычно называемого «обобщённым программированием»). Первый способ унаследован из Си — использование бестипового указателя и приведение типа в зависимости от других данных — хотя в С++ этот способ традиционно считается неидеоматичным и опасным. Второй заключается в использовании шаблонов — но, в отличие от обычных реализаций параметрического полиморфизма, в С++ происходит автоматическая генерация семейства перегруженных мономорфных функций на основании полиморфного определения (шаблона) в соответствии с контекстами его использования — то есть параметрический полиморфизм на уровне исходного кода транслируется в ситуативный (ad hoc) на уровне машинного, за что С++ подвергается критике (см. раздел Вычислительная производительность). В С++ также есть третий вид перегрузки — перегрузка операторов — которая в сочетании с наследованием классов предоставляет ещё большие возможности повышения читабельности кода путём ввода т. н. «синтаксического сахара».

Для обеспечения абстракции данных необходимо связать несколько классов в иерархию наследования и назначить функциям одинаковые спецификации. Например:

class Figure
{
    ...
    void Draw() const;
    ...
};

class Square : public Figure
{
    ...
    void Draw() const;
    ...
};

class Circle : public Figure
{
    ...
    void Draw() const;
    ...
};

class Window
{
    ...
    void Draw() const;
    ...
};

class SquareWindow : public Window
{
    ...
    void Draw() const;
    ...
};

class RoundWindow : public Window
{
    ...
    void Draw() const;
    ...
};

В результате компиляции этих определений формируется шесть тел функций. В коде они используются одинаково; выбор конкретного экземпляра функции осуществляется в зависимости от типа экземпляра объекта, для которого осуществляется вызов. Согласованность поведения функций остаётся на совести программиста.

Circle *c = new Circle(0,0,5);
Figure *f = c; // правильно: Figure — базовый класс для Circle
c->Draw();
f->Draw(); // Указатели равны друг другу, но для f и c будут вызваны разные функции
SquareWindow *sw = new SquareWindow(0,0,5);
sw->Draw(); // используется так же
f = sw; // ошибка! SquareWindow не входит в число наследников Figure!

Как видно, диапазон этого вида полиморфизма в С++ ограничивается на этапе проектирования заданным перечнем типов. По умолчанию такой полиморфизм является статическим, но при использовании спецификатора virtual он превращается в динамический (см. позднее связывание):

class Figure
{
    ...
    virtual void Draw() const;
    ...
};

class Square : public Figure
{
    ...
    void Draw() const;
    ...
};

class Circle : public Figure
{
    ...
    void Draw() const;
    ...
};

Figure* figures[10];
figures[0] = new Square(1, 2, 10);
figures[1] = new Circle(3, 5, 8);
...
for (int i = 0; i < 10; i++)
    figures[i]->Draw();

В этом случае для каждого элемента массива будет вызвана Square::Draw() или Circle::Draw(), в зависимости от вида фигуры.

Чистой виртуальной функцией называется виртуальная функция-член, которая объявлена со спецификатором = 0 вместо тела:

class Figure
{
    ...
    virtual void Draw() const = 0;
);

Чистая виртуальная функция не имеет определения и не может быть непосредственно вызвана. Цель объявления такой функции — создать в общем базовом классе сигнатуру-прототип, которая не имела бы собственного определения, но позволяла создавать такие определения в классах-потомках и вызывать их через указатель на общий базовый класс. Функция-член объявляется чистой виртуальной тогда, когда её определение для базового класса не имеет смысла. Так, в вышеприведённом примере для базового класса Figure определение функции Draw() не имеет смысла, так как «фигур вообще» не бывает и их невозможно отобразить, но описание такой функции необходимо, чтобы можно было её переопределить в классах-потомках и вызывать методы Draw этих классов через указатель на Figure. Следовательно, вполне логично объявить Figure.Draw() как чистую виртуальную функцию-член.

С понятием чистой виртуальной функции в C++ тесно связано понятие «абстрактный класс». Абстрактным классом называется такой, у которого есть хотя бы одна не переопределённая чистая виртуальная функция-член. Экземпляры таких классов создавать запрещено, абстрактные классы могут использоваться только для порождения новых классов путём наследования. Если в классе-потомке абстрактного класса не переопределены все унаследованные чистые виртуальные функции, то такой класс также является абстрактным и на него распространяются все указанные ограничения.

Абстрактные классы часто используются как интерфейсы. В отличие от чистых интерфейсов других языков, абстрактные классы С++ могут иметь невиртуальные функции и члены-данные.

Инкапсуляция

Основным способом организации информации в C++ являются классы. В отличие от структуры (struct) языка C, которая может состоять только из полей и вложенных типов, класс (class) C++ может состоять из полей, вложенных типов и функций-членов (member functions). Инкапсуляция в С++ реализуется через указание уровня доступа к членам класса: они бывают публичными (открытыми, public), защищёнными (protected) и собственными (закрытыми, приватными, private). В C++ структуры формально отличаются от классов лишь тем, что по умолчанию члены и базовые классы у структуры публичные, а у класса — собственные.

Доступ private protected public
Сам класс да да да
Друзья да да да
Наследники нет да да
Извне нет нет да

Проверка доступа происходит во время компиляции, попытка обращения к недоступному члену класса вызовет ошибку компиляции.

Пример класса, реализующего одномерный массив (это просто иллюстрация, а не образец дизайна!):

class Array
{
    public:
        Array() :
            len(0),
            val(NULL)
        {}

        Array(int _len) :
            len(_len)
        {
            val = new double[_len];
        }

        Array(const Array & a);

        ~Array()
        {
            Free();
        }

        inline const double & Elem(int i) const
        {
            return val[i];
        }

        inline void ChangeElem(int i, double x)
        {
            val[i] = x;
        }

    protected:
        void Alloc(int _len)
        {
            if (len == 0)
                Free();

            len = _len;
            val = new double[len];
        }

        void Free()
        {
            delete [] val;
            len = 0;
        }

        int len;
        double * val;
};

Здесь класс Array имеет 2 публичных функции-члена, 2 защищённых поля, 3 публичных конструктора и публичный деструктор. Описатель inline означает подсказку компилятору, что вместо вызова функции её код следует встроить в точку вызова, чем часто можно достичь большей эффективности.

Друзья

Функции-друзья — это функции, не являющиеся функциями-членами и тем не менее имеющие доступ к защищённым и закрытым членам класса. Они должны быть объявлены в теле класса как friend. Например:

class Matrix {
    ...
    friend Matrix Multiply(Matrix m1, Matrix m2);
    ...
};

Matrix Multiply(Matrix m1, Matrix m2) {
    ...
}

Здесь функция Multiply может обращаться к любым полям и функциям-членам класса Matrix.

Дружественной может быть объявлен как весь класс, так и функция-член класса. Если класс A — объявлен в классе B как друг, то все собственные (не унаследованные) функции-члены класса A могут обращаться к любым членам класса B. Например:

class Matrix {
    ...
    friend class Vector::getNum( Matrix & ) ;
    ...
private:
    int i;
};
...
class Vector
{
    int GetNum( Matrix & m ){ return m.i;} //обращение к закрытому члену данных класса Matrix
};

Пример обращения:

void SomeFunction()
{
    Matrix m;
    Vector v;

    int i = Vector::GetNum( m );
}

Четыре важных ограничения, накладываемых на отношения дружественности в C++:

  • Дружественность не транзитивна. Если A объявляет другом B, а B, в свою очередь, объявляет другом C, то C не становится автоматически другом для A. Для этого A должен явно объявить C своим другом.
  • Дружественность не взаимна. Если класс A объявляет другом класс B, то он не становится автоматически другом для B. Для этого должно существовать явное объявление дружественности A в классе B.
  • Дружественность не наследуется. Если A объявляет класс B своим другом, то потомки B не становятся автоматически друзьями A. Для этого каждый из них должен быть объявлен другом A в явной форме.
  • Дружественность не распространяется на потомков. Если класс A объявляет B другом, то B не становится автоматически другом для классов-потомков A. Каждый потомок, если это нужно, должен объявить B своим другом самостоятельно.

В общем виде это правило можно сформулировать следующим образом: «Отношение дружественности существует только между теми классами (классом и функцией), для которых оно явно объявлено в коде, и действует только в том направлении, в котором оно объявлено».

По действующему стандарту C++ вложенный класс не имеет прав доступа к закрытым членам объемлющего класса и не может быть объявлен его другом (последнее следует из определения термина друг как нечлена класса). В будущем стандарте C++0x эти ограничения будут устранены. В данном отношении современные версии компиляторов VC++, GNU C++ и Comeau C++ даже с отключенными расширениями следуют новым правилам, сформулированным в последних версиях черновика C++0x.

Конструкторы и деструкторы

В классах всегда есть специальные функции — конструкторы и деструкторы, которые могут быть объявлены явно или неявно.

Конструктор вызывается для инициализации объекта (соответствующего типа) при его создании, а деструктор — для уничтожения объекта. В частности, конструктор может быть вызван для выполнения преобразования к классовому типу.

Конструкторы обозначаются как одноимённые классу функции (например, Array::Array), деструкторы — как имя класса, предварённое тильдой (например, Array::~Array). Для конструкторов и деструкторов нельзя указывать тип возвращаемого значения. Деструктор нельзя объявлять как принимающий аргументы. Класс может иметь сколько угодно конструкторов (с разными наборами параметров), в том числе шаблонных, и только один (причём нешаблонный) деструктор.

Конструктор без параметров или конструктор, все параметры которого имеют аргументы по умолчанию, называется конструктором по умолчанию, нешаблонный конструктор с первым параметром-ссылкой на тот же класс (например, Array::Array(const Array&)) и остальными параметрами (если таковые есть), имеющими аргументы по умолчанию, — конструктором копирования, он вызывается при создании нового объекта, являющегося копией уже существующего объекта:

Array a(5); // вызывается Array::Array(int)
Array b; // вызывается Array::Array()
Array c(a); // вызывается Array::Array(const Array&)
Array d=a; // вызывается Array::Array(const Array&)
b=c; // происходит вызов оператора =
            // если он не определён (как в данном случае), то вызывается сгенерированный компилятором оператор присваивания, который
            // осуществляет копирование базовых подобъектов и почленное копирование нестатических членов-данных.
            // как правило конструктор копий и оператор присваивания переопределяются попарно

Если в классе нет явно объявленных конструкторов, класс имеет неявно объявленный конструктор без параметров, который конструирует подобъекты классов-родителей и инициализирует поля класса, вызывая для них конструкторы по умолчанию. Если в классе нет явно объявленных копирующих конструкторов, то класс имеет неявно объявленный копирующий конструктор, который выполняет прямое копирование всех объявленных полей объекта-источника в соответствующие поля объекта-приёмника с помощью соответствующих копирующих конструкторов. Если в классе нет явно объявленного деструктора, то класс имеет неявно объявленный деструктор.

Конструкторы в C++ не могут быть объявлены виртуальными, а деструкторы — могут, и обычно так и объявляются, чтобы гарантировать правильное уничтожение доступного по ссылке или указателю объекта независимо от того, какого типа ссылка или указатель.

Перегрузка операторов

Функции-члены могут быть операторами:

class Array {
...
    inline double& operator[] (int n) { return val[n]; }

И далее

Array a(10);
...
double b = a[5];

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

Общая структура

Стандартная библиотека C++ включает в себя набор средств, которые должны быть доступны для любой реализации языка, чтобы обеспечить программистам удобное пользование языковыми средствами и создать базу для разработки как прикладных приложений самого широкого спектра, так и специализированных библиотек. Стандартная библиотека С++ включает в себя часть стандартной библиотеки C. Стандарт C++ содержит нормативную ссылку на стандарт C от 1990 года и не определяет самостоятельно те функции стандартной библиотеки, которые заимствуются из стандартной библиотеки C.

Доступ к возможностям стандартной библиотеки C++ обеспечивается с помощью включения в программу (посредством директивы #include) соответствующих стандартных заголовочных файлов. Всего в стандарте C++11 определено 79 таких файлов. Средства стандартной библиотеки объявляются как входящие в пространство имён std. Заголовочные файлы, имена которых соответствуют шаблону «cX», где X — имя заголовочного файла стандартной библиотеки C без расширения (cstdlib, cstring, cstdio и пр.), содержат определения, соответствующие данной части стандартной библиотеки C, при этом программист может воспользоваться заголовочными файлами с именами по шаблону «cX.h» (добавлено стандартное расширение заголовочных файлов C «.h»), в которых те же средства определены как относящиеся к глобальному пространству имён.

Для использования следующих функций стандартной библиотеки

void* operator new(std::size_t) throw(std::bad_alloc);
void* operator new[](std::size_t) throw(std::bad_alloc);
void operator delete(void*) throw();
void operator delete[](void*) throw();

подключение каких-либо заголовочных файлов не требуется.

Состав

Стандартная библиотека включает в себя следующие разделы:

  • Поддержка языка. Включает средства, которые необходимы для работы программ, а также сведения об особенностях реализации. Выделение памяти, RTTI, базовые исключения, пределы значений для числовых типов данных, базовые средства взаимодействия со средой, такие как системные часы, обработка сигналов UNIX, завершение программы.
  • Стандартные контейнеры. В стандартную библиотеку входят шаблоны для следующих контейнеров: одномерные массивы, списки, одно- и двунаправленные очереди, стеки, ассоциативные массивы, множества, очереди с приоритетом.
  • Основные утилиты. В этот раздел входит описание основных базовых элементов, применяемых в стандартной библиотеке, распределителей памяти и поддержка времени и даты в стиле C.
  • Итераторы. Обеспечивают шаблоны итераторов, с помощью которых в стандартной библиотеке реализуется стандартный механизм группового применения алгоритмов обработки данных к элементам контейнеров.
  • Алгоритмы. Шаблоны для описания операций обработки, которые с помощью механизмов стандартной библиотеки могут применяться к любой последовательности элементов, в том числе к элементам в контейнерах. Также в этот раздел входят описания функций bsearch() и qsort() из стандартной библиотеки C.
  • Строки. Шаблоны строк в стиле C++. Также в этот раздел попадает часть библиотек для работы со строками и символами в стиле C.
  • Ввод-вывод. Шаблоны и вспомогательные классы для потоков ввода-вывода общего вида, строкового ввода-вывода, манипуляторы (средства управления форматом потокового ввода-вывода в стиле C++).
  • Локализация. Определения, используемые для поддержки национальных особенностей и форматов представления (дат, валют и т. д.) в стиле C++ и в стиле C.
  • Диагностика. Определения ряда исключений и механизмов проверки утверждений во время выполнения (assert). Поддержка обработки ошибок в стиле C.
  • Числа. Определения для работы с комплексными числами, математическими векторами, поддержка общих математических функций, генератор случайных чисел.

Контейнеры, строки, алгоритмы, итераторы и основные утилиты, за исключением заимствований из библиотеки C, собирательно называются STL (Standard Template Library — стандартная шаблонная библиотека). Изначально эта библиотека была отдельным продуктом и её аббревиатура расшифровывалась иначе, но потом она вошла в стандартную библиотеку C++ в качестве неотъемлемого элемента. В названии отражено то, что для реализации средств общего вида (контейнеров, строк, алгоритмов) использованы механизмы обобщённого программирования (шаблоны C++ — template). В работах Страуструпа подробно описываются причины, по которым был сделан именно такой выбор. Основными из них являются бо́льшая универсальность выбранного решения (шаблонные контейнеры, в отличие от объектных, могут легко использоваться для не объектных типов и не требуют наличия общего предка у типов элементов) и его техническая эффективность (как правило, операции шаблонного контейнера не требуют вызовов виртуальных функций и могут легко встраиваться (inline), что в итоге даёт столь же производительный код, как и при ручном кодировании).

Реализации

STL до включения в стандарт C++ была сторонней разработкой, в начале — фирмы HP, а затем SGI. Стандарт языка не называет её «STL», так как эта библиотека стала неотъемлемой частью языка, однако многие люди до сих пор используют это название, чтобы отличать её от остальной части стандартной библиотеки (потоки ввода-вывода (iostream), подраздел C и другие).

Проект под названием STLport[13], основанный на SGI STL, осуществляет постоянное обновление STL, IOstream и строковых классов. Некоторые другие проекты также занимаются разработкой частных применений стандартной библиотеки.

Отличия от языка C

Новые возможности

Нововведениями C++ в сравнении с C являются:

Новые возможности C++ включают объявления в виде выражений, преобразования типов в виде функций, операторы new и delete, тип bool, ссылки, расширенное понятие константности, подставляемые функции, аргументы по умолчанию, переопределения, пространства имён, классы (включая и все связанные с классами возможности, такие как наследование, функции-члены, виртуальные функции, абстрактные классы и конструкторы), переопределения операторов, шаблоны, оператор ::, обработку исключений, динамическую идентификацию и многое другое. Язык C++ также во многих случаях строже относится к проверке типов, чем C.

В C++ появились комментарии в виде двойной косой черты (//), которые были в предшественнике C — языке BCPL.

Некоторые особенности C++ позднее были перенесены в C, например, ключевые слова const и inline, объявления в циклах for и комментарии в стиле C++ (//). В более поздних реализациях C также были представлены возможности, которых нет в C++, например макросы va_arg и улучшенная работа с массивами-параметрами.

C++ не включает в себя C

Несмотря на то, что большая часть кода C будет справедлива и для C++, C++ не является надмножеством C и не включает его в себя. Существует и такой верный для C код, который неверен для C++. Это отличает его от Objective C, ещё одного усовершенствования C для ООП, как раз являющегося надмножеством C.

Существуют и другие различия. Например, C++ не разрешает вызывать функцию main() внутри программы, в то время как в C это действие правомерно. Кроме того, C++ более строг в некоторых вопросах; например, он не допускает неявное приведение типов между несвязанными типами указателей и не разрешает использовать функции, которые ещё не объявлены.

Более того, код, верный для обоих языков, может давать разные результаты в зависимости от того, компилятором какого языка он оттранслирован. Например, на большинстве платформ следующая программа печатает «С», если компилируется компилятором C, и «C++» — если компилятором C++. Так происходит из-за того, что символьные константы в C (например, 'a') имеют тип int, а в C++ — тип char, а размеры этих типов обычно различаются.

#include <stdio.h>

int main()
{
    printf("%s\n", (sizeof('a') == sizeof(char)) ? "C++" : "C");
    return 0;
}

Средства C, которых рекомендуется избегать

По замечанию Страуструпа, «чем лучше вы знаете C, тем труднее вам будет избежать программирования на C++ в стиле C, теряя при этом потенциальные преимущества C++». В связи с этим он даёт следующий набор рекомендаций для программистов на C, чтобы в полной мере воспользоваться преимуществами C++:

  • Не использовать макроопределения #define. Для объявления констант применять const, групп констант (перечислений) — enum, для прямого включения функций — inline, для определения семейств функций или типов — template.
  • Не использовать предварительные объявления переменных. Объявлять переменные в блоке, где они реально используются, всегда совмещая объявление с инициализацией.
  • Отказаться от использования malloc()[14] в пользу оператора new, от realloc()[15] — в пользу типа vector.
  • Избегать бестиповых указателей, арифметики указателей, неявных приведений типов, объединений, за исключением, возможно, низкоуровневого кода. Использовать «новые» преобразования типов, как более точно выражающие действительные намерения программиста и более безопасные.
  • Свести к минимуму использование массивов символов и строк в стиле C, заменив их на типы string и vector из STL. Вообще не стремиться создавать собственные реализации того, что уже имеется в стандартной библиотеке.

Дальнейшее развитие

Текущий стандарт языка ISO/IEC 14882:2014 был принят в 2014 году. Неофициально его обозначают как C++14. Следующая версия стандарта, запланированная на 2017 год, имеет неофициальное обозначение C++17.

Общие направления развития C++

По мнению автора языка Бьёрна Страуструпа[16][17][18], говоря о дальнейшем развитии и перспективах языка, можно выделить следующее:

  • В основном дальнейшее развитие языка будет идти по пути внесения дополнений в стандартную библиотеку. Одним из основных источников этих дополнений является известная библиотека boost.
  • Изменения в ядре языка не должны приводить к снижению уже достигнутой эффективности C++. С точки зрения Страуструпа, предпочтительнее внесение в ядро нескольких серьёзных больших изменений, чем множества мелких правок.
  • Базовыми направлениями развития C++ на ближайшее время является расширение возможностей и доработка средств обобщённого программирования, стандартизация механизмов параллельной обработки, а также доработка средств безопасного программирования, таких как различные проверки и безопасные преобразования типов, проверка условий и так далее.
  • В целом C++ спроектирован и развивается как мультипарадигменный язык, впитывающий в себя различные методы и технологии программирования, но реализующий их на платформе, обеспечивающей высокую техническую эффективность. Поэтому в будущем не исключено добавление в язык средств функционального программирования, автоматической сборки мусора и других отсутствующих в нём сейчас механизмов. Но в любом случае это будет делаться на имеющейся платформе высокоэффективного компилируемого языка.
  • Хотя формально одним из принципов C++ остаётся сохранение совместимости с языком C, фактически группы по стандартизации этих языков не взаимодействуют, а вносимые ими изменения не только не коррелируют, но и нередко принципиально противоречат друг другу идеологически. Так, элементы, которые новые стандарты C добавляют в ядро, в стандарте C++ являются элементами стандартной библиотеки и в ядре вообще отсутствуют, например, динамические массивы, массивы с фиксированными границами, средства параллельной обработки. Как считает Страуструп, объединение разработки этих двух языков принесло бы большую пользу, но оно вряд ли возможно по политическим соображениям. Так что практическая совместимость между C и C++ постепенно будет утрачиваться.

Стандарт C++11: дополнения в ядре языка

Явно определяемые константные функции и выражения constexpr.
В язык вводится ключевое слово constexpr, которым может быть помечено объявление функции, если она возвращает константу времени компиляции, или константной переменной, которая инициализируется выражением, содержащим только константы времени компиляции. Константные выражения могут использоваться везде, где по семантике программы требуется константа времени компиляции, например — в инициализаторах статических объектов. Предполагается, что константные выражения позволят программисту проще и точнее описывать семантику программы, а компилятору — шире применять предвычисление выражений на этапе трансляции кода.
Универсальная инициализация.
Инициализация массивов и объектов списками константных значений, заключёнными в фигурные скобки. Значительно упростит инициализацию сложных объектов.
Конструкторы и операторы присваивания с семантикой переноса.
Отдельное описание для конструкторов и присваиваний, реализующих перенос значения из источника в приёмник (то есть не гарантирующих сохранность объекта-источника после завершения операции). Во многих случаях такие конструкторы и присваивания могут быть описаны значительно более эффективно, чем обычные копирующие конструкторы и полноценные присваивания. Наличие их позволяет компилятору использовать эти более эффективные описания при работе с временными объектами (представляющими результаты выражений, аргументы или возвращаемые значения функций) что, в итоге, увеличивает производительность программ, работающих со сложными объектами.
Конструкторы и операторы преобразования типов — новые возможности.
Разрешён прямой вызов одного конструктора из другого, что уменьшает дублирование кода и исключает необходимость создания скрытых методов-инициализаторов. Для операторов преобразования типов разрешено описание с ключевым словом explicit — запрет на неявное преобразование типа параметра при вызове.
Вывод типов.
Для применения в шаблонах, там, где затруднительно указать конкретный тип переменной, введены два новых механизма: переменные типа auto и описание decltype. Оба используются на месте типа переменной при её объявлении. Переменная типа auto должна быть явно инициализирована некоторым выражением и её тип компилятор определяет по типу значения выражения-инициализатора. Соответственно, если в инициализации участвуют значения шаблонных типов или вызовы шаблонных функций, тип переменной определяется с учётом конкретных подставленных типов-параметров этих шаблонов. Описание вида «decltype(x) y» понимается как «y имеет тип выражения x», то есть компилятор выводит тип выражения x и определяет y как переменную этого типа. Все эти операции производятся только на этапе компиляции, то есть статическая типизация не нарушается.
Чтобы обеспечить возможность указывать через decltype тип возвращаемого значения функции, когда он зависит от типов параметров, введён альтернативный синтаксис объявления функции: auto func(params) -> type соответствует type func(params). Например, auto f(T x, T y) -> decltype(x+y) определяет функцию f как возвращающую тип, выводимый из выражения «x+y»[пояснения 1]
Цикл по коллекции.
Вслед за многими современными языками в C++ введена конструкция «цикл по коллекции» вида for(type &x : array){...}. Здесь тело цикла выполняется для каждого элемента коллекции array, а x в каждой итерации будет ссылаться на очередной элемент коллекции. В качестве коллекции может выступать C-массив или любой контейнер стандартной библиотеки, для которого определены итераторы begin и end.
Лямбда-выражения.
Добавлена возможность объявлять лямбда-выражения (безымянные функции, определяемые в точке применения), в том числе зависящие от внешних переменных (замыкания). Лямбда-выражения могут присваиваться переменным и использоваться везде, где требуется функция соответствующего типа, например, в алгоритмах стандартной библиотеки.
Изменения в описании виртуальных методов.
Добавлен необязательный модификатор override, который употребляется в объявлении метода, замещающего виртуальный метод родительского класса. Описание замещения с override вызывает проверку на наличие в родительском классе замещаемого метода и на совпадение сигнатур методов.
Добавлен также модификатор final, как и в Java, запрещающий дальнейшее замещение помеченного им метода. Также final может быть объявлен класс — в таком случае от него запрещено наследовать новые классы.
Изменения в механизме шаблонов.
Добавлена возможность описания шаблонов с неопределённым числом параметров и возможность объявления синонимов для неспециализированных или частично специализированных шаблонов. Ключевое слово export при объявлении специализации шаблона указывает компилятору на то, что фактически специализация сделана в другой единице компиляции, что позволяет избежать повторной специализации одних и тех же шаблонов одними и теми же параметрами.
Различные синтаксические дополнения.
Определено ключевое слово для константы — нулевого указателя: nullptr. Его использование позволяет избежать путаницы между целым нулевым значением и пустым указателем, которая возникает при использовании константы 0, как требовалось ранее.
Внесены изменения в семантику и, частично, синтаксис перечислений и объединений. Добавлена возможность создавать типобезопасные перечисления, с объединений снят ряд ограничений на структуру.
От компилятора требуется правильный лексический разбор текста программы с несколькими закрывающимися угловыми скобками подряд (ранее последовательность «>>» воспринималась однозначно как операция вывода в поток, поэтому в записи вложенных шаблонных конструкций требовалось обязательно разделять знаки «больше» пробелами или переводами строк).
sizeof теперь может возвращать размер члена класса по его имени, без указания конкретного экземпляра (sizeof(ClassA::b)).

Стандарт C++11: изменения в стандартной библиотеке

  • Добавлена библиотека <regex>, реализующая общепринятые механизмы поиска и подстановки с помощью регулярных выражений.
  • Добавлена поддержка многопоточности.
  • Добавлены шаблоны с переменным числом аргументов.

Проблемные моменты

Одним из камней преткновения стало ключевое слово export в шаблонах, где оно используется для разделения объявления и определения спецификации шаблона (нововведение стандарта «C++98»). Герб Саттер, секретарь комитета по стандартизации C++, рекомендовал убрать export из будущих версий стандарта по причине серьёзных сложностей в полноценной реализации, однако впоследствии его решили оставить.

Первым компилятором, поддерживающим export в шаблонах, стал Comeau C++ в начале 2003 года (спустя 5 лет после выхода стандарта C++98). В 2004 году бета-версия компилятора Borland C++ Builder X также начала его поддержку. Оба этих компилятора основаны на фронт-энде EDG. Другие компиляторы, такие как Microsoft Visual C++ или GCC (до версии 3.4.4), вообще этого не поддерживают. Поддерживают export: Microsoft Visual C++ 7.0, GCC 3.4.4, Microsoft Visual Studio 2010 и другие.

Из списка других проблем, связанных с шаблонами, можно привести вопросы конструкций частичной специализации шаблонов, которые плохо поддерживались в течение многих лет после выхода стандарта C++.

Примеры программ

Пример № 1

Это пример программы, которая ничего не делает. Она начинает выполняться и немедленно завершается.

Она состоит из основного потока: функции main(), которая обозначает точку начала выполнения программы на C++.

int main()
{
    return 0;
}

Стандарт C++ требует, чтобы функция main() возвращала тип int. Программа, которая имеет другой тип возвращаемого значения функции main(), не соответствует стандарту C++.

Стандарт не говорит о том, что на самом деле означает возвращаемое значение функции main(). Традиционно оно интерпретируется как код возврата программы. Стандарт гарантирует, что возвращение 0 из функции main() показывает, что программа была завершена успешно.

Завершение программы на C++ с ошибкой традиционно обозначается путём возврата ненулевого значения.

Пример № 2

Эта программа также ничего не делает, но более лаконична.

int main(){}

В C++ (как и в C), если выполнение программы доходит до конца функции main(), то это эквивалентно return 0;. Это неверно для любой другой функции кроме main().

Пример № 3

Это пример программы Hello, world!, которая выводит сообщение, используя стандартную библиотеку, и завершается.

#include <iostream>

int main()
{
    std::cout << "Hello, world!\n";
    return 0;
}

Пример № 4

Современный C++ позволяет решать простым способом и более сложные задачи. Этот пример демонстрирует, кроме всего прочего, использование контейнеров стандартной библиотеки шаблонов (STL).

#include <iostream> // для использования std::cout
#include <vector> // для std::vector<>
#include <map> // для std::map<> и std::pair<>
#include <algorithm> // для std::for_each()
#include <string> // для std::string

using namespace std; // используем пространство имён "std"

void display_item_count(pair < string const, vector<string> > const& person)
{
   // person - это пара двух объектов: person.first - это его имя,
   // person.second - это список его предметов (вектор строк)
   cout << person.first << " is carrying " << person.second.size() << " items" << endl;
}

int main()
{
   // Объявляем ассоциативный контейнер со строковыми ключами и данными в виде векторов строк
   map< string, vector<string> > items;

   // Добавим в этот ассоциативный контейнер пару человек и дадим им несколько предметов
   items["Anya"].push_back("scarf");
   items["Dmitry"].push_back("tickets");
   items["Anya"].push_back("puppy");

   // Переберём все объекты в контейнере
   for_each(items.begin(), items.end(), display_item_count);
}

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

#include <vector>

int main()
{
    using std::vector;

    vector<int> my_vector;
}

Здесь директива помещена в область функции, что уменьшает шансы столкновений имён (это и стало причиной введения в язык пространств имён). Использование объявлений, сливающих разные пространства имён в одно, разрушает саму концепцию пространства имён.К:Википедия:Статьи без источников (тип: не указан)[источник не указан 5167 дней]

Пример № 5

Популярные библиотеки boost в сочетании со стандартными средствами языка позволяют очень лаконично и наглядно записывать код. В приведённом ниже примере вычисляется скалярное произведение векторов нечётных чисел и квадратов. В коде вектора значений представлены ленивыми STL-подобными последовательностями.

#include <iostream>
#include <numeric>
#include <boost/iterator/counting_iterator.hpp>
#include <boost/iterator/transform_iterator.hpp>

int odd(int i)
{
  return 2 * i + 1;
}

int square(int i)
{
  return i * i;
}

typedef boost::counting_iterator <int> counter;
typedef boost::transform_iterator <int (*)(int), counter> transformer;

transformer odds(int n)
{
  return transformer(counter(n), odd);
}

transformer squares(int n)
{
  return transformer(counter(n), square);
}

int main()
{
  using namespace std;

  cout << "Enter vector length: ";
  int n; cin >> n;

  cout << inner_product( odds(0), odds(n), squares(0), 0 ) << endl;
}

Данный пример демонстрирует так называемый «плоский» стиль записи. Это название связано с тем, что алгоритмы STL позволяют записывать код без циклов, соответственно ширина отступов в отформатированном коде примерно постоянна. Сторонники такого подхода считают, что программисту, знакомому со стандартной библиотекой С++, достаточно строчки с вызовом inner_product(), чтобы понять, что делает программа. С этой точки зрения вызов inner_product близок к словесному описанию задачи: «вычислить скалярное произведение векторов нечётных чисел и квадратов для значений от нуля до n».

Пример № 6

Рассмотрим реализацию всем известной игры "Морской бой".

Игровое поле — квадрат 10×10 каждого игрока, на котором размещается флот кораблей.

Размещаются:

  • 1 корабль — ряд из 4 клеток («авианосцы», или «четырёхпалубные»)
  • 2 корабля — ряд из 3 клеток («линкоры», или «трёхпалубные»)
  • 3 корабля — ряд из 2 клеток («крейсеры», или «двухпалубные»)
  • 4 корабля — 1 клетка («эсминцы», или «однопалубные»)
    #include <iostream> 
    #include <fstream> 
    #include <vector> 
    #include <map> 
    #include <set> 
    #include <algorithm> 
    #include <string>
    
    using namespace std;
    
    bool f (char a[10][10]) {
    	vector <vector <int>> used (10, vector <int> (10));
    	vector <int> count (5);
    	for (int i = 0; i < 10; i++) {
    		for (int j = 0; j < 10; j++) {
    			bool ok1 = true;
    			bool ok2 = true;
    
    			if (!used[i][j] && a[i][j] == '*') {
    				int posi = i;
    
    				while (posi < 10 && a[posi][j] == '*') {
    					if (j+1 < 10 && a[posi][j+1] == '*') {
    						ok1 = false;
    						break;
    					}
    					if (posi + 1 < 10 && j+1 < 10 && a[posi+1][j+1] == '*') {
    						ok1 = false;
    						break;
    					}
    					posi++;
    				}
    				if (ok1) {
    					if (posi - i > 4) {
    						return false;
    					}
    					count[posi - i]++;
    					for (int t = i; t != posi; t++) {
    						used[t][j] = true;
    					}
    				}
    						
    				int posj = j;
    				if (!used[i][j]) {
    					while (posj < 10 && a[i][posj] == '*') {
    						if (i + 1 < 10 && a[i+1][posj] == '*') {
    							ok2 = false;
    							break;
    						}	
    						if (posj + 1 < 10 && i + 1 < 10 && a[i + 1][posj + 1] == '*') {
    							ok2 = false;
    							break;
    						}
    						posj++;
    					}
    					if (ok2) {
    						if (posj - j > 4) {
    							return false;
    						}
    						count[posj - j]++;
    						for (int t = j; t != posj; t++) {
    							used[i][t] = true;
    						}
    					}
    				}
    			
    				if (!ok1 && !ok2) {
    					return false;
    				}
    			}
    		}
    	}
    			
    	if (count[1] == 4 && count[2] == 3 && count[3] == 2 && count[4] == 1) {
    		return true;
    	}
    
    	return false;
    
    }
    
    int main() {
    	int n;
    	cin >> n;
    
    	vector <string> vec;
    	char a[10][10];
    
    	for (int i = 0; i < n; i++) {
    		for (int j = 0; j < 10; j++) {
    			for (int k = 0; k < 10; k++) {
    				cin >> a[j][k];
    			}
    		}
    		if (f(a)) {
    			vec.push_back("YES");
    		}
    		else {
    			vec.push_back("NO");
    		}
    	}
    
    	for (int i = 0; i < vec.size(); i++)
    	    {
    		    cout << vec[i] << endl;
    	    }
    	
    	return 0;
    }

Пример № 7

Форум одного известного сайта представляет собой дерево разделов: самый главный раздел называется "main", в него вкладываются другие разделы, в которые в свою очередь также допускаются вложения и так далее.

Дано описание дерева разделов, а именно, для каждого раздела, кроме "main" известно, какой раздел является для него родительским. Ваша задача — вывести дерево разделов в формате:

  • название каждого раздела находится на отдельной строке
  • перед названием выводится 2*h пробелов, где h — уровень вложенности раздела
  • дерево выводится по правилу: сначала выводится текущий раздел, потом рекурсивно выводятся его подразделы по этому же правилу

Уровень вложенности раздела "main" равен 0.

Нужно вывести дерево в специальном формате:
#include <iostream>
#include <fstream>
#include <vector>
#include <map>
#include <string>
#include <set>
#include <algorithm>

using namespace std;

map <string, set <string> > ans;

void f (set <string> :: iterator iter2, int level) {
	for (int i = 0; i < 2 * level; i++) {
			cout << " ";
	}
	cout << *iter2 << endl;
	level++;
	if (ans.count (*iter2)) {
		map <string, set <string> > :: iterator ite = ans.begin();
		while (ite -> first != *iter2) {
			ite++;
		}
		for (set <string> :: iterator iter4 = (ite -> second).begin(); iter4 != (ite -> second).end(); iter4++) {
			f (iter4, level);
		}
	} 
	else {
		return;
	}
}

int main() {
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		string s1, s2;
		cin >> s1 >> s2;
		if (!ans.count(s2)) {
			set <string> set1;
			set1.insert(s1);
			ans.insert (make_pair (s2, set1));
		}
		else {
			ans[s2].insert (s1);
		}
	}

	map <string, set <string> > :: iterator it;

	for (it = ans.begin(); it != ans.end(); it++) {
		if (it -> first == "main") 
			break;
	}

	cout << it -> first << endl;

	for (set <string> :: iterator iter3 = (it -> second).begin(); iter3 != (it -> second).end(); iter3++) {
		f (iter3, 1);
	}
	return 0;
}

Пример № 8

Назовем соседями точки (xy) четыре других точки: (x + 1, y), (x - 1, y), (xy + 1), (xy - 1).

Назовем расширением множества точек множество, получаемое одновременным добавлением всех соседей всех точек из данного множества.

Дано множество точек на плоскости с целочисленными координатами. Ваша задача — найти k-расширение этого множества, т.е. множество, получаемое из данного k последовательными расширениями.

Гарантируется, что в k-расширении исходного множества будет не более, чем 500000 точек.
#include <iostream> 
#include <fstream> 
#include <vector> 
#include <map> 
#include <set> 
#include <algorithm> 
#include <string> 
#include <queue>

using namespace std;

int main() {
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);

	int n, k;
	cin >> n >> k;

	queue < pair <int, int> > a;
	set < pair <int, int> > ans;
	queue < pair <int, int> > q;
	
	for (int i = 0; i < n; i++) {
		int x, y;
		cin >> x >> y;
		a.push (make_pair(x, y));
		ans.insert(make_pair(x, y));
	}

	while (k > 0) {
		while (a.size()) {
			int c = a.front().first;
			int d = a.front().second;
			a.pop();

			ans.insert(make_pair(c - 1, d));
			ans.insert(make_pair(c, d - 1));
			ans.insert(make_pair(c, d + 1));
			ans.insert(make_pair(c + 1, d));

			if (k != 1) {
				ans.insert(make_pair(c - 1, d));
				ans.insert(make_pair(c, d - 1));
				ans.insert(make_pair(c, d + 1));
				ans.insert(make_pair(c + 1, d));
				q.push (make_pair(c - 1, d));
				q.push (make_pair(c, d - 1));
				q.push (make_pair(c, d + 1));
				q.push (make_pair(c + 1, d));
			}
		}
		a = q;
		while (q.size()) {
			q.pop();
		}
		k--;
	}

	for (set < pair <int, int> > :: iterator it = ans.begin(); it != ans.end(); it++) {
		cout << (*it).first << ' ' << (*it).second << endl;
	}

	return 0;
}

Достоинства, недостатки и критика

Особенности

С одной стороны, С++ является потомком Симулы, которую Алан Кэй определил[19] как «Алгол с классами», и потому будет актуальной оценка С++ в сравнении с другими языками из семейства потомков Алгола (Basic, Pascal, Java, C#, Visual Basic, Delphi, D, Oberon и пр.). С другой стороны, С++ претендует на мультипарадигменность и универсальную применимость (в отличие от Си, ориентированного на очень узкий круг задач), и используется в промышленности намного шире других потомков Алгола, и потому будет актуальной оценка С++ в сравнении со всем многообразием применяемых языков, включая и Си. Во избежание повторений, оценки обычно совмещаются.

С++ — язык, складывающийся эволюционно. В отличие от языков с формальным определением семантики (см. Спецификация языков программирования), каждый элемент С++ заимствовался из других языков отдельно и независимо от остальных элементов (ничто из предложенного С++ за всю историю его развития не было новшеством в Computer Science), что сделало язык чрезвычайно сложным, со множеством дублирующихся и взаимно противоречивых элементов, блоки которых основаны на разных формальных базах. В этом отношении С++ повторяет путь PL/1, но, в отличие от последнего, длительное повсеместное использование С++ обеспечил выбор языка Си в качестве отправной точки.

Критики С++ не противопоставляют ему какой-либо конкретный язык, а наоборот, утверждают, что для всякого случая применения С++ всегда существует альтернативный инструментарий, позволяющий решить ту же задачу более эффективно и качественно. В свою очередь, сторонники С++ считают некорректным сравнивать различные аспекты С++ с совершенно различными языками, так как общий набор средств и возможностей С++ существенно шире, чем в большинстве языков, с которыми проводится сравнение, и сама по себе широта возможностей, на их взгляд, является веским оправданием несовершенства каждой отдельно взятой возможности. Более того, по их мнению, высокая совместимость с Си является одной из принципиальных черт языка, и потому все недостатки С++ оправданы преимуществами, предоставляемыми этой совместимостью (см. раздел Философия C++). При этом сторонники C++ игнорируют подтверждённый исследованиями[20][21] факт, что декомпозиция проекта на несколько разных языков, наиболее пригодных для своих мини-задач, (или просто использование одного наилучшим образом подходящего языка) сокращает на порядок общую трудоёмкость разработки при одновременном повышении на порядки основных показателей качества программирования. По этой причине критики не соглашаются рассматривать недостатки С++ по отдельности и тем более делать поправку на «универсальность», утверждая, что если задача требует одновременно высокоуровневых и низкоуровневых возможностей, то использование Си совместно с языками, из которых заимствованы отсутствующие в Си возможности C++, будет более разумным, чем внедрение этих возможностей в сам Си и использование полученного языка резко возросшей степени внутренней сложности.

Таким образом, одно и то же свойство языка (совмещение большого числа элементов разных языков и отсутствие конкретной целевой ниши применения) рассматривается сторонниками как «главное достоинство», а критиками — как «главный недостаток».

Следует отметить, что рассмотрение элементов языка по отдельности означает отказ от рассмотрения языка как системы, а следовательно, и от ожидания синергизма,— что делает ограниченным (конечным) потенциал роста сложности абстракций, которые можно выразить посредством этого языка, и соответственно сужает спектр реализуемых на нём программных систем.

С++ заявляется как кроссплатформенный: стандарт языка накладывает минимальные требования на ЭВМ для запуска скомпилированных программ. На практике, для написания портируемого кода на С++ требуется огромное мастерство и опыт, и «небрежные» коды на С++ с высокой вероятностью могут оказаться непортируемыми[22]. Тонкое владение С++ в принципе может сделать код на С++ столь же портируемым, что и код на Си (хотя, по мнению Линуса Торвальдса, С++ при этом фактически сократится до своего подмножества Си[23]). Однако, критики С++ утверждают, что изучение и использование одновременно всех языков, противопоставляемых С++ (не вызывающих серьёзных проблем при портировании), в сумме требует примерно тех же интеллекта, усилий и временных затрат, что и изучение и использование одного только С++ на высококлассном уровне — в связи с чем становится актуальной также оценка порога вхождения и результативности (производительности и качества труда программистов).

Многие аспекты в спорах «за и против С++» обусловлены расхождением в сущностном понимании процесса стандартизации. Б.Страуструп и его последователи считают, что «стандарт — это контракт между программистами, разрабатывающими программы на языке, и программистами, разрабатывающими компиляторы языка»[9]. Каждый новый стандарт С++ являлся декларацией того, что отныне должно быть реализовано во всех компиляторах — при том, что С++ имеет естественное определение семантики, то есть потенциально зависим от реализации (стандарт содержит множество пунктов, определённых как «implementation-defined»). Традиционно, успешная стандартизация в технике представляет собой формальный перевод стандарта из статуса де-факто в статус де-юре (подытоживание общепринятых, устоявшихся знаний для обеспечения надёжной внутриотраслевой совместимости). Все противопоставляемые С++ языки программирования, если проходили процедуру стандартизации (что не обязательно для портируемости), то лишь после многолетней апробации на практике; при этом все они изначально имеют формальное определение семантики, так что накапливающиеся к моменту стандартизации изменения от первой версии языка оказываются не принципиальны. Теоретически эти определения стандартизации тождественны. На практике определение Страуструпа согласуется с традиционным лишь при условии, что нет абсолютно никаких препятствий против немедленного и беспрекословного подчинения статуса де-факто декларированному де-юре — то есть если абсолютно все компиляторы реализуют поддержку нового стандарта сразу после его выхода и со 100 % соответствием ему, и что новый стандарт не отменяет никаких положений старого, кроме признанных убыточными или вредоносными. Так может происходить лишь в условиях полного отсутствия человеческого фактора (иначе говоря, при отсутствии программистов как таковых). На практике именно этим и обусловлено значительное отставание реальной кроссплатформенности С++ от заявленной разработчиками стандарта и противоречивость предлагаемых возможностей. Сторонники С++ считают взгляд Страуструпа на стандартизацию более практико-ориентированным и принимают порождаемые им проблемы за должное.

Достоинства

C++ содержит средства разработки программ контролируемой эффективности для широкого спектра задач, от низкоуровневых утилит и драйверов до весьма сложных программных комплексов. В частности:

  • Высокая совместимость с языком Си : код на Си может быть с минимальными переделками скомпилирован компилятором C++. Внешнеязыковой интерфейс является прозрачным, так что библиотеки на Си могут вызываться из C++ без дополнительных затрат, и более того — при определённых ограничениях код на С++ может экспортироваться внешне не отличимо от кода на Си (конструкция extern "C").
  • Как следствие предыдущего пункта — вычислительная производительность. Язык спроектирован так, чтобы дать программисту максимальный контроль над всеми аспектами структуры и порядка исполнения программы. Один из базовых принципов С++ — «не платишь за то, что не используешь» (см. Философия C++) — то есть ни одна из языковых возможностей, приводящая к дополнительным накладным расходам, не является обязательной для использования. Имеется возможность работы с памятью на низком уровне.
  • Поддержка различных стилей программирования: традиционное императивное программирование (структурное, объектно-ориентированное), обобщённое программирование, функциональное программирование, порождающее метапрограммирование.
  • Автоматический вызов деструкторов объектов в адекватном порядке (обратном вызову конструкторов) упрощает и повышает надёжность управления памятью и другими ресурсами (открытыми файлами, сетевыми соединениями, соединениями с базами данных и т. п.).
  • Перегрузка операторов позволяет кратко и ёмко записывать выражения над пользовательскими типами в естественной алгебраической форме.
  • Имеется возможность управления константностью объектов (модификаторы const, mutable, volatile). Использование константных объектов повышает надёжность и служит подсказкой для оптимизации. Перегрузка функций-членов по признаку константности позволяет определять выбор метода в зависимости цели вызова (константный для чтения, неконстантный для изменения). Объявление mutable позволяет сохранять логическую константность при виде извне кода, использующего кэши и ленивые вычисления.
  • Шаблоны C++ дают возможность построения обобщённых контейнеров и алгоритмов для разных типов данных. Попутно шаблоны дают возможность производить вычисления на этапе компиляции.
  • Возможность расширения языка для поддержки парадигм, которые не поддерживаются компиляторами напрямую. Например, библиотека Boost.Bind позволяет связывать аргументы функций. Используя шаблоны и множественное наследование, можно имитировать классы-примеси и комбинаторную параметризацию библиотек. Такой подход применён в библиотеке Loki, класс SmartPtr которой позволяет, управляя всего несколькими параметрами времени компиляции, сгенерировать около 300 видов «умных указателей» для управления ресурсами.
  • Возможность встраивания предметно-ориентированных языков программирования в основной код. Такой подход использует, например библиотека Boost.Spirit, позволяющая задавать EBNF-грамматику парсеров прямо в коде C++. Boost.Spirit реализует рекурсивно-нисходящий алгоритм, что накладывает соответствующие ограничения (такие как недопустимость левой рекурсии).
  • Доступность. Для С++ существует огромное количество учебной литературы, переведённой на всевозможные языки. Язык имеет высокий порог вхождения, но среди всех языков такого рода обладает наиболее широкими возможностями.

Недостатки и критика

Сторонники С++ позиционируют его как «универсально применимый» — вплоть до отождествления «применимости» с Тьюринг-полнотой (что является ошибкой) и одновременно с оптимальностью, то есть обоснованностью выбора его в качестве инструмента для данной конкретной задачи; при этом ни одной конкретной задачи не обозначается, а наоборот, делается утверждение, что С++ подходит для любой задачи (что теоретически невозможно[пояснения 2])К:Википедия:Статьи без источников (тип: не указан)[источник не указан 3833 дня]. Однако С++ не отвечает многим требованиям качества программирования, не предъявляемым к Си, но важным для широкого спектра задач прикладного программированияК:Википедия:Статьи без источников (тип: не указан)[источник не указан 3833 дня]. В частности, критикиК:Википедия:Статьи без источников (тип: не указан)[источник не указан 3833 дня] полагают, что:

В то же время, критике подвергается и применимость С++ в низкоуровневой разработке в качестве «улучшенного Си»К:Википедия:Статьи без источников (тип: не указан)[источник не указан 3833 дня].

Многие конкретные недостатки вытекают непосредственно из свойств семантики системы типов языка: она не отвечает требованиям полноты и ортогональности, при этом обладает избыточностью и предусматривает понятие «приведения типов» (как явно, так и неявно)К:Википедия:Статьи без источников (тип: не указан)[источник не указан 3833 дня]. В отношении типизации, С++ чаще всего противопоставляются либо типизируемые по Хиндли-Милнеру, либо динамически типизируемые языкиК:Википедия:Статьи без источников (тип: не указан)[источник не указан 3833 дня]. Начиная со стандарта C++0x, в языке появилась возможность автоматического выведения типов, из-за чего возникло заблуждение, что отныне «С++ поддерживает вывод типов по Хиндли-Милнеру». Однако, системе типов С++ противопоставляется не сам механизм выведения типов, а полиморфная семантика системы типов Хиндли-Милнера, предусматривающая в том числе и механизм выведения, но не как главное преимуществоК:Википедия:Статьи без источников (тип: не указан)[источник не указан 3833 дня]. Существуют примеры развития Си по пути типизации Хиндли-Милнера (см. раздел Влияние и альтернативы)К:Википедия:Статьи без источников (тип: не указан)[источник не указан 3833 дня].

Критика C++ с позиций только ООП (без сравнения методологий проектирования) с описанием вреда от влияния C++ на другие языки приведена в работе[24]. В случае языково-ориентированного проектирования программ применимость С++, как и при использовании любых других языков, ограничивается нижним уровнем системы — реализацией предметно-специфичных языков (DSL) первого уровня. Для этой задачи С++ объективно является далеко не оптимальным выбором (см. раздел Отсутствие возможностей). В случае применения методологии «чистого встраивания» DSL в язык общего назначения [21] (которая является традиционной для Lisp/ML, и для которой в С++ потенциально предназначена библиотека Boost.Spirit), с т.з. воплощения изоморфизма Карри-Ховарда выбор С++ в качестве базы был бы абсурден (см. ниже)К:Википедия:Статьи без источников (тип: не указан)[источник не указан 3833 дня]. Наиболее ортодоксальные противники С++ утверждают, что этот язык нельзя использовать в реальной индустрии вообще, и его существование имеет лишь педагогический смысл — в качестве образцово-показательной коллекции антипаттернов в задаче разработки языков программированияК:Википедия:Статьи без источников (тип: не указан)[источник не указан 3833 дня].

Синтаксис

Громоздкость 
Определение синтаксиса является одним из самых громоздких и продолжает расширяться. Стандарт 2003 г. содержал уже более 200 строк РБНФ, усложнённых наличием среди них массы неоднозначностей (англ. disambiguations). Даже семантически более мощные языки имеют существенно более простой синтаксис (например, РБНФ языка Scheme по стандарту R6RS составляет всего 12 основных строк плюс 11 строк т. н. «синтаксического сахара», то есть необязательных). Громоздкость синтаксиса С++ порождает массу проблем:К:Википедия:Статьи без источников (тип: не указан)[источник не указан 3833 дня].
Принуждение к избыточности 
Многие языки предлагают избыточность — несколько перегружающих друг друга способов получить один и тот же результат, так что использующие их программисты оказываются свободны в выборе; при этом в иных ситуациях эти языковые элементы оказываются полезны каждый по своемуК:Википедия:Статьи без источников (тип: не указан)[источник не указан 3833 дня]. С++ вынуждает использовать необоснованно перегружающие друг друга элементы, что приводит к неделимому перемешиванию «что» и «как» в программировании (функциональности и её реализации)[24]. Доступ к данным («что»-операция) в С++ осуществляется двумя «как»-операциями: «.» и «->» в зависимости от того, как именно в данном контексте реализовано представление данных. Полиморфизм так же имеет две реализации: простую и виртуальную. Наряду с наследованным из Си управлением памятью через malloc/free добавляется управление памятью через new/delete и new[]/delete[], и не осуществляется никакого контроля за парностьюК:Википедия:Статьи без источников (тип: не указан)[источник не указан 3833 дня]. Можно выделить блок с помощью new[], а затем высвободить с помощью delete или даже free — это приводит к скрытым ошибкам и нестабильной работе программ (так как new и new[] реализованы через malloc, но выполняют больше инициализаций, подчистка которых в этом случае не производится)К:Википедия:Статьи без источников (тип: не указан)[источник не указан 3833 дня]. То же касается приведения типов — наряду с наследованным из Си простым приведением типов, в С++ добавлены специальные операции — dynamic_cast, static_cast, const_cast, reinterpret_castК:Википедия:Статьи без источников (тип: не указан)[источник не указан 3833 дня].

Тяжелое наследие

С++ унаследовал от Си множество низкоуровневых свойств, из-за которых использование высокоуровневых конструкций затрудняется даже в задачах, где низкоуровневые возможности сами по себе не используютсяК:Википедия:Статьи без источников (тип: не указан)[источник не указан 3833 дня]. В книге Страуструпа «Дизайн и эволюция C++» [9] это оправдывается попыткой сохранить обратную совместимость с Си, где эти свойства изначально оправданы и не являются недостатками. Однако, при рассмотрении С++ как самостоятельного языка прикладного программирования, эти свойства превращаются в недостаткиК:Википедия:Статьи без источников (тип: не указан)[источник не указан 3833 дня], так как приводят к неоправданному существенному затруднению процесса прикладной разработки и невозможности включить в процесс не владеющих программированием специалистов предметной области задачи, как это описано в[21] К:Википедия:Статьи без источников (тип: не указан)[источник не указан 3833 дня].

Сложное поведение между точками следования 
Операции присваивания (=), инкремента (++), декремента (--) и др. являются в Си выражениями, возвращающими значение, а не формируют самостоятельную императивную команду, как в других императивных языках — и С++ унаследовал это свойствоК:Википедия:Статьи без источников (тип: не указан)[источник не указан 3833 дня]. Однако, в отличие от простых выражений, данные операции осуществляют изменение состоянияК:Википедия:Статьи без источников (тип: не указан)[источник не указан 3833 дня]. В нечистых ФЯ (Lisp, ML) изменение состояния обычно делается самостоятельной императивной командой, не возвращающей значения, что делает их как минимум хорошо заметными при чтении кода. В С++ же это позволяет создавать трудночитаемые выражения, размещая сложное поведение между точками следования, что влечёт труднообнаружимые ошибки и снижает портируемостьК:Википедия:Статьи без источников (тип: не указан)[источник не указан 3833 дня]. В Си такая семантика, несмотря на её опасность, была предназначена для обеспечения возможности ручной оптимизации кода (немедленное использование значения выражения позволяет избавиться от ненужных ассемблерных команд пересылки данных)К:Википедия:Статьи без источников (тип: не указан)[источник не указан 3833 дня]. Однако, в настоящее время оптимизирующие компиляторы обычно генерируют оптимальный код и на традиционных выражениях (устраняя ненужные ассемблерные команды автоматически)[25], так что выгода от этой возможности С++ более не компенсирует порождаемые ею проблемы в прикладном программировании.
Разрушающее присваивание вместо ветвления 
Операции разрушающего присваивания (=) и логического сравнения (==) синтаксически схожи. Поскольку присваивание является в С++ операцией, возвращающей значение, то замена сравнения на присваивание в любом контексте является синтаксически и семантически корректным, но в корне изменяет поведение программы, что влечёт труднообнаружимые ошибки. Типичный пример подобной ошибки:
if (x=0) { операторы }
Здесь в условном операторе записан один символ равенства вместо двух, то есть операция присваивания вместо операции сравнения. В результате, вместо того, чтобы сравнить текущее значение x с нулём, программа присвоит x нулевое значение, затем возьмёт результат этого выражения (ноль), выполнит неявное приведение типа к булеву значению «ложь» (поскольку так того требует семантика оператора if), и блок операторов в условной конструкции не выполнится никогда. В развитых компиляторах С++ предлагается диагностика некоторых подобных синтаксических случаев с выдачей предупреждений, но реализация подобной диагностики для С++ весьма трудоёмка.
Приведение типов 
Некоторые преобразования типов не интуитивны, хотя могут производиться неявно. В частности, операция над беззнаковым и знаковым числами порождает беззнаковый результат; однако, в аксиоматике теории множеств множество натуральных чисел (N) является подмножеством множества целых (Z), а совместное использование элементов разных множеств допустимо лишь на уровне общего надмножества — то есть интуитивным было бы получение в результате целого (знакового) числа, но в С++ происходит наоборот, и возникает риск труднообнаружимой ошибки[22].
Операторы управления 
C++, как и Си, позволяет пропускать break в ветви оператора switch с целью последовательного выполнения нескольких ветвей, что влечёт труднообнаружимые ошибки. Во многих языках семантика оператора выбора более строгая. В C# необходимо всегда писать либо break, либо использовать goto case N для явного указания порядка выполнения[26]. В потомках ML при сопоставлении с образцом не только синтаксически строго обозначаются границы блоков ветвлений, но и контролируется совпадение количества вариантов с определением разбираемого вариантного типа. По аналогии с ML, допущенный в Си недостаток его создатели (Керниган и Ритчи) исправили в языке Limbo.

Отсутствие возможностей

Рефлексивное метапрограммирование 
Рефлексивное метапрограммирование в С++ невозможно (равно как и во всех остальных потомках Алгола). Интроспекция предусмотрена, но реализована отдельно от основной системы типов, что делает её практически бесполезной. Наибольшее, что можно получить — параметризацию поведения на заранее известном диапазоне случаев. Это является препятствием против применения С++ в большинстве подходов к реализации Искусственного Интеллекта (за исключением самых примитивных, реализующих статический алгоритм).
Порождающее метапрограммирование 
Порождающее метапрограммирование на основе шаблонов C++ трудоёмко и ограничено по возможностям. Оно осуществляется за счёт реализации статического (исполняемого на этапе компиляции) интерпретатора примитивного функционального языка программирования посредством шаблонов C++, а также примитивного препроцессора, унаследованного от Си. Сама по себе данная возможность весьма привлекательна, но, во-первых, код на шаблонах С++ имеет крайне низкие показатели понимаемости и тестируемости; во-вторых, при разворачивании шаблонов порождается неэффективный код, так как язык шаблонов не предоставляет никаких средств для оптимизации (см. также раздел Вычислительная производительность). При этом встраиваемые предметно-специфичные языки, реализуемые таким образом, всё равно требуют знания самого С++ для их использования, так как возводимые барьеры абстракции сохраняют все свойства нижележащей реализации, что не обеспечивает полноценное разделение труда. Таким образом, возможности С++ по расширению возможностей самого С++ весьма ограничены. Перечисленных недостатков лишены метаязыки, такие как диалекты Lisp и ML, их потомки и гибриды (Haskell, Nemerle), а также Рефал, и потому они являются оптимальным выбором для задачи разработки языков тем или иным способом. В Common Lisp, Nemerle и Template Haskell имеются подсистемы метапрограммирования, делающие доступным свободное определение синтаксиса операций; с их помощью становится возможным встраивание в код предметно-ориентированных языков, не требующих знания основного языка, что обеспечивает эффективное разделение труда разработчиков[27][28]
Подобные возможности иным способом предоставляют SML и OCaml. Причиной отставания мощности языка шаблонов С++ является то, что, в отличие от метаязыков, где в качестве подсистемы метапрограммирования используется сам основной язык, в С++ язык шаблонов представляет собой отдельный язык, не совпадающий и не пересекающийся с самим С++ (который к тому же не был задуман создателями языка, а был спонтанно обнаружен хакерами), из-за чего потенциал роста сложности абстракций оказывается ограниченным. В языке D также реализована подсистема шаблонного метапрограммирования, сравнимая по мощности с оной в С++, но более простая в применении.
Функциональное программирование 
Явная поддержка функционального программирования присутствует только в стандарте C++0x, вышедшим лишь после почти 30 лет развития языка. До этого данный пробел устранялся различными библиотеками (Loki, Boost), использующими язык шаблонов для расширения основного языка функциональными конструкциями. Качество подобных решений значительно уступает качеству встроенных в функциональные языки решений[пояснения 3] и качеству реализаций высокоуровневых возможностей С++ (таких как ООП) посредством функциональных языков. Все реализованные в C++ возможности ФП оказываются лишь их эмуляцией и используются совместно с императивными возможностями, что не даёт возможности применения присущих ФП мощных оптимизационных методик (см. раздел Вычислительная производительность). Кроме того, из-за трудоёмкости использования шаблонов, на практике ФП в С++ обычно ограничивается вызовами функциональных библиотек и реализацией отдельных методов, и практически не даёт преимуществ в проектировании программ (см. Соответствие Карри — Ховарда и пред.пункт), так что оно в С++ по-прежнему осуществляется обычно лишь посредством объектно-ориентированной декомпозиции.
Контроль за поведением 
Принцип С++ «не платишь за то, что не используешь» (см. Философия C++) заявляется как средство обеспечения высокой скорости исполнения. На практике он лишь приводит к чрезмерному использованию ситуативного (ad hoc) полиморфизма — явного описания различного поведения даже для редких ситуаций под единым идентификатором — то есть перегрузки функций. В С++ предусмотрено сразу три формы перегрузки, что приводит к значительному дублированию кода. Перегрузка операторов призвана дать возможность введения в программу т. н. «синтаксического сахара», но в С++ может поощрять к бесконтрольному изменению поведения элементарных операций, в том числе new/delete и new[]/delete[], для разных типов (что резко повышает риск разного рода ошибок). Это обусловлено, во-первых, тем, что вводить новый синтаксис нельзя (хотя синтаксис стандартных операторов С++ адекватен семантике далеко не всех типов, которые может потребоваться ввести в программу); а во-вторых, тем, что всякий учебник даже для низкого порога вхождения показывает, как перегружать те или иные операторы, включая и управление временем жизни объектов. (Обычно ввод специального синтаксиса для операций является совершенно безболезненным в аппликативных языках, где эта возможность существует независимо от полиморфной семантики системы типов и не предоставляет доступа к управлению памятью.) Некоторые интуитивно ожидаемые операции (подчистка динамических объектов в случае генерации исключений) в С++ не выполняются в соответствии с означенным принципом; в то же время, значительная часть перегруженных функций и операторов вызывается неявно (приведение типов, создание временных экземпляров классов и др.). Попутно идеология языка спутывает «контроль за поведением» с «контролем за эффективностью» — что представляет опасность, так как де-факто возможности явного контроля этих аспектов исполнения программы со стороны человека являются взаимоисключающими[пояснения 4]. В сочетании с изобилием побочных эффектов всё это приводит к тому, что по мере роста сложности системы код на С++ не абстрагируется, а, наоборот, усложняется, и значительно снижаются показатели понимаемости и тестируемости — возникает необходимость контролировать (как чтением, так и отладкой) слои реализации по разные стороны от текущего барьера абстракции, что считается плохой практикой в программировании. В результате трудоёмкость (а значит, и стоимость) разработки растёт от объёма реализованной функциональности по вогнутому закону (в языках с полиморфной семантикой системы типов этот рост характеризуется выпуклой кривой за счёт существенно более высокого показателя повторного использования кода).
Модульность и абстракция 
Как отмечает Ян Джойнер[24], С++ ошибочно отождествляет инкапсуляцию и сокрытие (см. также раздел Идеология компонентности), при этом контролируя совпадение типов на уровне их идентификаторов, а не сигнатуры. Как следствие, оказывается невозможно подменять модули (классы), основываясь на совпадении их интерфейсной функциональности. То есть если некоторые возможности отсутствуют в С++, но реализованы на уровне библиотек (такие как сборка мусора или длинная арифметика), то для получения выгоды от них необходимо вручную модифицировать уже имеющийся код для адаптации его под новый модуль. В языках самых разных семантик (ML, Smalltalk, Erlang, Python, и даже Си) полиморфизм, инкапсуляция и сокрытие являются независимыми (ортогональными) категориями, а контроль типов осуществляется по соответствию их сигнатур, а не идентификаторов,— так что выгода от нового кода обеспечивается простой подменой имеющегося модуля на новый, что и называется абстракцией. В С++, как отмечает Линус Торвальдс[23], код кажется абстрактным лишь до тех пор, пока не возникает необходимость его изменить.

Избыточные и опасные возможности

Гарантия некорректности 
Из-за слабой системы типов программист оказывается волен легко нарушить заданную в конкретном случае дисциплину программирования. Например, хотя модификатор const предназначен для повышения предсказуемости поведения (что должно облегчить доказательство корректности, и, как следствие, расширить возможности оптимизации), но модификатор mutable предназначен именно для принудительного разрешения изменения состояния внутри константного объекта. Это значит, что код сторонней библиотеки на С++ может содержать изменяемое состояние вопреки любым попыткам назначить ему извне свойство константности. Более того, допускается динамически удалить атрибут const с константного объекта, превращая его в леводопустимый (L-value). Сама по себе явная декларация в спецификации языка подобных возможностей делает попытки формальной верификации бессмысленными.
Неконтролируемая макроподстановка 
Средства макроподстановки Си (#define) являются сколь мощным, столь же опасным средством. Они сохранены в C++ несмотря на то, что для решения всехК:Википедия:Статьи без источников (тип: не указан)[источник не указан 3885 дней] задач, для которых они были предусмотрены в Си, в С++ были предоставлены более строгие и специализированные средства — шаблоны, перегрузка функций, inline-функции, пространства имён, более развитая типизация, расширение применения модификатора const, и др. В унаследованных от Си стандартных библиотеках много потенциально опасных макросов.[29] Шаблонное метапрограммирование также порой совмещается с использованием макроподстановки для обеспечения т. н. «синтаксического сахара».
Неэкономная экономия 
В контексте задач, для решения которых разработан Си, считается опасным расширение его до С++, и не только из-за искажения имён (name mangling), увеличения библиотеки времени исполнения (RTL) и раздувания кода использованием шаблонов (см. раздел Вычислительная производительность), но в большей степени из-за присущей С++ идеологии программирования. Из того, что Си является подмножеством С++, вообще говоря, не следует, что С++ должен быть однозначно лучше, чем Си; и противники С++ утверждают, что в данном случае расширение возможностей системы привело к серьёзному ухудшению её свойств. Например, Линус Торвальдс придерживается такого мнения:
С++ — кошмарный язык. Его делает ещё более кошмарным тот факт, что множество недостаточно грамотных программистов используют его, до такой степени, что оказывается намного проще выкинуть его как мусор. Откровенно говоря, даже если нет *никаких* причин для выбора Си, кроме того чтобы держать С++-программистов подальше — то одно это уже будет достаточно веским основанием для использования Си.
…Я пришёл к выводу, что *действительно* предпочту выгнать любого, кто предпочтёт вести разработку проекта на С++, нежели на Си, чтобы этот человек не загубил проект, в который я вовлечён.
С++ приводит к очень, очень плохим проектным решениям. Неизбежно начинают применяться «замечательные» библиотечные возможности вроде STL, и Boost, и прочего мусора, которые могут «помочь» программированию, но порождают:
— невыносимую боль, когда они не работают (и всякий, кто утверждает, что STL и особенно Boost стабильны и портируемы, настолько погряз во лжи, что это даже не смешно)
— неэффективно абстрагированные программные модели, когда спустя два года обнаруживается, что какая-то абстракция была недостаточно эффективна, но теперь весь код зависит ото всех окружающих её замечательных объектных моделей, и её нельзя исправить, не переписав всё приложение.
Другими словами, единственный способ иметь хороший, эффективный, низкоуровневый и портируемый С++ сводится к тому, чтобы ограничиться всеми теми вещами, которые элементарно доступны в Си. А ограничение проекта рамками Си будет означать, что люди его не выкинут, и что будет доступно множество программистов, действительно хорошо понимающих низкоуровневые особенности и не отказывающихся от них из-за идиотской ерунды про «объектные модели».
… когда эффективность является первостепенным требованием, «преимущества» С++ будут огромной ошибкой.

Линус Торвальдс, [23]

Более эффективными и качественными инструментами в этой сфере могут быть другие потомки Си (см. раздел Влияние и альтернативы).

Вычислительная производительность

Результирующий объём исполнимого кода 
Использование шаблонов C++ представляет собой параметрический полиморфизм на уровне исходного кода, но при трансляции он превращается в ситуативный (ad hoc) полиморфизм (то есть перегрузку функций), что приводит к существенному увеличению объёма машинного кода в сравнении с языками, имеющими истинно полиморфную систему типов (потомками ML). Для снижения размера машинного кода пытаются автоматически обрабатывать исходный код до этапа раскрутки шаблонов[30][31]. Другим решением могла бы быть стандартизованная ещё в 1998 году возможность экспорта шаблонов, но она доступна далеко не во всех компиляторах, так как её трудно реализовать[32][33][мнения 3] и для импорта библиотек шаблонов С++ в языки с существенно отличной от С++ семантикой она всё равно была бы бесполезна. Сторонники С++ оспаривают масштабы раздувания кода как преувеличенные[34], игнорируя даже тот факт, что в Си параметрический полиморфизм транслируется непосредственно, то есть без дублирования тел функций вообще. При этом сторонники С++ считают, что параметрический полиморфизм в Си опасен — то есть более опасен, чем переход от Си к С++ (противники С++ утверждают обратное — см. выше).
Потенциал к оптимизации 
Из-за слабой системы типов и изобилия побочных эффектов становится крайне затруднительным эквивалентное преобразование программ, а значит и встраивание в компилятор многих важных оптимизирующих алгоритмов — автоматического распараллеливания, устранения ненужных промежуточных представлений данных и вычислений, лямбда-лифтинга, вызовов процедур с передачей продолжений, суперкомпиляции и др. В результате реальная эффективность программ на С++ ограничивается имеющейся квалификацией программистов и вложенными в конкретный проект усилиями, и «небрежная» реализация может существенно уступать по эффективности «небрежным» реализациям на языках более высокого уровня, что подтверждается сравнительными испытаниями языков[35]. Это является существенным препятствием против применения С++ в индустрии data mining.
Эффективное управление памятью 
Потенциал к повышению эффективности управления памятью весьма ограничен. Хотя существуют многочисленные реализации автоматической сборки мусора, использование более эффективных способов управления памятью (таких как статический вывод регионов) для конкретной библиотеки невозможно (точнее, это привело бы к реализации поверх языка С++ интерпретатора нового языка, сильно отличающегося от С++ как большинством объективных свойств, так и общей идеологией) по причине необходимости прямого доступа к AST. Для автоматического управления памятью в С++ традиционно используются т. н. «умные указатели», ручное же управление памятью снижает эффективность самих программистов (см. раздел Результативность).
Замедление Си 
В условиях узко ограниченных вычислительных ресурсов (например, при программировании многих встраиваемых систем) неприемлемыми могут оказаться самые разные аспекты С++, отличающие его от Си. Механизм виртуальных функций реализуется посредством позднего связывания, то есть требует динамического вычисления реального адреса функции (RVA). Наконец, встраиваемая система может просто не располагать тем объёмом памяти, который необходим для библиотеки времени исполнения (RTL), сопровождающей любую программу на С++. Хотя формально стандарт не накладывает ограничения на состав этой библиотеки для конкретной программы на С++, при полном её удалении уже нельзя говорить об использовании языка С++ в качестве инструмента, так как большинство конструкций языка, связанные с RTL, окажутся утраченными (например, операции new/delete и new[]/delete[]) — будет иметь место язык Си или его подмножество, соответственно будет отличаться и идеология программирования.

Результативность

Соотнесение факторов результативности с затратами на разработку, а также общая культивируемая в сообществе программистов дисциплина и культура программирования важны для заказчиков, выбирающих язык (и, соответственно, предпочитающих этот язык разработчиков) для реализации задуманных ими проектов, а также для людей, начинающих изучать программирование, особенно с намерением программировать для собственных нужд.

Ручное управление памятью 
Как отмечается в исследовании[36], программисты на Си тратят 30 % — 40 % общего времени разработки (не считая отладки) только на управление памятью. Если в низкоуровневых задачах (для которых разработан Си) это оправданно, то в прикладных задачах широкого спектра (на которые претендует С++) это не только является напрасным, но и чревато ошибками. Для С++ существуют библиотечные средства автоматического управления памятью, но они применяются далеко не всегда, кроме того, их эффективность ограничена (см. также разделы Отсутствие возможностей и Вычислительная производительность).
В то же время существует эмпирическое исследование[37], показывающее, что разница в скорости разработки программного обеспечения на C++ и на Java, в которой реализована автоматическая сборка мусора, невелика.
Менеджмент проектов 
Перечисленные выше факторы делают сложность менеджмента проектов на С++ одной из самых высоких в индустрии разработки ПО.
Джеймс Коггинс, в течение четырех лет ведущий колонку в The C++ Report, дает такое объяснение:
— Проблема в том, что программисты, работающие в ООП, экспериментировали с кровосмесительными приложениями и были нацелены на низкий уровень абстракции. Например, они строили такие классы как «связанный список», вместо «интерфейс пользователя», или «луч радиации», или «модель из конечных элементов». К несчастью, строгая проверка типов, которая помогает программистам C++ избегать ошибок, одновременно затрудняет построение больших объектов из маленьких.

Ф. Брукс, Мифический человеко-месяц

Идеология компонентности 
Объектная модель С++, унаследованная от Симулы и дополненная двумя формами множественного наследования (простой и виртуальной), имеет не только объективные проблемы, но и опасную идеологию. По словам создателя Smalltalk Алана Кэя, объектная модель «Алгол с классами» обладает худшими характеристиками качества, чем модель «всё — объект»[19], и в этом смысле С++ уступает своему ближайшему конкуренту Objective-C: показатель повторного использования кода оказывается крайне низким (см. раздел Полиморфизм); рефлексивное метапрограммирование — невозможным; показатели понимаемости, модифицируемости и тестируемости — слабыми (см. раздел Отсутствие возможностей). Реализация указателей на методы классов не стандартизирована, и их размер в различных компиляторах варьируется от диапазоне 4 до 20 байт, что значительно снижает портируемость программ с их использованием[38]. Принятая в сообществе С++ характерная методология декомпозиции задач приводит к проектным решениям, не доказуемым математически и неадекватным предметной области, и потому угрожающим неоправданными затратами и скрытыми ошибками. Традиционно в математике (и, соответственно, в более строгих языках программирования) понятие «класс» отождествляется с понятием «множества» (или реже «категории»). Понятие «наследования классов» в информатике традиционно означает создание «подклассов», то есть «подмножеств» или «подтипов» (по Карри, тип определяется как множество значений). В С++ эта традиция не соблюдается (в соответствии с принципом «Дать программисту свободу выбора, даже если это даст ему возможность выбирать неправильно» — см. раздел Философия C++[пояснения 5]), и наследование зачастую используется вместо вложения — то есть определение нового типа на основании более простых взаимно-ортогональных типов осуществляется посредством создания не совершенно нового типа, инкапсулирующего эти типы (и ортогонального им), а «их общего подтипа» (несмотря на то, что ортогональность означает отсутствие точек соприкосновения). Например, в [39] приводится учебно-рекомендательный пример реализации типа (класса) «список» как подтипа (подкласса) от «одного элемента этого самого списка», и базовый класс (надкласс) «элемент несуществующего списка», хотя и позиционируется как абстрактный скалярный тип (контейнер для некоего единственного значения), тем не менее содержит операции, присущие агрегатным типам и внешним интерфейсам (функции доступа к другим элементам несуществующего списка, внешним по отношению к текущему объекту), однако не может расцениваться как агрегатный тип и не предназначен для самостоятельного использования. Такое отношение типов является абсурдом с т.з. математики и, как следствие, невоспроизводимо на более строгих языках. Идеология некоторых библиотек также прямо опирается на возможность приведения типов вверх и вниз по иерархии классов (операции static_cast и dynamic_cast), подтверждая, что типобезопасность не входит в традиции языка. При множественном наследовании картина может быть ещё хуже. Ошибочность проектных решений, принятых в соответствии с этой идеологией, может обнаруживаться на поздних этапах разработки и из-за высокой вязкости требовать повторной разработки значительных частей проекта. Ярким примером является описанный в[20] случай:
Пример подобной проблемы описан в [C.Potts, "Software-Engineering Research Revisited, " IEEE Software (Sept., 1993)] и [M.Lubers, C.Potts & C.Richter, "Developing Initial OOA Models, " Proc. Intl. Conf. Software Eng., Los Alamitos, Calif. (1992)]. Для исследования применимости объектно-ориентированной декомпозиции к системам разного рода были проанализированы три случая. Один из них был реальным проектом разработки системы наведения ракеты Томагавк. Разработчики сочли, что все ракеты можно разделить на подклассы в соответствии с видом боеголовки и навигационными характеристиками. Также их можно разделить на тактические и учебные. Эти две таксономии были практически ортогональны, и было принято решение использовать множественное наследование для применения этих категорий к конкретным видам ракет. Однако, на более поздней стадии разработки было обнаружено, что ортогональность нарушена: хотя некоторые виды учебных ракет могут нести боеголовки, ядерные ракеты не могут. Продолжение принятого подхода к построению архитектуры привело бы к неэлегантным и искусственным моделям, скрывающим под массой деталей исключительные ситуации, которые легко упустить.

— Martin Ward в [20]

Кроме того, в сообществе С++ культивировалось заблуждение, что инкапсуляция означает сокрытие данных. Многие языки разделяют эти понятия (например, в ML использование сигнатур позволяет гибко управлять сокрытием инкапсулированных в модуле определений; в Python возможность сокрытия вообще отсутствует, хотя механизмы инкапсуляции развиты лучше, чем в С++). Ян Джойнер критикует это заблуждение в С++:
Существует большая путаница относительно инкапсуляции, основным источником которой является С++, отождествляющий инкапсуляцию с сокрытием данных. Словарь Маккуори определяет глагол инкапсулировать как «помещать в прямом или переносном смысле в капсулу». Объектно-ориентированное понимание инкапсуляции заключается в том, чтобы помещать родственные данные, процедуры и определения в капсулу класса. Это не обязательно означает сокрытие. Сокрытие реализации является ортогональным понятием, которое становится возможным благодаря инкапсуляции. … Инкапсуляция предоставляет возможность отделять абстрактный интерфейс класса от его реализации: интерфейс — это видимая поверхность капсулы, реализация скрыта в капсуле. … Сокрытие реализации означает, что данными можно манипулировать, изменяя их, только внутри класса, но не означает сокрытие интерфейсных данных. … Для сокрытия реализации в С++ необходимо осуществлять доступ к данным через функции Си. Это называется сокрытием данных в С++. … Механизм доступа является скрываемой деталью реализации. С++ обеспечивает заметные различия в механизмах доступа к константам, переменным и функциям. … Большинство не-Си-подобных языков обеспечивают единый механизм доступа к константам, переменным и процедурам, возвращающим значения.

— Ian Joyner в [24]

Результирующий ущерб от совокупности описанных свойств отмечается также Линусом Торвальдсом[мнения 4]: С++ провоцирует на написание в дополнение к структурам и функциям Си значительного объёма кода, не имеющего принципиального значения с т.з. функциональности программы.
Качество и культура программирования 
В ответ на объективную критику, сторонники C++ утверждают, что ничто не вынуждает программиста на C++ использовать «плохие» языковые средства, если он умеет использовать имеющиеся в языке и предназначенные для этой же цели «хорошие», и что программист на C++ имеет возможность выбора в соответствии с личными предпочтениями и уровнем знаний,— тогда как другие языки обычно предлагают чётко очерченный баланс между порогом вхождения и результативностью программиста. Проблема заключается именно в условии понимания программистом целей, для которых были предусмотрены те или иные возможности. Лозунг С++ «не навязывать „хороший“ стиль программирования» имеет достоинством лишь снижение порога вхождения; с т.з. качества ПО он является недостатком (см. типобезопасность) — при высоких требованиях качества (не только в аспекте надёжности) предпочтительными являются языки с семантикой, сводящей к минимуму риск влияния человеческого фактора, то есть именно навязывающие «хороший» стиль программирования (Ada, SML, Haskell, BitC) — но такие языки имеют более высокий порог вхождения. Однако, при анализе свойств С++ как инструмента разработки, низкий порог вхождения и ожидание высокой результативности заявляются его сторонниками одновременно, без противопоставления — это один из аспектов, в котором С++ претендует на «универсальную применимость» (см. Философия C++). Но тогда, поскольку все элементы семантики C++, отсутствующие в Си, были заимствованы из других языков (зачастую чужеродных Алголу),— очевидно, что для адекватного и аккуратного применения взаимно противоречивых возможностей и избегания провоцируемых ими ошибок, программист на С++ должен изначально знать непосредственно эти языки и лежащую в их основе формальную базу. Этого, однако, не наблюдается: практика показывает, что преимущественно положительная оценка и предпочтение использования C++ характерны лишь для тех, кто не владеет ни одним языком, не являющимся потомком Алгола (не считая ограниченного набора узко специализированных языков, таких как SQL, HTML, Perl и др. — зачастую даже не полных по Тьюрингу); программисты же более высокого уровня обычно отзываются о C++ далеко не так оптимистично и стараются его избегать, если нет вынужденности поддерживать legacy code[мнения 5]. Обобщение этих мнений даёт основания полагать, что существует обратно-пропорциональная зависимость между умением программировать на С++ в «хорошем» стиле и желанием использовать С++ в качестве инструмента разработки — из которой следует, что защищающие С++ программисты, по всей видимости, заблуждаются в отношении того, что именно следует считать «хорошим» стилем программирования. В частности, Линус Торвальдс говорит, что использует субъективное мнение кандидатов о С++ в качестве критерия отсева (предпочитающие язык С++ языку Си отвергаются)[мнения 4]. Таким образом, контр-аргументация сторонников С++ в аспекте качества и культуры программирования оказывается не убедительна и не перекрывает объективную критику. При этом, сама по себе попытка перевести объективную критику в разряд субъективной в сочетании с позиционированием С++ как «универсально применимого» языка, очевидно, являет собой попытку существенно снизить порог вхождения для самой профессии программирования — заявить, что высококвалифицированным в принципе может считаться программист, использующий единственный язык общего назначения для всех задач.
Исправление исправного 
Непрерывная эволюция языка побуждает (а порой вынуждает) программистов раз за разом изменять уже отлаженный код — это не только удорожает разработку, но и несёт риск внедрения в отлаженный код новых ошибок. В частности, хотя изначально обратная совместимость с Си была одним из базовых принципов С++, с 1999 года Си перестал быть подмножеством С++, так что отлаженный код на Си уже не может использоваться в проекте на С++ без изменений.
Сложность ради самой сложности 
Как уже отмечено в разделе Отсутствие возможностей, принцип С++ «не платишь за то, что не используешь» последовательно приводит к увеличению на порядки стоимости развития и поддержки продукта. Другими словами, пока программист на С++ «не платит за то, что он в С++ не использует», его работодатель переплачивает за использование языка С++ и программиста на нём. Это не является аргументом для сторонников С++ в пользу смены инструмента разработки — напротив, С++ определяется ими как «мощнейший» именно потому, что он изобилует опасными взаимно-противоречивыми возможностями, возлагая ответственность за доказательство их корректности на программиста. При кажущейся абсурдности такого определения, ему существует психологическое объяснение, данное Эриком Реймондом — это делает язык сам по себе почвой для личностного самоутверждения, облегчая возможность субъективно превращать процесс разработки из средства в самоцель:
Программисты — это зачастую яркие люди, которые гордятся … своей способностью справляться со сложностями и ловко обращаться с абстракциями. Часто они состязаются друг с другом, пытаясь выяснить, кто может создать «самые замысловатые и красивые сложности». … соперники полагают, что должны соревноваться с чужими «украшательствами» путём добавления собственных. Довольно скоро «массивная опухоль» становится индустриальным стандартом, и все используют большие, переполненные ошибками программы, которые не способны удовлетворить даже их создателей.

… такой подход может обернуться неприятностями, если программисты реализуют простые вещи сложными способами, просто потому что им известны эти способы и они умеют ими пользоваться.

Эрик Реймонд в [40]

Саботаж 
Отмечены случаи, когда нерадивые программисты, пользуясь свойством сильной контекстной зависимости С++ и отсутствия возможности отслеживания макроопределений компилятором, тормозили разработку крупного проекта, написав буквально одну-две лишних, корректных с т.з. компилятора, строки кода, но внедрив за их счёт труднообнаружимую спонтанно проявляющуюся ошибку. Например:
#define if(a) if(rand())

#define j i
В языках с доказанной корректностью, даже с развитыми макро-средствами, нанести урон подобным образом невозможно.
Ненадёжность продукта 
Неоправданное обилие побочных эффектов (даже в таких простых операциях как индексация массива), в сочетании с отсутствием контроля со стороны системы времени исполнения языка и слабой системой типов, делает программы на С++ традиционно нестабильными, что исключает применение C++ при высоких требованиях отказоустойчивости. Кроме того, это увеличивает длительность самого процесса разработки[35]. Общеизвестные сообщения об ошибках при фатальных крахах прикладных программ, такие как «Access violation», «Pure virtual function call» или «Программа выполнила недопустимую операцию и будет закрыта», присущи в наибольшей степени именно С++. (Контр-примеры: для потомков ML фатальный крах в принципе невозможен — программа может навечно уйти в расчёты или выдать сообщение об ошибке, но никогда не обрушится — кроме того, контроль типов заметно сокращает время разработки[35]; семантика Форта обеспечивает практически гарантированное выявление ошибок на этапе разработки; Eiffel, Smalltalk и Erlang предоставляют простые способы обработки любых возможных ошибок самой программой без обрушения.)

Влияние и альтернативы

Неоднократно предпринимались попытки предложить альтернативы C++, как для прикладного, так и для низкоуровневого программирования (не заявляемые как «универсально применимые» языки).

Одной из первых альтернатив в прикладном программировании стал язык Java, разработанный Sun, который часто ошибочно считают прямым потомком C++. На деле в Java от С++ нет ничего, кроме синтаксиса — семантика Java унаследована от языка Модула-2, и основы семантики C++ (такие как система типов, основанная на адресной арифметике, ручное управление памятью, умышленный отказ от фундаментального принципа ООП «всё — объект», и др.) в Java не прослеживаются. Семантика отдельных операторов также отличается: например, безусловный переход в Java отсутствует, а ключевое слово goto использовано для финализации (разновидности условного перехода). Кроме того, элементы семантики Си, унаследованные из Lisp (такие как функции высших порядков и функции с неограниченным числом аргументов), в Java отсутствуют. Нет в Java и макроопределений времени компиляции. Всё это заметно меняет идеологию программирования на языке (хотя и сохраняет её в рамках общей идеологии потомков Алгола). Для улучшения конъюнктуры создатели Java выбрали синтаксис C++ и поощрили их сравнение в печати. Учитывая всё это, а также генеалогию языков (Modula-2 является потомком Симулы, как и С++, но им не является Си), Java правильнее называть «троюродным племянником» С++, нежели «наследником». По тому же пути пошла компания Microsoft, предложив язык C#.

После того, как было получено общественное признание Java и C#, были произведены попытки совмещения безопасности и скорости разработки, характерных для Java и C#, с эффективностью C++ — так появился язык D и диалект Managed C++, не получившие широкого признания. Одновременно с развитием Алголовского направления, сторонники функционального программирования и рефлексивного метапрограммирования предприняли попытку совместить модель типизации Хиндли-Милнера и макро-подмножество Common Lisp с языком C#, создав язык Nemerle. Его также зачастую стали рассматривать как «конкурент C++», что способствовало росту популярности функционального программирования и рефлексивного метапрограммирования[41] и побудило Microsoft дополнить базовый комплект своей среды разботки для C++ и C# (Visual Studio) компилятором языка F# — диалекта ML, адаптированного для совместимости с C#. Резонно полагать, что те же цели преследовали разработчики языков Scala и JavaScript — гибридных функционально-объектно-ориентированных языков, также унаследовавших синтаксис С++, но ориентированных на совместимость с Java.

Старейшим конкурентом С++ в задачах низкого уровня является Objective-C, совмещающий Си с объектной моделью Smalltalk. Из-за их соперничества долгое время полагалось, что эффективность и низкоуровневые возможности Си могут использоваться в сложно структурированных высокоуровневых задачах только посредством облачения их в ту или иную объектную модель. Однако, накопленные за многие годы достижения в сфере ФП позволили предложить альтернативный путь развития языка Си — совмещение его не с объектно-ориентированным, а с аппликативным программированием, то есть улучшение абстракции, строгости и модульности низкоуровневых программ посредством обеспечения не инкапсуляции изменяемого состояния, а наоборот, предсказуемости поведения и ссылочной прозрачности. Примерами работ в этом русле служат языки BitC, Cyclone и Limbo. Хотя есть и успешные попытки применения ФП в задачах реального времени без интеграции со средствами Си[42][43], всё же на данный момент (2013 г.) в низкоуровневой разработке применение в той или иной мере средств Си имеет лучшее соотношение трудоёмкости с результативностью. Много усилий было приложено разработчиками Python и Lua для обеспечения использования этих языков программистами на С++, так что из всех языков, достаточно тесно связанных с ФП, именно они чаще всего отмечаются в совместном использовании с С++ в одном проекте. Наиболее значимыми точками соприкосновения С++ с ФП можно считать привязки разработанных на С++ библиотек wxWidgets и Qt с характерной для С++ идеологией к языкам Lisp, Haskell и Python (в большинстве случаев привязки к функциональным языкам делают для библиотек, написанных на Си или на других функциональных языках).

Прямой потомок С++ на данный момент лишь один — язык D.

Сравнение Java и С++

Java и C++ часто сравниваются как языки, унаследовавшие синтаксис Си, несмотря на огромные различия на всех уровнях, от семантики до сферы применимости. Можно сказать, сравнение С++ с Java идёт вторым по частоте после сравнения С++ с Си.

Целевая ниша 
Java позиционируется для весьма конкретного сектора промышленности: безопасный язык с низким порогом вхождения для разработки прикладных пользовательских приложений широкого рынка с высокими показателями портируемости[44] — и с этой задачей справляется. С++ претендует на «универсальную применимость» во всех задачах для всех категорий программистов, но не удовлетворяет в полной мере требованиям ни одной из заявленных сфер применимости (см. раздел Критика).
Исполнение программы 
Java имеет формальную семантику, ориентированную на интерпретацию, но код Java компилируется в промежуточный код, который непосредственно перед запуском программы компилируется в машинный (иногда говорят об интерпретации байт-кода, но в данном случае это неверно — у современных наиболее распространённых сред исполнения Java оба этапа трансляции являются полностадийными, не ограничиваясь работой в рамках AST, с соответствующим сужением возможностей). C++ имеет естественную семантику, ориентированную на компиляцию, так что уже на аппаратной Java-машине был бы крайне неэффективен и ограничен по возможностям. Одно это определяет разницу в сферах применения языков: Java нецелесообразно использовать в низкоуровневом программировании; С++ — в разработке интернет-приложений. Механизм исполнения Java делает программы полностью портируемыми, по принципу «написано один раз — запускается везде (write once — run everywhere)», хотя это не было первостепенной целью разработчиков. Стандартное окружение и среда исполнения позволяют выполнять программы на Java на любой аппаратной платформе и в любой ОС без каких-либо изменений, при условии существования на данной ОС и платформе среды исполнения. Усилия по портированию программ минимальны, и могут быть сведены к нулю соблюдением определённых рекомендаций при разработке. Ценой портируемости в данном случае становятся определённые накладные расходы (например, размер среды исполнения Java превышает даже их размеры у всех функциональных языков).
Парадигма программирования 
Java в значительно более высокой степени, чем С++, отвечает фундаментальному принципу ООП «всё — объект» (но не в абсолютной — методы классов самостоятельными объектами не являются, в отличие от CLOS или Python). Для объявления глобальных функций или переменных в Java их необходимо оборачивать в фиктивные классы и назначать свойство статичности[45]. Для задания главной функции даже самой простой программы на Java необходимо поместить её в класс[46]. В Java 8 SE были добавлены некоторые возможности, позволяющие программировать в функциональном стиле[47][48].
Объектная модель 
Как и в С++, объектная модель Java наследуется из Симулы (в Java — через промежуточную ступень — язык Modula-2), то есть фундаментально отличается от оной в потомках языка Smalltalk (Objective-C, Python, Ruby). Но есть серьёзные отличия и от С++. В Java все методы являются виртуальными. Есть синтаксический сахар для определения абстрактных классов: использование ключевого слова interface делает все методы класса чистыми виртуальными — такие классы называются в Java «интерфейсами». Множественное наследование допустимо только для них, но не для обычных классов, что улучшает дисциплину программирования — на этапе реализации нет возможности нарушить структуру проекта, построенную на этапе архитектурного проектирования (в С++ это делается легко).
Операторы 
Безусловный переход в Java отсутствует (при этом есть механизм именованных блоков, выглядящий как метки в C++ и дающий возможность безусловного выхода из всех вложенных блоков за пределы именованного блока или перехода на следующую итерацию цикла именованного блока). Однако, большинство конструкций являются типичными для всех потомков Алгола: императивный порядок вычислений, присваивания, ветвления, циклы, инфиксные арифметические операции, аргументы в объявлениях и вызовах функций, и пр. В целом спецификация Java отвечает принципу наименьшего удивления и позволяет быстрый переход на Java с любого языка семейства Алгола. Однако, есть и исключения — например, Java, как и C++, позволяет пропускать break в ветви оператора switch[49] (В данном случае скорее работает принцип наименьшого удивления C++-программистов).
Синтаксис 
Основные конструкции Java и характерное оформление блоков кода наследованы из Си; большинство синтаксических отличий обусловлены разницей в семантике. Спецификаторы видимости компонентов класса в Java указываются на каждый компонент, а не группами, как в С++. В Java нет механизма ввода синтаксического сахара в программу — перегрузки операторов.
Адресная арифметика 
C++ сохраняет возможность работы с низкоуровневыми указателями — это является причиной труднообнаруживаемых ошибок, но необходимо для низкоуровневого программирования. В Java адресной арифметики нет.
Кодогенерация 
C++ не только сохраняет препроцессор Си, но и дополняет его Тьюринг-полным языком шаблонов, существенно расширяя возможности автоматического построения кода. В Java макроопределения времени компиляции отсутствуют.
Интроспекция 
В C++ RTTI ограничена возможностью сравнивать типы объектов между собой и с буквальными значениями типов. В системе Java доступна более подробная информация о типах.
Управление ресурсами 
C++ позволяет использовать принцип «захват ресурсов путём инициализации» (RAII), при котором ресурсы ассоциированы с объектом и автоматически освобождаются при разрушении объекта (например, std::vector и std::ifstream). Также возможен подход, когда программист, выделяя ресурсы (память под объекты, открытые файлы и т. п.), обязан явно позаботиться о своевременном их освобождении. Java работает в среде со сборкой мусора, которая автоматически отслеживает прекращение использования объектов и освобождает занимаемую ими память, если в этом есть необходимость, в некоторый неопределённый момент времени. Ручное управление предпочтительнее в системном программировании, где требуется полный контроль над ресурсами, RAII и Сборка мусора удобнее в прикладном программировании, поскольку в значительной степени освобождают программиста от необходимости отслеживать момент прекращения использования ресурсов. Сборщик мусора Java требует системных ресурсов, что снижает эффективность выполнения программ, лишает программы на Java детерминированности выполнения и способен следить только за памятью. Файлы, каналы, сокеты, объекты графического интерфейса программист на Java всегда освобождает явно.
Окружение 
В состав среды исполнения Java уже входят библиотеки для графики, графического интерфейса, доступа к базам данных и для прочих типовых задач, которые определяют стандарт де-факто их использования. Состав базовой библиотеки C++ предоставляет много меньше возможностей, с другой стороны предоставляя больше свободы в выборе сторонних библиотек.

См. также

Напишите отзыв о статье "C++"

Примечания

  1. Шилдт, 1998.
  2. 1 2 Страуструп, 1999, 2.1. Что такое C++?, с. 57.
  3. Стэнли Липпман, [msdn.microsoft.com/en-us/magazine/cc163681.aspx Pure C++: Hello, C++/CLI]  (англ.)
  4. 1 2 Страуструп, 1999, 1.4. Исторические замечания, с. 46.
  5. [www.open-std.org/jtc1/sc22/wg21/docs/standards C++ — Standards]
  6. Bjarne Stroustrup. [www.research.att.com/~bs/glossary.html C++ Glossary]. Проверено 8 июня 2007. [www.webcitation.org/67yajOIlr Архивировано из первоисточника 27 мая 2012].
  7. Where do I find the current C or C++ standard documents? stackoverflow.com/questions/81656/where-do-i-find-the-current-c-or-c-standard-documents
  8. See a list at en.cppreference.com/w/cpp/experimental Visited 5 January 2015.
  9. 1 2 3 Страуструп, Дизайн и эволюция C++, 2007.
  10. Страуструп, 1999, 1.6.
  11. ISO/IEC 14882:1998, раздел 6.4, пункт 4: «The value of a condition that is an initialized declaration in a statement other than a switch statement is the value of the declared variable implicitly converted to bool … The value of a condition that is an expression is the value of the expression, implicitly converted to bool for statements other than switch; if that conversion is ill-formed, the program is ill-formed».
  12. Привязка к поставщику
  13. [www.stlport.org/ STLport: Welcome!]
  14. [en.cppreference.com/w/cpp/container/vector std::vector - cppreference.com]
  15. [en.cppreference.com/w/cpp/memory/c/realloc std::realloc - cppreference.com]
  16. [www.codenet.ru/progr/cpp/straustrup.php Интервью Б. Страуструпа LinuxWorld.com]
  17. [samag.ru/archive/article/1034 Интервью Б. Страуструпа журналу «Системный администратор»]
  18. [www.cnews.ru/reviews/index.shtml?2010/09/29/410282 CNews: Эксклюзивное интервью с создателем языка программирования C++]
  19. 1 2 [c2.com/cgi/wiki?AlanKaysDefinitionOfObjectOriented Alan Kay's Definition Of Object Oriented Programming]. [www.webcitation.org/6IqLsHlq2 Архивировано из первоисточника 13 августа 2013].
  20. 1 2 3 Martin Ward [www.cse.dmu.ac.uk/~mward/martin/papers/middle-out-t.pdf Language Oriented Programming]. — Computer Science Department, Science Labs, 1994.
  21. 1 2 3 Paul Hudak Modular Domain Specific Languages and Tools. — Department of Computer Science, Yale University.
  22. 1 2 Андрей Карпов [www.rsdn.ru/?article/cpp/XXtraps64bit.xml 20 ловушек переноса Си++ - кода на 64-битную платформу]. — RSDN Magazine #1-2007, 25.04.2007.
  23. 1 2 3 [thread.gmane.org/gmane.comp.version-control.git/57643/focus=57918 Открытая переписка gmane.comp.version-control.git от 06.09.2007]. [www.webcitation.org/6IqLsy8l5 Архивировано из первоисточника 13 августа 2013].
  24. 1 2 3 4 Ian Joyner [www.quinn.echidna.id.au/quinn/C++-Critique-3ed.pdf A Critique of C++ and Programming and Language Trends of the 1990s - 3rd Edition]. — [www.emu.edu.tr/aelci/Courses/D-318/D-318-Files/cppcrit/index008.htm копирайт и список изданий].
  25. Петр Каньковски [www.rsdn.ru/?article/devtools/devtools.xml Альтернативные средства разработки для Windows]. — RSDN Magazine #5-2003.
  26. [msdn.microsoft.com/en-us/library/06tc147t(VS.71).aspx MSDN: The switch statement in C#]
  27. Walid Taha [www.cs.rice.edu/~taha/publications/conference/icces08.pdf Domain-Specific Languages]. — Department of Computer Science, Rice University.
  28. Lugovsky V.S. [arxiv.org/abs/cs/0409016v1 Using a hierarchy of Domain Specific Languages in complex software systems design]. — 2008.
  29. Страуструп, Программирование: принципы и практика использования C++, 2001
  30. Dave Gottner. [www.ddj.com/cpp/184403053 Templates Without Code Bloat]. — Dr. Dobb's Journal, январь 1995.
  31. Adrian Stone. [gameangst.com/?p=246 Minimizing Code Bloat: Redundant Template Instantiation]. Game Angst (22 сентября 2009). Проверено 19 января 2010. [www.webcitation.org/67yajqcTB Архивировано из первоисточника 27 мая 2012].
  32. Herb Sutter. [www.ddj.com/cpp/184401381 C++ Conformance Roundup]. — Dr. Dobb's Journal, январь 2001.
  33. [www.comeaucomputing.com/csc/faq.html#C8 Are there any compilers that implement all of this?]. comp.std.c++ frequently asked questions / The C++ language. Comeau Computing (англ.) (10 декабря 2008). Проверено 19 января 2010. [www.webcitation.org/67yakcCYE Архивировано из первоисточника 27 мая 2012].
  34. Scott Meyers. [groups.google.com/group/comp.lang.c++.moderated/browse_thread/thread/2b00649a935997f5/5feec243078c5fd8 Code Bloat due to Templates]. comp.lang.c++.moderated. Usenet (16 мая 2002). Проверено 19 января 2010.
  35. 1 2 3 Ray Tracer Language Comparison (бенчмарк языков программирования — ffconsultancy.com/languages/ray_tracer/)
  36. Boehm H. [www.hpl.hp.com/personal/Hans_Boehm/gc/issues.html Advantages and Disadvantages of Conservative Garbage Collection].
    (ссылка изРеймонд, Эрик. Искусство программирования для Unix.. — 2005. — С. 357. — 544 с. — ISBN 5-8459-0791-8.)
  37. Lutz Prechelt. [page.mi.fu-berlin.de/prechelt/Biblio/jccpprt_computer2000.pdf An empirical comparison of C, C++, Java, Perl, Python, Rexx, and Tcl] (англ.). Технологический институт Карлсруэ. Проверено 26 октября 2013.
  38. Don Clugston, CSG Solar Pty Ltd (Перевод: Денис Буличенко) [www.rsdn.ru/?article/cpp/FastDelegate/FastDelegate.xml Указатели на функции-члены и реализация самых быстрых делегатов на С++]. — RSDN Magazine #6-2004.
  39. Шилдт, Теория и практика С++, 1996, с. 64-67.
  40. Эрик Реймонд. Искусство программирования для Unix = en:The Art of Unix. — Издательский дом "Вильямс", 2005. — ISBN 5-8459-0791-8.
  41. Чистяков Влад aka VladD2 [rsdn.ru/?article/philosophy/SyntacticSugar.xml Синтаксический сахар или C++ vs. Nemerle :)] // RSDN Magazine #1-2006. — 24.05.2006.
  42. Zhanyong Wan, [www.cs.rice.edu/~taha/publications/ Walid Taha]. [www.webcitation.org/6IqLu1AP0 Архивировано из первоисточника 13 августа 2013]., and Paul Hudak [www.cs.rice.edu/~taha/publications/conference/padl02.pdf Event-Driven FRP] // Department of Computer Science, Yale University.
  43. [www.it-c.dk/research/mlkit/index.php/Main_Page MLKit]. [www.webcitation.org/6IX0oq9pV Архивировано из первоисточника 1 августа 2013].
  44. [www.oracle.com/technetwork/java/intro-141325.html 1.2 Design Goals of the Java™ Programming Language]. Oracle (1 января 1999). Проверено 14 января 2013.
  45. [java.sun.com/j2se/1.4.2/docs/api/java/util/Arrays.html Class Arrays, JavaTM 2 Platform Std. Ed. v1.4.2]
  46. [java.sun.com/docs/books/tutorial/getStarted/application/index.html The Java Tutorials. A Closer Look at the «Hello World!» Application]
  47. [docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html Lambda Expressions (The Java™ Tutorials > Learning the Java Language > Classes and Objects)]. docs.oracle.com. Проверено 22 сентября 2015.
  48. [docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html Stream (Java Platform SE 8 )]. docs.oracle.com. Проверено 22 сентября 2015.
  49. [java.sun.com/docs/books/tutorial/java/nutsandbolts/switch.html The Java Tutorials: The switch Statement]
Мнения
  1. [www.langpop.com/ Programming Language Popularity] (2009). Проверено 16 января 2009. [www.webcitation.org/67yahbjPg Архивировано из первоисточника 27 мая 2012].
  2. [www.tiobe.com/index.php/content/paperinfo/tpci/index.html TIOBE Programming Community Index] (2009). Проверено 6 мая 2009. [www.webcitation.org/67yaiO5Kb Архивировано из первоисточника 27 мая 2012].
  3. vanDooren. [msmvps.com/blogs/vandooren/archive/2008/09/24/c-keyword-of-the-day-export.aspx C++ keyword of the day: export]. Blogs@MSMVPs (24 сентября 2008). — «The export keyword is a bit like the Higgs boson of C++. Theoretically it exists, it is described by the standard, and noone has seen it in the wild. … There is 1 C++ compiler front-end in the world which actually supports it»  Проверено 19 января 2010. [www.webcitation.org/67yal4ugX Архивировано из первоисточника 27 мая 2012].
  4. 1 2 [thread.gmane.org/gmane.comp.version-control.git/57643/focus=57918 Открытая переписка gmane.comp.version-control.git от 06.09.2007]. [www.webcitation.org/6IqLsy8l5 Архивировано из первоисточника 13 августа 2013].
  5. Наглядной демонстрацией служат многочисленные споры между программистами разного уровня квалификации, которые можно слышать повсеместно, например: * Форум программистов «Linux.ORG», тема «Чем так плох С++?» (msgid=1989166)
    * Форум программистов «Просто Трёп», тема «С++?» (bid=16&tid=466654)
    * Форум программистов «HardForum» (ранее «ProgZ.Ru»), тема № 45505 «Самый крутой язык программирования»
    * Форум программистов «dxdy», тема «Язык программирования для математика» (topic33965)
    * Форум программистов «RSDN», тема «Так в чем же принципиальные отличия ФП от ИП?» (decl/2473899)
Пояснения
  1. Описание в обычном синтаксисе, такое как «decltype(x+y) f(T x, T y)» недопустимо, так как оно нарушало бы общее правило, согласно которому все используемые в программе объекты должны быть объявлены до своего первого использования.
  2. Многие задачи предъявляют к языку особые требования — например, когнитивное моделирование требует единообразного представления кода и данных и наличие рефлексивности непосредственно как части системы типов — хотя языки, отвечающие этим требованиям, в свою очередь, накладывают определённые требования на вычислительные ресурсы, и оказываются неприменимы в ряде архитектур. Существуют и архитектуры, для которых неприменимы языки Си и С++ (например, AVR 1200). В подобных ситуациях единственная возможность «использовать» некий «универсальный» язык (такой как С++) состоит в написании интерпретатора языка, отвечающего требованиям задачи, решении на нём собственно задачи, и преподнесении всего кода как «решения на этом универсальном языке». Однако, подобная структура сама по себе отвергает тезис об «универсальной применимости» рассматриваемого языка, так как де-факто задача была решена на другом языке
  3. Например, Boost.Lambda позиционируется как лямбда-функция, однако С++ не воплощает лямбда-исчисление Чёрча целиком; имитация комбинаторов посредством языка шаблонов слишком затруднено, чтобы ожидать их использование на практике; продолжения, унаследованные от Си, считаются неидеоматичными и опасными, а их реализация посредством языка шаблонов невозможна; кроме того, применение лямбда-лифтинга для оптимизации С++ невозможно,— так что фактчески Boost.Lambda — это просто анонимная функция, а не объект лямбда-исчисления.
  4. Очевидно, что если сложность системы или элемента системы превышает порог возможностей человека по осознанию, то система или элемент системы не будут до конца осознаны. При этом трансляция высокоуровневых конструкций (даже всего лишь арифметических выражений) сама по себе является очень сложной задачей: она требует применения динамического программирования и/или большого числа эвристик; даже для эффективного выделения регистров под временные переменные в данном контексте требуется решить задачу раскраски ненаправленного ациклического графа в минимальное число цветов. Таким образом, необходимость решать задачу эффективной трансляции одновременно с полноценной и адекватной реализацией требуемого функционала повышает общую сложность разработки, по меньшей мере, по экспоненциальному закону относительно сложности реализации того же функционала на предметно-специфичном ЯСВУ, и делает само программирование NP-полным. Учитывая ограниченность способностей человека по восприятию и переработке информации — фактически невозможным, начиная с некоторого (вполне обозримого) порога сложности. Однако, методы трансляции хорошо формализуемы и могут быть воплощены в виде компилятора языка достаточно высокого уровня, обеспечивающего максимальную понимаемость кода, а использование такого языка человеком решает проблему сложности (см. M.Ward, Language Oriented Programming). Таким образом, для любого достаточно сложного алгоритма достаточно развитый компилятор произведёт заведомо более эффективный код, чем человек на языке низкого уровня; и для любых достаточно сложных условий всегда разумнее потратить часть средств на разработку компилятора высокоуровневого предметно-специфичного языка, чем писать на низкоуровневом языке общего назначения. Всё это хорошо известно в информатике (и именно этим обусловлено появление Фортана, а следом и языков более высокого уровня), но подвергается сомнению сторонниками императивной парадигмы программирования из-за чрезвычайно высокой сложности реализации оптимизирующих трансляторов императивными средствами и заведомой ограниченности возможностей оптимизации императивных языков. В функциональном программировании парсеры реализуются тривиально, а возможностей оптимизации существенно больше, поэтому языково-ориентированное проектирование сложных систем весьма распространено, и вынесение функциональности в код на Си для явного контроля за эффективностью осуществляется лишь при крайней необходимости.
  5. Как выразился Ж. Ж. Руссо, « Тысячи путей ведут к заблуждению; к истине — только один» — то есть вероятность совершения человеком неправильного выбора оказывается на порядки выше, чем правильного, если де-факто такая возможность ему предоставлена.

Литература

Ссылки

  • [www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/ рабочие материалы комитета по стандартизации за 2009-й год]

Отрывок, характеризующий C++

[Имевший тройной талант,
пить, драться
и быть любезником…]
– A ведь тоже складно. Ну, ну, Залетаев!..
– Кю… – с усилием выговорил Залетаев. – Кью ю ю… – вытянул он, старательно оттопырив губы, – летриптала, де бу де ба и детравагала, – пропел он.
– Ай, важно! Вот так хранцуз! ой… го го го го! – Что ж, еще есть хочешь?
– Дай ему каши то; ведь не скоро наестся с голоду то.
Опять ему дали каши; и Морель, посмеиваясь, принялся за третий котелок. Радостные улыбки стояли на всех лицах молодых солдат, смотревших на Мореля. Старые солдаты, считавшие неприличным заниматься такими пустяками, лежали с другой стороны костра, но изредка, приподнимаясь на локте, с улыбкой взглядывали на Мореля.
– Тоже люди, – сказал один из них, уворачиваясь в шинель. – И полынь на своем кореню растет.
– Оо! Господи, господи! Как звездно, страсть! К морозу… – И все затихло.
Звезды, как будто зная, что теперь никто не увидит их, разыгрались в черном небе. То вспыхивая, то потухая, то вздрагивая, они хлопотливо о чем то радостном, но таинственном перешептывались между собой.

Х
Войска французские равномерно таяли в математически правильной прогрессии. И тот переход через Березину, про который так много было писано, была только одна из промежуточных ступеней уничтожения французской армии, а вовсе не решительный эпизод кампании. Ежели про Березину так много писали и пишут, то со стороны французов это произошло только потому, что на Березинском прорванном мосту бедствия, претерпеваемые французской армией прежде равномерно, здесь вдруг сгруппировались в один момент и в одно трагическое зрелище, которое у всех осталось в памяти. Со стороны же русских так много говорили и писали про Березину только потому, что вдали от театра войны, в Петербурге, был составлен план (Пфулем же) поимки в стратегическую западню Наполеона на реке Березине. Все уверились, что все будет на деле точно так, как в плане, и потому настаивали на том, что именно Березинская переправа погубила французов. В сущности же, результаты Березинской переправы были гораздо менее гибельны для французов потерей орудий и пленных, чем Красное, как то показывают цифры.
Единственное значение Березинской переправы заключается в том, что эта переправа очевидно и несомненно доказала ложность всех планов отрезыванья и справедливость единственно возможного, требуемого и Кутузовым и всеми войсками (массой) образа действий, – только следования за неприятелем. Толпа французов бежала с постоянно усиливающейся силой быстроты, со всею энергией, направленной на достижение цели. Она бежала, как раненый зверь, и нельзя ей было стать на дороге. Это доказало не столько устройство переправы, сколько движение на мостах. Когда мосты были прорваны, безоружные солдаты, московские жители, женщины с детьми, бывшие в обозе французов, – все под влиянием силы инерции не сдавалось, а бежало вперед в лодки, в мерзлую воду.
Стремление это было разумно. Положение и бегущих и преследующих было одинаково дурно. Оставаясь со своими, каждый в бедствии надеялся на помощь товарища, на определенное, занимаемое им место между своими. Отдавшись же русским, он был в том же положении бедствия, но становился на низшую ступень в разделе удовлетворения потребностей жизни. Французам не нужно было иметь верных сведений о том, что половина пленных, с которыми не знали, что делать, несмотря на все желание русских спасти их, – гибли от холода и голода; они чувствовали, что это не могло быть иначе. Самые жалостливые русские начальники и охотники до французов, французы в русской службе не могли ничего сделать для пленных. Французов губило бедствие, в котором находилось русское войско. Нельзя было отнять хлеб и платье у голодных, нужных солдат, чтобы отдать не вредным, не ненавидимым, не виноватым, но просто ненужным французам. Некоторые и делали это; но это было только исключение.
Назади была верная погибель; впереди была надежда. Корабли были сожжены; не было другого спасения, кроме совокупного бегства, и на это совокупное бегство были устремлены все силы французов.
Чем дальше бежали французы, чем жальче были их остатки, в особенности после Березины, на которую, вследствие петербургского плана, возлагались особенные надежды, тем сильнее разгорались страсти русских начальников, обвинявших друг друга и в особенности Кутузова. Полагая, что неудача Березинского петербургского плана будет отнесена к нему, недовольство им, презрение к нему и подтрунивание над ним выражались сильнее и сильнее. Подтрунивание и презрение, само собой разумеется, выражалось в почтительной форме, в той форме, в которой Кутузов не мог и спросить, в чем и за что его обвиняют. С ним не говорили серьезно; докладывая ему и спрашивая его разрешения, делали вид исполнения печального обряда, а за спиной его подмигивали и на каждом шагу старались его обманывать.
Всеми этими людьми, именно потому, что они не могли понимать его, было признано, что со стариком говорить нечего; что он никогда не поймет всего глубокомыслия их планов; что он будет отвечать свои фразы (им казалось, что это только фразы) о золотом мосте, о том, что за границу нельзя прийти с толпой бродяг, и т. п. Это всё они уже слышали от него. И все, что он говорил: например, то, что надо подождать провиант, что люди без сапог, все это было так просто, а все, что они предлагали, было так сложно и умно, что очевидно было для них, что он был глуп и стар, а они были не властные, гениальные полководцы.
В особенности после соединения армий блестящего адмирала и героя Петербурга Витгенштейна это настроение и штабная сплетня дошли до высших пределов. Кутузов видел это и, вздыхая, пожимал только плечами. Только один раз, после Березины, он рассердился и написал Бенигсену, доносившему отдельно государю, следующее письмо:
«По причине болезненных ваших припадков, извольте, ваше высокопревосходительство, с получения сего, отправиться в Калугу, где и ожидайте дальнейшего повеления и назначения от его императорского величества».
Но вслед за отсылкой Бенигсена к армии приехал великий князь Константин Павлович, делавший начало кампании и удаленный из армии Кутузовым. Теперь великий князь, приехав к армии, сообщил Кутузову о неудовольствии государя императора за слабые успехи наших войск и за медленность движения. Государь император сам на днях намеревался прибыть к армии.
Старый человек, столь же опытный в придворном деле, как и в военном, тот Кутузов, который в августе того же года был выбран главнокомандующим против воли государя, тот, который удалил наследника и великого князя из армии, тот, который своей властью, в противность воле государя, предписал оставление Москвы, этот Кутузов теперь тотчас же понял, что время его кончено, что роль его сыграна и что этой мнимой власти у него уже нет больше. И не по одним придворным отношениям он понял это. С одной стороны, он видел, что военное дело, то, в котором он играл свою роль, – кончено, и чувствовал, что его призвание исполнено. С другой стороны, он в то же самое время стал чувствовать физическую усталость в своем старом теле и необходимость физического отдыха.
29 ноября Кутузов въехал в Вильно – в свою добрую Вильну, как он говорил. Два раза в свою службу Кутузов был в Вильне губернатором. В богатой уцелевшей Вильне, кроме удобств жизни, которых так давно уже он был лишен, Кутузов нашел старых друзей и воспоминания. И он, вдруг отвернувшись от всех военных и государственных забот, погрузился в ровную, привычную жизнь настолько, насколько ему давали покоя страсти, кипевшие вокруг него, как будто все, что совершалось теперь и имело совершиться в историческом мире, нисколько его не касалось.
Чичагов, один из самых страстных отрезывателей и опрокидывателей, Чичагов, который хотел сначала сделать диверсию в Грецию, а потом в Варшаву, но никак не хотел идти туда, куда ему было велено, Чичагов, известный своею смелостью речи с государем, Чичагов, считавший Кутузова собою облагодетельствованным, потому что, когда он был послан в 11 м году для заключения мира с Турцией помимо Кутузова, он, убедившись, что мир уже заключен, признал перед государем, что заслуга заключения мира принадлежит Кутузову; этот то Чичагов первый встретил Кутузова в Вильне у замка, в котором должен был остановиться Кутузов. Чичагов в флотском вицмундире, с кортиком, держа фуражку под мышкой, подал Кутузову строевой рапорт и ключи от города. То презрительно почтительное отношение молодежи к выжившему из ума старику выражалось в высшей степени во всем обращении Чичагова, знавшего уже обвинения, взводимые на Кутузова.
Разговаривая с Чичаговым, Кутузов, между прочим, сказал ему, что отбитые у него в Борисове экипажи с посудою целы и будут возвращены ему.
– C'est pour me dire que je n'ai pas sur quoi manger… Je puis au contraire vous fournir de tout dans le cas meme ou vous voudriez donner des diners, [Вы хотите мне сказать, что мне не на чем есть. Напротив, могу вам служить всем, даже если бы вы захотели давать обеды.] – вспыхнув, проговорил Чичагов, каждым словом своим желавший доказать свою правоту и потому предполагавший, что и Кутузов был озабочен этим самым. Кутузов улыбнулся своей тонкой, проницательной улыбкой и, пожав плечами, отвечал: – Ce n'est que pour vous dire ce que je vous dis. [Я хочу сказать только то, что говорю.]
В Вильне Кутузов, в противность воле государя, остановил большую часть войск. Кутузов, как говорили его приближенные, необыкновенно опустился и физически ослабел в это свое пребывание в Вильне. Он неохотно занимался делами по армии, предоставляя все своим генералам и, ожидая государя, предавался рассеянной жизни.
Выехав с своей свитой – графом Толстым, князем Волконским, Аракчеевым и другими, 7 го декабря из Петербурга, государь 11 го декабря приехал в Вильну и в дорожных санях прямо подъехал к замку. У замка, несмотря на сильный мороз, стояло человек сто генералов и штабных офицеров в полной парадной форме и почетный караул Семеновского полка.
Курьер, подскакавший к замку на потной тройке, впереди государя, прокричал: «Едет!» Коновницын бросился в сени доложить Кутузову, дожидавшемуся в маленькой швейцарской комнатке.
Через минуту толстая большая фигура старика, в полной парадной форме, со всеми регалиями, покрывавшими грудь, и подтянутым шарфом брюхом, перекачиваясь, вышла на крыльцо. Кутузов надел шляпу по фронту, взял в руки перчатки и бочком, с трудом переступая вниз ступеней, сошел с них и взял в руку приготовленный для подачи государю рапорт.
Беготня, шепот, еще отчаянно пролетевшая тройка, и все глаза устремились на подскакивающие сани, в которых уже видны были фигуры государя и Волконского.
Все это по пятидесятилетней привычке физически тревожно подействовало на старого генерала; он озабоченно торопливо ощупал себя, поправил шляпу и враз, в ту минуту как государь, выйдя из саней, поднял к нему глаза, подбодрившись и вытянувшись, подал рапорт и стал говорить своим мерным, заискивающим голосом.
Государь быстрым взглядом окинул Кутузова с головы до ног, на мгновенье нахмурился, но тотчас же, преодолев себя, подошел и, расставив руки, обнял старого генерала. Опять по старому, привычному впечатлению и по отношению к задушевной мысли его, объятие это, как и обыкновенно, подействовало на Кутузова: он всхлипнул.
Государь поздоровался с офицерами, с Семеновским караулом и, пожав еще раз за руку старика, пошел с ним в замок.
Оставшись наедине с фельдмаршалом, государь высказал ему свое неудовольствие за медленность преследования, за ошибки в Красном и на Березине и сообщил свои соображения о будущем походе за границу. Кутузов не делал ни возражений, ни замечаний. То самое покорное и бессмысленное выражение, с которым он, семь лет тому назад, выслушивал приказания государя на Аустерлицком поле, установилось теперь на его лице.
Когда Кутузов вышел из кабинета и своей тяжелой, ныряющей походкой, опустив голову, пошел по зале, чей то голос остановил его.
– Ваша светлость, – сказал кто то.
Кутузов поднял голову и долго смотрел в глаза графу Толстому, который, с какой то маленькою вещицей на серебряном блюде, стоял перед ним. Кутузов, казалось, не понимал, чего от него хотели.
Вдруг он как будто вспомнил: чуть заметная улыбка мелькнула на его пухлом лице, и он, низко, почтительно наклонившись, взял предмет, лежавший на блюде. Это был Георгий 1 й степени.


На другой день были у фельдмаршала обед и бал, которые государь удостоил своим присутствием. Кутузову пожалован Георгий 1 й степени; государь оказывал ему высочайшие почести; но неудовольствие государя против фельдмаршала было известно каждому. Соблюдалось приличие, и государь показывал первый пример этого; но все знали, что старик виноват и никуда не годится. Когда на бале Кутузов, по старой екатерининской привычке, при входе государя в бальную залу велел к ногам его повергнуть взятые знамена, государь неприятно поморщился и проговорил слова, в которых некоторые слышали: «старый комедиант».
Неудовольствие государя против Кутузова усилилось в Вильне в особенности потому, что Кутузов, очевидно, не хотел или не мог понимать значение предстоящей кампании.
Когда на другой день утром государь сказал собравшимся у него офицерам: «Вы спасли не одну Россию; вы спасли Европу», – все уже тогда поняли, что война не кончена.
Один Кутузов не хотел понимать этого и открыто говорил свое мнение о том, что новая война не может улучшить положение и увеличить славу России, а только может ухудшить ее положение и уменьшить ту высшую степень славы, на которой, по его мнению, теперь стояла Россия. Он старался доказать государю невозможность набрания новых войск; говорил о тяжелом положении населений, о возможности неудач и т. п.
При таком настроении фельдмаршал, естественно, представлялся только помехой и тормозом предстоящей войны.
Для избежания столкновений со стариком сам собою нашелся выход, состоящий в том, чтобы, как в Аустерлице и как в начале кампании при Барклае, вынуть из под главнокомандующего, не тревожа его, не объявляя ему о том, ту почву власти, на которой он стоял, и перенести ее к самому государю.
С этою целью понемногу переформировался штаб, и вся существенная сила штаба Кутузова была уничтожена и перенесена к государю. Толь, Коновницын, Ермолов – получили другие назначения. Все громко говорили, что фельдмаршал стал очень слаб и расстроен здоровьем.
Ему надо было быть слабым здоровьем, для того чтобы передать свое место тому, кто заступал его. И действительно, здоровье его было слабо.
Как естественно, и просто, и постепенно явился Кутузов из Турции в казенную палату Петербурга собирать ополчение и потом в армию, именно тогда, когда он был необходим, точно так же естественно, постепенно и просто теперь, когда роль Кутузова была сыграна, на место его явился новый, требовавшийся деятель.
Война 1812 го года, кроме своего дорогого русскому сердцу народного значения, должна была иметь другое – европейское.
За движением народов с запада на восток должно было последовать движение народов с востока на запад, и для этой новой войны нужен был новый деятель, имеющий другие, чем Кутузов, свойства, взгляды, движимый другими побуждениями.
Александр Первый для движения народов с востока на запад и для восстановления границ народов был так же необходим, как необходим был Кутузов для спасения и славы России.
Кутузов не понимал того, что значило Европа, равновесие, Наполеон. Он не мог понимать этого. Представителю русского народа, после того как враг был уничтожен, Россия освобождена и поставлена на высшую степень своей славы, русскому человеку, как русскому, делать больше было нечего. Представителю народной войны ничего не оставалось, кроме смерти. И он умер.


Пьер, как это большею частью бывает, почувствовал всю тяжесть физических лишений и напряжений, испытанных в плену, только тогда, когда эти напряжения и лишения кончились. После своего освобождения из плена он приехал в Орел и на третий день своего приезда, в то время как он собрался в Киев, заболел и пролежал больным в Орле три месяца; с ним сделалась, как говорили доктора, желчная горячка. Несмотря на то, что доктора лечили его, пускали кровь и давали пить лекарства, он все таки выздоровел.
Все, что было с Пьером со времени освобождения и до болезни, не оставило в нем почти никакого впечатления. Он помнил только серую, мрачную, то дождливую, то снежную погоду, внутреннюю физическую тоску, боль в ногах, в боку; помнил общее впечатление несчастий, страданий людей; помнил тревожившее его любопытство офицеров, генералов, расспрашивавших его, свои хлопоты о том, чтобы найти экипаж и лошадей, и, главное, помнил свою неспособность мысли и чувства в то время. В день своего освобождения он видел труп Пети Ростова. В тот же день он узнал, что князь Андрей был жив более месяца после Бородинского сражения и только недавно умер в Ярославле, в доме Ростовых. И в тот же день Денисов, сообщивший эту новость Пьеру, между разговором упомянул о смерти Элен, предполагая, что Пьеру это уже давно известно. Все это Пьеру казалось тогда только странно. Он чувствовал, что не может понять значения всех этих известий. Он тогда торопился только поскорее, поскорее уехать из этих мест, где люди убивали друг друга, в какое нибудь тихое убежище и там опомниться, отдохнуть и обдумать все то странное и новое, что он узнал за это время. Но как только он приехал в Орел, он заболел. Проснувшись от своей болезни, Пьер увидал вокруг себя своих двух людей, приехавших из Москвы, – Терентия и Ваську, и старшую княжну, которая, живя в Ельце, в имении Пьера, и узнав о его освобождении и болезни, приехала к нему, чтобы ходить за ним.
Во время своего выздоровления Пьер только понемногу отвыкал от сделавшихся привычными ему впечатлений последних месяцев и привыкал к тому, что его никто никуда не погонит завтра, что теплую постель его никто не отнимет и что у него наверное будет обед, и чай, и ужин. Но во сне он еще долго видел себя все в тех же условиях плена. Так же понемногу Пьер понимал те новости, которые он узнал после своего выхода из плена: смерть князя Андрея, смерть жены, уничтожение французов.
Радостное чувство свободы – той полной, неотъемлемой, присущей человеку свободы, сознание которой он в первый раз испытал на первом привале, при выходе из Москвы, наполняло душу Пьера во время его выздоровления. Он удивлялся тому, что эта внутренняя свобода, независимая от внешних обстоятельств, теперь как будто с излишком, с роскошью обставлялась и внешней свободой. Он был один в чужом городе, без знакомых. Никто от него ничего не требовал; никуда его не посылали. Все, что ему хотелось, было у него; вечно мучившей его прежде мысли о жене больше не было, так как и ее уже не было.
– Ах, как хорошо! Как славно! – говорил он себе, когда ему подвигали чисто накрытый стол с душистым бульоном, или когда он на ночь ложился на мягкую чистую постель, или когда ему вспоминалось, что жены и французов нет больше. – Ах, как хорошо, как славно! – И по старой привычке он делал себе вопрос: ну, а потом что? что я буду делать? И тотчас же он отвечал себе: ничего. Буду жить. Ах, как славно!
То самое, чем он прежде мучился, чего он искал постоянно, цели жизни, теперь для него не существовало. Эта искомая цель жизни теперь не случайно не существовала для него только в настоящую минуту, но он чувствовал, что ее нет и не может быть. И это то отсутствие цели давало ему то полное, радостное сознание свободы, которое в это время составляло его счастие.
Он не мог иметь цели, потому что он теперь имел веру, – не веру в какие нибудь правила, или слова, или мысли, но веру в живого, всегда ощущаемого бога. Прежде он искал его в целях, которые он ставил себе. Это искание цели было только искание бога; и вдруг он узнал в своем плену не словами, не рассуждениями, но непосредственным чувством то, что ему давно уж говорила нянюшка: что бог вот он, тут, везде. Он в плену узнал, что бог в Каратаеве более велик, бесконечен и непостижим, чем в признаваемом масонами Архитектоне вселенной. Он испытывал чувство человека, нашедшего искомое у себя под ногами, тогда как он напрягал зрение, глядя далеко от себя. Он всю жизнь свою смотрел туда куда то, поверх голов окружающих людей, а надо было не напрягать глаз, а только смотреть перед собой.
Он не умел видеть прежде великого, непостижимого и бесконечного ни в чем. Он только чувствовал, что оно должно быть где то, и искал его. Во всем близком, понятном он видел одно ограниченное, мелкое, житейское, бессмысленное. Он вооружался умственной зрительной трубой и смотрел в даль, туда, где это мелкое, житейское, скрываясь в тумане дали, казалось ему великим и бесконечным оттого только, что оно было неясно видимо. Таким ему представлялась европейская жизнь, политика, масонство, философия, филантропия. Но и тогда, в те минуты, которые он считал своей слабостью, ум его проникал и в эту даль, и там он видел то же мелкое, житейское, бессмысленное. Теперь же он выучился видеть великое, вечное и бесконечное во всем, и потому естественно, чтобы видеть его, чтобы наслаждаться его созерцанием, он бросил трубу, в которую смотрел до сих пор через головы людей, и радостно созерцал вокруг себя вечно изменяющуюся, вечно великую, непостижимую и бесконечную жизнь. И чем ближе он смотрел, тем больше он был спокоен и счастлив. Прежде разрушавший все его умственные постройки страшный вопрос: зачем? теперь для него не существовал. Теперь на этот вопрос – зачем? в душе его всегда готов был простой ответ: затем, что есть бог, тот бог, без воли которого не спадет волос с головы человека.


Пьер почти не изменился в своих внешних приемах. На вид он был точно таким же, каким он был прежде. Так же, как и прежде, он был рассеян и казался занятым не тем, что было перед глазами, а чем то своим, особенным. Разница между прежним и теперешним его состоянием состояла в том, что прежде, когда он забывал то, что было перед ним, то, что ему говорили, он, страдальчески сморщивши лоб, как будто пытался и не мог разглядеть чего то, далеко отстоящего от него. Теперь он так же забывал то, что ему говорили, и то, что было перед ним; но теперь с чуть заметной, как будто насмешливой, улыбкой он всматривался в то самое, что было перед ним, вслушивался в то, что ему говорили, хотя очевидно видел и слышал что то совсем другое. Прежде он казался хотя и добрым человеком, но несчастным; и потому невольно люди отдалялись от него. Теперь улыбка радости жизни постоянно играла около его рта, и в глазах его светилось участие к людям – вопрос: довольны ли они так же, как и он? И людям приятно было в его присутствии.
Прежде он много говорил, горячился, когда говорил, и мало слушал; теперь он редко увлекался разговором и умел слушать так, что люди охотно высказывали ему свои самые задушевные тайны.
Княжна, никогда не любившая Пьера и питавшая к нему особенно враждебное чувство с тех пор, как после смерти старого графа она чувствовала себя обязанной Пьеру, к досаде и удивлению своему, после короткого пребывания в Орле, куда она приехала с намерением доказать Пьеру, что, несмотря на его неблагодарность, она считает своим долгом ходить за ним, княжна скоро почувствовала, что она его любит. Пьер ничем не заискивал расположения княжны. Он только с любопытством рассматривал ее. Прежде княжна чувствовала, что в его взгляде на нее были равнодушие и насмешка, и она, как и перед другими людьми, сжималась перед ним и выставляла только свою боевую сторону жизни; теперь, напротив, она чувствовала, что он как будто докапывался до самых задушевных сторон ее жизни; и она сначала с недоверием, а потом с благодарностью выказывала ему затаенные добрые стороны своего характера.
Самый хитрый человек не мог бы искуснее вкрасться в доверие княжны, вызывая ее воспоминания лучшего времени молодости и выказывая к ним сочувствие. А между тем вся хитрость Пьера состояла только в том, что он искал своего удовольствия, вызывая в озлобленной, cyхой и по своему гордой княжне человеческие чувства.
– Да, он очень, очень добрый человек, когда находится под влиянием не дурных людей, а таких людей, как я, – говорила себе княжна.
Перемена, происшедшая в Пьере, была замечена по своему и его слугами – Терентием и Васькой. Они находили, что он много попростел. Терентий часто, раздев барина, с сапогами и платьем в руке, пожелав покойной ночи, медлил уходить, ожидая, не вступит ли барин в разговор. И большею частью Пьер останавливал Терентия, замечая, что ему хочется поговорить.
– Ну, так скажи мне… да как же вы доставали себе еду? – спрашивал он. И Терентий начинал рассказ о московском разорении, о покойном графе и долго стоял с платьем, рассказывая, а иногда слушая рассказы Пьера, и, с приятным сознанием близости к себе барина и дружелюбия к нему, уходил в переднюю.
Доктор, лечивший Пьера и навещавший его каждый день, несмотря на то, что, по обязанности докторов, считал своим долгом иметь вид человека, каждая минута которого драгоценна для страждущего человечества, засиживался часами у Пьера, рассказывая свои любимые истории и наблюдения над нравами больных вообще и в особенности дам.
– Да, вот с таким человеком поговорить приятно, не то, что у нас, в провинции, – говорил он.
В Орле жило несколько пленных французских офицеров, и доктор привел одного из них, молодого итальянского офицера.
Офицер этот стал ходить к Пьеру, и княжна смеялась над теми нежными чувствами, которые выражал итальянец к Пьеру.
Итальянец, видимо, был счастлив только тогда, когда он мог приходить к Пьеру и разговаривать и рассказывать ему про свое прошедшее, про свою домашнюю жизнь, про свою любовь и изливать ему свое негодование на французов, и в особенности на Наполеона.
– Ежели все русские хотя немного похожи на вас, – говорил он Пьеру, – c'est un sacrilege que de faire la guerre a un peuple comme le votre. [Это кощунство – воевать с таким народом, как вы.] Вы, пострадавшие столько от французов, вы даже злобы не имеете против них.
И страстную любовь итальянца Пьер теперь заслужил только тем, что он вызывал в нем лучшие стороны его души и любовался ими.
Последнее время пребывания Пьера в Орле к нему приехал его старый знакомый масон – граф Вилларский, – тот самый, который вводил его в ложу в 1807 году. Вилларский был женат на богатой русской, имевшей большие имения в Орловской губернии, и занимал в городе временное место по продовольственной части.
Узнав, что Безухов в Орле, Вилларский, хотя и никогда не был коротко знаком с ним, приехал к нему с теми заявлениями дружбы и близости, которые выражают обыкновенно друг другу люди, встречаясь в пустыне. Вилларский скучал в Орле и был счастлив, встретив человека одного с собой круга и с одинаковыми, как он полагал, интересами.
Но, к удивлению своему, Вилларский заметил скоро, что Пьер очень отстал от настоящей жизни и впал, как он сам с собою определял Пьера, в апатию и эгоизм.
– Vous vous encroutez, mon cher, [Вы запускаетесь, мой милый.] – говорил он ему. Несмотря на то, Вилларскому было теперь приятнее с Пьером, чем прежде, и он каждый день бывал у него. Пьеру же, глядя на Вилларского и слушая его теперь, странно и невероятно было думать, что он сам очень недавно был такой же.
Вилларский был женат, семейный человек, занятый и делами имения жены, и службой, и семьей. Он считал, что все эти занятия суть помеха в жизни и что все они презренны, потому что имеют целью личное благо его и семьи. Военные, административные, политические, масонские соображения постоянно поглощали его внимание. И Пьер, не стараясь изменить его взгляд, не осуждая его, с своей теперь постоянно тихой, радостной насмешкой, любовался на это странное, столь знакомое ему явление.
В отношениях своих с Вилларским, с княжною, с доктором, со всеми людьми, с которыми он встречался теперь, в Пьере была новая черта, заслуживавшая ему расположение всех людей: это признание возможности каждого человека думать, чувствовать и смотреть на вещи по своему; признание невозможности словами разубедить человека. Эта законная особенность каждого человека, которая прежде волновала и раздражала Пьера, теперь составляла основу участия и интереса, которые он принимал в людях. Различие, иногда совершенное противоречие взглядов людей с своею жизнью и между собою, радовало Пьера и вызывало в нем насмешливую и кроткую улыбку.
В практических делах Пьер неожиданно теперь почувствовал, что у него был центр тяжести, которого не было прежде. Прежде каждый денежный вопрос, в особенности просьбы о деньгах, которым он, как очень богатый человек, подвергался очень часто, приводили его в безвыходные волнения и недоуменья. «Дать или не дать?» – спрашивал он себя. «У меня есть, а ему нужно. Но другому еще нужнее. Кому нужнее? А может быть, оба обманщики?» И из всех этих предположений он прежде не находил никакого выхода и давал всем, пока было что давать. Точно в таком же недоуменье он находился прежде при каждом вопросе, касающемся его состояния, когда один говорил, что надо поступить так, а другой – иначе.
Теперь, к удивлению своему, он нашел, что во всех этих вопросах не было более сомнений и недоумений. В нем теперь явился судья, по каким то неизвестным ему самому законам решавший, что было нужно и чего не нужно делать.
Он был так же, как прежде, равнодушен к денежным делам; но теперь он несомненно знал, что должно сделать и чего не должно. Первым приложением этого нового судьи была для него просьба пленного французского полковника, пришедшего к нему, много рассказывавшего о своих подвигах и под конец заявившего почти требование о том, чтобы Пьер дал ему четыре тысячи франков для отсылки жене и детям. Пьер без малейшего труда и напряжения отказал ему, удивляясь впоследствии, как было просто и легко то, что прежде казалось неразрешимо трудным. Вместе с тем тут же, отказывая полковнику, он решил, что необходимо употребить хитрость для того, чтобы, уезжая из Орла, заставить итальянского офицера взять денег, в которых он, видимо, нуждался. Новым доказательством для Пьера его утвердившегося взгляда на практические дела было его решение вопроса о долгах жены и о возобновлении или невозобновлении московских домов и дач.
В Орел приезжал к нему его главный управляющий, и с ним Пьер сделал общий счет своих изменявшихся доходов. Пожар Москвы стоил Пьеру, по учету главно управляющего, около двух миллионов.
Главноуправляющий, в утешение этих потерь, представил Пьеру расчет о том, что, несмотря на эти потери, доходы его не только не уменьшатся, но увеличатся, если он откажется от уплаты долгов, оставшихся после графини, к чему он не может быть обязан, и если он не будет возобновлять московских домов и подмосковной, которые стоили ежегодно восемьдесят тысяч и ничего не приносили.
– Да, да, это правда, – сказал Пьер, весело улыбаясь. – Да, да, мне ничего этого не нужно. Я от разоренья стал гораздо богаче.
Но в январе приехал Савельич из Москвы, рассказал про положение Москвы, про смету, которую ему сделал архитектор для возобновления дома и подмосковной, говоря про это, как про дело решенное. В это же время Пьер получил письмо от князя Василия и других знакомых из Петербурга. В письмах говорилось о долгах жены. И Пьер решил, что столь понравившийся ему план управляющего был неверен и что ему надо ехать в Петербург покончить дела жены и строиться в Москве. Зачем было это надо, он не знал; но он знал несомненно, что это надо. Доходы его вследствие этого решения уменьшались на три четверти. Но это было надо; он это чувствовал.
Вилларский ехал в Москву, и они условились ехать вместе.
Пьер испытывал во все время своего выздоровления в Орле чувство радости, свободы, жизни; но когда он, во время своего путешествия, очутился на вольном свете, увидал сотни новых лиц, чувство это еще более усилилось. Он все время путешествия испытывал радость школьника на вакации. Все лица: ямщик, смотритель, мужики на дороге или в деревне – все имели для него новый смысл. Присутствие и замечания Вилларского, постоянно жаловавшегося на бедность, отсталость от Европы, невежество России, только возвышали радость Пьера. Там, где Вилларский видел мертвенность, Пьер видел необычайную могучую силу жизненности, ту силу, которая в снегу, на этом пространстве, поддерживала жизнь этого целого, особенного и единого народа. Он не противоречил Вилларскому и, как будто соглашаясь с ним (так как притворное согласие было кратчайшее средство обойти рассуждения, из которых ничего не могло выйти), радостно улыбался, слушая его.


Так же, как трудно объяснить, для чего, куда спешат муравьи из раскиданной кочки, одни прочь из кочки, таща соринки, яйца и мертвые тела, другие назад в кочку – для чего они сталкиваются, догоняют друг друга, дерутся, – так же трудно было бы объяснить причины, заставлявшие русских людей после выхода французов толпиться в том месте, которое прежде называлось Москвою. Но так же, как, глядя на рассыпанных вокруг разоренной кочки муравьев, несмотря на полное уничтожение кочки, видно по цепкости, энергии, по бесчисленности копышущихся насекомых, что разорено все, кроме чего то неразрушимого, невещественного, составляющего всю силу кочки, – так же и Москва, в октябре месяце, несмотря на то, что не было ни начальства, ни церквей, ни святынь, ни богатств, ни домов, была та же Москва, какою она была в августе. Все было разрушено, кроме чего то невещественного, но могущественного и неразрушимого.
Побуждения людей, стремящихся со всех сторон в Москву после ее очищения от врага, были самые разнообразные, личные, и в первое время большей частью – дикие, животные. Одно только побуждение было общее всем – это стремление туда, в то место, которое прежде называлось Москвой, для приложения там своей деятельности.
Через неделю в Москве уже было пятнадцать тысяч жителей, через две было двадцать пять тысяч и т. д. Все возвышаясь и возвышаясь, число это к осени 1813 года дошло до цифры, превосходящей население 12 го года.
Первые русские люди, которые вступили в Москву, были казаки отряда Винцингероде, мужики из соседних деревень и бежавшие из Москвы и скрывавшиеся в ее окрестностях жители. Вступившие в разоренную Москву русские, застав ее разграбленною, стали тоже грабить. Они продолжали то, что делали французы. Обозы мужиков приезжали в Москву с тем, чтобы увозить по деревням все, что было брошено по разоренным московским домам и улицам. Казаки увозили, что могли, в свои ставки; хозяева домов забирали все то, что они находили и других домах, и переносили к себе под предлогом, что это была их собственность.
Но за первыми грабителями приезжали другие, третьи, и грабеж с каждым днем, по мере увеличения грабителей, становился труднее и труднее и принимал более определенные формы.
Французы застали Москву хотя и пустою, но со всеми формами органически правильно жившего города, с его различными отправлениями торговли, ремесел, роскоши, государственного управления, религии. Формы эти были безжизненны, но они еще существовали. Были ряды, лавки, магазины, лабазы, базары – большинство с товарами; были фабрики, ремесленные заведения; были дворцы, богатые дома, наполненные предметами роскоши; были больницы, остроги, присутственные места, церкви, соборы. Чем долее оставались французы, тем более уничтожались эти формы городской жизни, и под конец все слилось в одно нераздельное, безжизненное поле грабежа.
Грабеж французов, чем больше он продолжался, тем больше разрушал богатства Москвы и силы грабителей. Грабеж русских, с которого началось занятие русскими столицы, чем дольше он продолжался, чем больше было в нем участников, тем быстрее восстановлял он богатство Москвы и правильную жизнь города.
Кроме грабителей, народ самый разнообразный, влекомый – кто любопытством, кто долгом службы, кто расчетом, – домовладельцы, духовенство, высшие и низшие чиновники, торговцы, ремесленники, мужики – с разных сторон, как кровь к сердцу, – приливали к Москве.
Через неделю уже мужики, приезжавшие с пустыми подводами, для того чтоб увозить вещи, были останавливаемы начальством и принуждаемы к тому, чтобы вывозить мертвые тела из города. Другие мужики, прослышав про неудачу товарищей, приезжали в город с хлебом, овсом, сеном, сбивая цену друг другу до цены ниже прежней. Артели плотников, надеясь на дорогие заработки, каждый день входили в Москву, и со всех сторон рубились новые, чинились погорелые дома. Купцы в балаганах открывали торговлю. Харчевни, постоялые дворы устраивались в обгорелых домах. Духовенство возобновило службу во многих не погоревших церквах. Жертвователи приносили разграбленные церковные вещи. Чиновники прилаживали свои столы с сукном и шкафы с бумагами в маленьких комнатах. Высшее начальство и полиция распоряжались раздачею оставшегося после французов добра. Хозяева тех домов, в которых было много оставлено свезенных из других домов вещей, жаловались на несправедливость своза всех вещей в Грановитую палату; другие настаивали на том, что французы из разных домов свезли вещи в одно место, и оттого несправедливо отдавать хозяину дома те вещи, которые у него найдены. Бранили полицию; подкупали ее; писали вдесятеро сметы на погоревшие казенные вещи; требовали вспомоществований. Граф Растопчин писал свои прокламации.


В конце января Пьер приехал в Москву и поселился в уцелевшем флигеле. Он съездил к графу Растопчину, к некоторым знакомым, вернувшимся в Москву, и собирался на третий день ехать в Петербург. Все торжествовали победу; все кипело жизнью в разоренной и оживающей столице. Пьеру все были рады; все желали видеть его, и все расспрашивали его про то, что он видел. Пьер чувствовал себя особенно дружелюбно расположенным ко всем людям, которых он встречал; но невольно теперь он держал себя со всеми людьми настороже, так, чтобы не связать себя чем нибудь. Он на все вопросы, которые ему делали, – важные или самые ничтожные, – отвечал одинаково неопределенно; спрашивали ли у него: где он будет жить? будет ли он строиться? когда он едет в Петербург и возьмется ли свезти ящичек? – он отвечал: да, может быть, я думаю, и т. д.
О Ростовых он слышал, что они в Костроме, и мысль о Наташе редко приходила ему. Ежели она и приходила, то только как приятное воспоминание давно прошедшего. Он чувствовал себя не только свободным от житейских условий, но и от этого чувства, которое он, как ему казалось, умышленно напустил на себя.
На третий день своего приезда в Москву он узнал от Друбецких, что княжна Марья в Москве. Смерть, страдания, последние дни князя Андрея часто занимали Пьера и теперь с новой живостью пришли ему в голову. Узнав за обедом, что княжна Марья в Москве и живет в своем не сгоревшем доме на Вздвиженке, он в тот же вечер поехал к ней.
Дорогой к княжне Марье Пьер не переставая думал о князе Андрее, о своей дружбе с ним, о различных с ним встречах и в особенности о последней в Бородине.
«Неужели он умер в том злобном настроении, в котором он был тогда? Неужели не открылось ему перед смертью объяснение жизни?» – думал Пьер. Он вспомнил о Каратаеве, о его смерти и невольно стал сравнивать этих двух людей, столь различных и вместе с тем столь похожих по любви, которую он имел к обоим, и потому, что оба жили и оба умерли.
В самом серьезном расположении духа Пьер подъехал к дому старого князя. Дом этот уцелел. В нем видны были следы разрушения, но характер дома был тот же. Встретивший Пьера старый официант с строгим лицом, как будто желая дать почувствовать гостю, что отсутствие князя не нарушает порядка дома, сказал, что княжна изволили пройти в свои комнаты и принимают по воскресеньям.
– Доложи; может быть, примут, – сказал Пьер.
– Слушаю с, – отвечал официант, – пожалуйте в портретную.
Через несколько минут к Пьеру вышли официант и Десаль. Десаль от имени княжны передал Пьеру, что она очень рада видеть его и просит, если он извинит ее за бесцеремонность, войти наверх, в ее комнаты.
В невысокой комнатке, освещенной одной свечой, сидела княжна и еще кто то с нею, в черном платье. Пьер помнил, что при княжне всегда были компаньонки. Кто такие и какие они, эти компаньонки, Пьер не знал и не помнил. «Это одна из компаньонок», – подумал он, взглянув на даму в черном платье.
Княжна быстро встала ему навстречу и протянула руку.
– Да, – сказала она, всматриваясь в его изменившееся лицо, после того как он поцеловал ее руку, – вот как мы с вами встречаемся. Он и последнее время часто говорил про вас, – сказала она, переводя свои глаза с Пьера на компаньонку с застенчивостью, которая на мгновение поразила Пьера.
– Я так была рада, узнав о вашем спасенье. Это было единственное радостное известие, которое мы получили с давнего времени. – Опять еще беспокойнее княжна оглянулась на компаньонку и хотела что то сказать; но Пьер перебил ее.
– Вы можете себе представить, что я ничего не знал про него, – сказал он. – Я считал его убитым. Все, что я узнал, я узнал от других, через третьи руки. Я знаю только, что он попал к Ростовым… Какая судьба!
Пьер говорил быстро, оживленно. Он взглянул раз на лицо компаньонки, увидал внимательно ласково любопытный взгляд, устремленный на него, и, как это часто бывает во время разговора, он почему то почувствовал, что эта компаньонка в черном платье – милое, доброе, славное существо, которое не помешает его задушевному разговору с княжной Марьей.
Но когда он сказал последние слова о Ростовых, замешательство в лице княжны Марьи выразилось еще сильнее. Она опять перебежала глазами с лица Пьера на лицо дамы в черном платье и сказала:
– Вы не узнаете разве?
Пьер взглянул еще раз на бледное, тонкое, с черными глазами и странным ртом, лицо компаньонки. Что то родное, давно забытое и больше чем милое смотрело на него из этих внимательных глаз.
«Но нет, это не может быть, – подумал он. – Это строгое, худое и бледное, постаревшее лицо? Это не может быть она. Это только воспоминание того». Но в это время княжна Марья сказала: «Наташа». И лицо, с внимательными глазами, с трудом, с усилием, как отворяется заржавелая дверь, – улыбнулось, и из этой растворенной двери вдруг пахнуло и обдало Пьера тем давно забытым счастием, о котором, в особенности теперь, он не думал. Пахнуло, охватило и поглотило его всего. Когда она улыбнулась, уже не могло быть сомнений: это была Наташа, и он любил ее.
В первую же минуту Пьер невольно и ей, и княжне Марье, и, главное, самому себе сказал неизвестную ему самому тайну. Он покраснел радостно и страдальчески болезненно. Он хотел скрыть свое волнение. Но чем больше он хотел скрыть его, тем яснее – яснее, чем самыми определенными словами, – он себе, и ей, и княжне Марье говорил, что он любит ее.
«Нет, это так, от неожиданности», – подумал Пьер. Но только что он хотел продолжать начатый разговор с княжной Марьей, он опять взглянул на Наташу, и еще сильнейшая краска покрыла его лицо, и еще сильнейшее волнение радости и страха охватило его душу. Он запутался в словах и остановился на середине речи.
Пьер не заметил Наташи, потому что он никак не ожидал видеть ее тут, но он не узнал ее потому, что происшедшая в ней, с тех пор как он не видал ее, перемена была огромна. Она похудела и побледнела. Но не это делало ее неузнаваемой: ее нельзя было узнать в первую минуту, как он вошел, потому что на этом лице, в глазах которого прежде всегда светилась затаенная улыбка радости жизни, теперь, когда он вошел и в первый раз взглянул на нее, не было и тени улыбки; были одни глаза, внимательные, добрые и печально вопросительные.
Смущение Пьера не отразилось на Наташе смущением, но только удовольствием, чуть заметно осветившим все ее лицо.


– Она приехала гостить ко мне, – сказала княжна Марья. – Граф и графиня будут на днях. Графиня в ужасном положении. Но Наташе самой нужно было видеть доктора. Ее насильно отослали со мной.
– Да, есть ли семья без своего горя? – сказал Пьер, обращаясь к Наташе. – Вы знаете, что это было в тот самый день, как нас освободили. Я видел его. Какой был прелестный мальчик.
Наташа смотрела на него, и в ответ на его слова только больше открылись и засветились ее глаза.
– Что можно сказать или подумать в утешенье? – сказал Пьер. – Ничего. Зачем было умирать такому славному, полному жизни мальчику?
– Да, в наше время трудно жить бы было без веры… – сказала княжна Марья.
– Да, да. Вот это истинная правда, – поспешно перебил Пьер.
– Отчего? – спросила Наташа, внимательно глядя в глаза Пьеру.
– Как отчего? – сказала княжна Марья. – Одна мысль о том, что ждет там…
Наташа, не дослушав княжны Марьи, опять вопросительно поглядела на Пьера.
– И оттого, – продолжал Пьер, – что только тот человек, который верит в то, что есть бог, управляющий нами, может перенести такую потерю, как ее и… ваша, – сказал Пьер.
Наташа раскрыла уже рот, желая сказать что то, но вдруг остановилась. Пьер поспешил отвернуться от нее и обратился опять к княжне Марье с вопросом о последних днях жизни своего друга. Смущение Пьера теперь почти исчезло; но вместе с тем он чувствовал, что исчезла вся его прежняя свобода. Он чувствовал, что над каждым его словом, действием теперь есть судья, суд, который дороже ему суда всех людей в мире. Он говорил теперь и вместе с своими словами соображал то впечатление, которое производили его слова на Наташу. Он не говорил нарочно того, что бы могло понравиться ей; но, что бы он ни говорил, он с ее точки зрения судил себя.
Княжна Марья неохотно, как это всегда бывает, начала рассказывать про то положение, в котором она застала князя Андрея. Но вопросы Пьера, его оживленно беспокойный взгляд, его дрожащее от волнения лицо понемногу заставили ее вдаться в подробности, которые она боялась для самой себя возобновлять в воображенье.
– Да, да, так, так… – говорил Пьер, нагнувшись вперед всем телом над княжной Марьей и жадно вслушиваясь в ее рассказ. – Да, да; так он успокоился? смягчился? Он так всеми силами души всегда искал одного; быть вполне хорошим, что он не мог бояться смерти. Недостатки, которые были в нем, – если они были, – происходили не от него. Так он смягчился? – говорил Пьер. – Какое счастье, что он свиделся с вами, – сказал он Наташе, вдруг обращаясь к ней и глядя на нее полными слез глазами.
Лицо Наташи вздрогнуло. Она нахмурилась и на мгновенье опустила глаза. С минуту она колебалась: говорить или не говорить?
– Да, это было счастье, – сказала она тихим грудным голосом, – для меня наверное это было счастье. – Она помолчала. – И он… он… он говорил, что он желал этого, в ту минуту, как я пришла к нему… – Голос Наташи оборвался. Она покраснела, сжала руки на коленах и вдруг, видимо сделав усилие над собой, подняла голову и быстро начала говорить:
– Мы ничего не знали, когда ехали из Москвы. Я не смела спросить про него. И вдруг Соня сказала мне, что он с нами. Я ничего не думала, не могла представить себе, в каком он положении; мне только надо было видеть его, быть с ним, – говорила она, дрожа и задыхаясь. И, не давая перебивать себя, она рассказала то, чего она еще никогда, никому не рассказывала: все то, что она пережила в те три недели их путешествия и жизни в Ярославль.
Пьер слушал ее с раскрытым ртом и не спуская с нее своих глаз, полных слезами. Слушая ее, он не думал ни о князе Андрее, ни о смерти, ни о том, что она рассказывала. Он слушал ее и только жалел ее за то страдание, которое она испытывала теперь, рассказывая.
Княжна, сморщившись от желания удержать слезы, сидела подле Наташи и слушала в первый раз историю этих последних дней любви своего брата с Наташей.
Этот мучительный и радостный рассказ, видимо, был необходим для Наташи.
Она говорила, перемешивая ничтожнейшие подробности с задушевнейшими тайнами, и, казалось, никогда не могла кончить. Несколько раз она повторяла то же самое.
За дверью послышался голос Десаля, спрашивавшего, можно ли Николушке войти проститься.
– Да вот и все, все… – сказала Наташа. Она быстро встала, в то время как входил Николушка, и почти побежала к двери, стукнулась головой о дверь, прикрытую портьерой, и с стоном не то боли, не то печали вырвалась из комнаты.
Пьер смотрел на дверь, в которую она вышла, и не понимал, отчего он вдруг один остался во всем мире.
Княжна Марья вызвала его из рассеянности, обратив его внимание на племянника, который вошел в комнату.
Лицо Николушки, похожее на отца, в минуту душевного размягчения, в котором Пьер теперь находился, так на него подействовало, что он, поцеловав Николушку, поспешно встал и, достав платок, отошел к окну. Он хотел проститься с княжной Марьей, но она удержала его.
– Нет, мы с Наташей не спим иногда до третьего часа; пожалуйста, посидите. Я велю дать ужинать. Подите вниз; мы сейчас придем.
Прежде чем Пьер вышел, княжна сказала ему:
– Это в первый раз она так говорила о нем.


Пьера провели в освещенную большую столовую; через несколько минут послышались шаги, и княжна с Наташей вошли в комнату. Наташа была спокойна, хотя строгое, без улыбки, выражение теперь опять установилось на ее лице. Княжна Марья, Наташа и Пьер одинаково испытывали то чувство неловкости, которое следует обыкновенно за оконченным серьезным и задушевным разговором. Продолжать прежний разговор невозможно; говорить о пустяках – совестно, а молчать неприятно, потому что хочется говорить, а этим молчанием как будто притворяешься. Они молча подошли к столу. Официанты отодвинули и пододвинули стулья. Пьер развернул холодную салфетку и, решившись прервать молчание, взглянул на Наташу и княжну Марью. Обе, очевидно, в то же время решились на то же: у обеих в глазах светилось довольство жизнью и признание того, что, кроме горя, есть и радости.
– Вы пьете водку, граф? – сказала княжна Марья, и эти слова вдруг разогнали тени прошедшего.
– Расскажите же про себя, – сказала княжна Марья. – Про вас рассказывают такие невероятные чудеса.
– Да, – с своей, теперь привычной, улыбкой кроткой насмешки отвечал Пьер. – Мне самому даже рассказывают про такие чудеса, каких я и во сне не видел. Марья Абрамовна приглашала меня к себе и все рассказывала мне, что со мной случилось, или должно было случиться. Степан Степаныч тоже научил меня, как мне надо рассказывать. Вообще я заметил, что быть интересным человеком очень покойно (я теперь интересный человек); меня зовут и мне рассказывают.
Наташа улыбнулась и хотела что то сказать.
– Нам рассказывали, – перебила ее княжна Марья, – что вы в Москве потеряли два миллиона. Правда это?
– А я стал втрое богаче, – сказал Пьер. Пьер, несмотря на то, что долги жены и необходимость построек изменили его дела, продолжал рассказывать, что он стал втрое богаче.
– Что я выиграл несомненно, – сказал он, – так это свободу… – начал он было серьезно; но раздумал продолжать, заметив, что это был слишком эгоистический предмет разговора.
– А вы строитесь?
– Да, Савельич велит.
– Скажите, вы не знали еще о кончине графини, когда остались в Москве? – сказала княжна Марья и тотчас же покраснела, заметив, что, делая этот вопрос вслед за его словами о том, что он свободен, она приписывает его словам такое значение, которого они, может быть, не имели.
– Нет, – отвечал Пьер, не найдя, очевидно, неловким то толкование, которое дала княжна Марья его упоминанию о своей свободе. – Я узнал это в Орле, и вы не можете себе представить, как меня это поразило. Мы не были примерные супруги, – сказал он быстро, взглянув на Наташу и заметив в лице ее любопытство о том, как он отзовется о своей жене. – Но смерть эта меня страшно поразила. Когда два человека ссорятся – всегда оба виноваты. И своя вина делается вдруг страшно тяжела перед человеком, которого уже нет больше. И потом такая смерть… без друзей, без утешения. Мне очень, очень жаль еe, – кончил он и с удовольствием заметил радостное одобрение на лице Наташи.
– Да, вот вы опять холостяк и жених, – сказала княжна Марья.
Пьер вдруг багрово покраснел и долго старался не смотреть на Наташу. Когда он решился взглянуть на нее, лицо ее было холодно, строго и даже презрительно, как ему показалось.
– Но вы точно видели и говорили с Наполеоном, как нам рассказывали? – сказала княжна Марья.
Пьер засмеялся.
– Ни разу, никогда. Всегда всем кажется, что быть в плену – значит быть в гостях у Наполеона. Я не только не видал его, но и не слыхал о нем. Я был гораздо в худшем обществе.
Ужин кончался, и Пьер, сначала отказывавшийся от рассказа о своем плене, понемногу вовлекся в этот рассказ.
– Но ведь правда, что вы остались, чтоб убить Наполеона? – спросила его Наташа, слегка улыбаясь. – Я тогда догадалась, когда мы вас встретили у Сухаревой башни; помните?
Пьер признался, что это была правда, и с этого вопроса, понемногу руководимый вопросами княжны Марьи и в особенности Наташи, вовлекся в подробный рассказ о своих похождениях.
Сначала он рассказывал с тем насмешливым, кротким взглядом, который он имел теперь на людей и в особенности на самого себя; но потом, когда он дошел до рассказа об ужасах и страданиях, которые он видел, он, сам того не замечая, увлекся и стал говорить с сдержанным волнением человека, в воспоминании переживающего сильные впечатления.
Княжна Марья с кроткой улыбкой смотрела то на Пьера, то на Наташу. Она во всем этом рассказе видела только Пьера и его доброту. Наташа, облокотившись на руку, с постоянно изменяющимся, вместе с рассказом, выражением лица, следила, ни на минуту не отрываясь, за Пьером, видимо, переживая с ним вместе то, что он рассказывал. Не только ее взгляд, но восклицания и короткие вопросы, которые она делала, показывали Пьеру, что из того, что он рассказывал, она понимала именно то, что он хотел передать. Видно было, что она понимала не только то, что он рассказывал, но и то, что он хотел бы и не мог выразить словами. Про эпизод свой с ребенком и женщиной, за защиту которых он был взят, Пьер рассказал таким образом:
– Это было ужасное зрелище, дети брошены, некоторые в огне… При мне вытащили ребенка… женщины, с которых стаскивали вещи, вырывали серьги…
Пьер покраснел и замялся.
– Тут приехал разъезд, и всех тех, которые не грабили, всех мужчин забрали. И меня.
– Вы, верно, не все рассказываете; вы, верно, сделали что нибудь… – сказала Наташа и помолчала, – хорошее.
Пьер продолжал рассказывать дальше. Когда он рассказывал про казнь, он хотел обойти страшные подробности; но Наташа требовала, чтобы он ничего не пропускал.
Пьер начал было рассказывать про Каратаева (он уже встал из за стола и ходил, Наташа следила за ним глазами) и остановился.
– Нет, вы не можете понять, чему я научился у этого безграмотного человека – дурачка.
– Нет, нет, говорите, – сказала Наташа. – Он где же?
– Его убили почти при мне. – И Пьер стал рассказывать последнее время их отступления, болезнь Каратаева (голос его дрожал беспрестанно) и его смерть.
Пьер рассказывал свои похождения так, как он никогда их еще не рассказывал никому, как он сам с собою никогда еще не вспоминал их. Он видел теперь как будто новое значение во всем том, что он пережил. Теперь, когда он рассказывал все это Наташе, он испытывал то редкое наслаждение, которое дают женщины, слушая мужчину, – не умные женщины, которые, слушая, стараются или запомнить, что им говорят, для того чтобы обогатить свой ум и при случае пересказать то же или приладить рассказываемое к своему и сообщить поскорее свои умные речи, выработанные в своем маленьком умственном хозяйстве; а то наслажденье, которое дают настоящие женщины, одаренные способностью выбирания и всасыванья в себя всего лучшего, что только есть в проявлениях мужчины. Наташа, сама не зная этого, была вся внимание: она не упускала ни слова, ни колебания голоса, ни взгляда, ни вздрагиванья мускула лица, ни жеста Пьера. Она на лету ловила еще не высказанное слово и прямо вносила в свое раскрытое сердце, угадывая тайный смысл всей душевной работы Пьера.
Княжна Марья понимала рассказ, сочувствовала ему, но она теперь видела другое, что поглощало все ее внимание; она видела возможность любви и счастия между Наташей и Пьером. И в первый раз пришедшая ей эта мысль наполняла ее душу радостию.
Было три часа ночи. Официанты с грустными и строгими лицами приходили переменять свечи, но никто не замечал их.
Пьер кончил свой рассказ. Наташа блестящими, оживленными глазами продолжала упорно и внимательно глядеть на Пьера, как будто желая понять еще то остальное, что он не высказал, может быть. Пьер в стыдливом и счастливом смущении изредка взглядывал на нее и придумывал, что бы сказать теперь, чтобы перевести разговор на другой предмет. Княжна Марья молчала. Никому в голову не приходило, что три часа ночи и что пора спать.
– Говорят: несчастия, страдания, – сказал Пьер. – Да ежели бы сейчас, сию минуту мне сказали: хочешь оставаться, чем ты был до плена, или сначала пережить все это? Ради бога, еще раз плен и лошадиное мясо. Мы думаем, как нас выкинет из привычной дорожки, что все пропало; а тут только начинается новое, хорошее. Пока есть жизнь, есть и счастье. Впереди много, много. Это я вам говорю, – сказал он, обращаясь к Наташе.
– Да, да, – сказала она, отвечая на совсем другое, – и я ничего бы не желала, как только пережить все сначала.
Пьер внимательно посмотрел на нее.
– Да, и больше ничего, – подтвердила Наташа.
– Неправда, неправда, – закричал Пьер. – Я не виноват, что я жив и хочу жить; и вы тоже.
Вдруг Наташа опустила голову на руки и заплакала.
– Что ты, Наташа? – сказала княжна Марья.
– Ничего, ничего. – Она улыбнулась сквозь слезы Пьеру. – Прощайте, пора спать.
Пьер встал и простился.

Княжна Марья и Наташа, как и всегда, сошлись в спальне. Они поговорили о том, что рассказывал Пьер. Княжна Марья не говорила своего мнения о Пьере. Наташа тоже не говорила о нем.
– Ну, прощай, Мари, – сказала Наташа. – Знаешь, я часто боюсь, что мы не говорим о нем (князе Андрее), как будто мы боимся унизить наше чувство, и забываем.
Княжна Марья тяжело вздохнула и этим вздохом признала справедливость слов Наташи; но словами она не согласилась с ней.
– Разве можно забыть? – сказала она.
– Мне так хорошо было нынче рассказать все; и тяжело, и больно, и хорошо. Очень хорошо, – сказала Наташа, – я уверена, что он точно любил его. От этого я рассказала ему… ничего, что я рассказала ему? – вдруг покраснев, спросила она.
– Пьеру? О нет! Какой он прекрасный, – сказала княжна Марья.
– Знаешь, Мари, – вдруг сказала Наташа с шаловливой улыбкой, которой давно не видала княжна Марья на ее лице. – Он сделался какой то чистый, гладкий, свежий; точно из бани, ты понимаешь? – морально из бани. Правда?
– Да, – сказала княжна Марья, – он много выиграл.
– И сюртучок коротенький, и стриженые волосы; точно, ну точно из бани… папа, бывало…
– Я понимаю, что он (князь Андрей) никого так не любил, как его, – сказала княжна Марья.
– Да, и он особенный от него. Говорят, что дружны мужчины, когда совсем особенные. Должно быть, это правда. Правда, он совсем на него не похож ничем?
– Да, и чудесный.
– Ну, прощай, – отвечала Наташа. И та же шаловливая улыбка, как бы забывшись, долго оставалась на ее лице.


Пьер долго не мог заснуть в этот день; он взад и вперед ходил по комнате, то нахмурившись, вдумываясь во что то трудное, вдруг пожимая плечами и вздрагивая, то счастливо улыбаясь.
Он думал о князе Андрее, о Наташе, об их любви, и то ревновал ее к прошедшему, то упрекал, то прощал себя за это. Было уже шесть часов утра, а он все ходил по комнате.
«Ну что ж делать. Уж если нельзя без этого! Что ж делать! Значит, так надо», – сказал он себе и, поспешно раздевшись, лег в постель, счастливый и взволнованный, но без сомнений и нерешительностей.
«Надо, как ни странно, как ни невозможно это счастье, – надо сделать все для того, чтобы быть с ней мужем и женой», – сказал он себе.
Пьер еще за несколько дней перед этим назначил в пятницу день своего отъезда в Петербург. Когда он проснулся, в четверг, Савельич пришел к нему за приказаниями об укладке вещей в дорогу.
«Как в Петербург? Что такое Петербург? Кто в Петербурге? – невольно, хотя и про себя, спросил он. – Да, что то такое давно, давно, еще прежде, чем это случилось, я зачем то собирался ехать в Петербург, – вспомнил он. – Отчего же? я и поеду, может быть. Какой он добрый, внимательный, как все помнит! – подумал он, глядя на старое лицо Савельича. – И какая улыбка приятная!» – подумал он.
– Что ж, все не хочешь на волю, Савельич? – спросил Пьер.
– Зачем мне, ваше сиятельство, воля? При покойном графе, царство небесное, жили и при вас обиды не видим.
– Ну, а дети?
– И дети проживут, ваше сиятельство: за такими господами жить можно.
– Ну, а наследники мои? – сказал Пьер. – Вдруг я женюсь… Ведь может случиться, – прибавил он с невольной улыбкой.
– И осмеливаюсь доложить: хорошее дело, ваше сиятельство.
«Как он думает это легко, – подумал Пьер. – Он не знает, как это страшно, как опасно. Слишком рано или слишком поздно… Страшно!»
– Как же изволите приказать? Завтра изволите ехать? – спросил Савельич.
– Нет; я немножко отложу. Я тогда скажу. Ты меня извини за хлопоты, – сказал Пьер и, глядя на улыбку Савельича, подумал: «Как странно, однако, что он не знает, что теперь нет никакого Петербурга и что прежде всего надо, чтоб решилось то. Впрочем, он, верно, знает, но только притворяется. Поговорить с ним? Как он думает? – подумал Пьер. – Нет, после когда нибудь».
За завтраком Пьер сообщил княжне, что он был вчера у княжны Марьи и застал там, – можете себе представить кого? – Натали Ростову.
Княжна сделала вид, что она в этом известии не видит ничего более необыкновенного, как в том, что Пьер видел Анну Семеновну.
– Вы ее знаете? – спросил Пьер.
– Я видела княжну, – отвечала она. – Я слышала, что ее сватали за молодого Ростова. Это было бы очень хорошо для Ростовых; говорят, они совсем разорились.
– Нет, Ростову вы знаете?
– Слышала тогда только про эту историю. Очень жалко.
«Нет, она не понимает или притворяется, – подумал Пьер. – Лучше тоже не говорить ей».
Княжна также приготавливала провизию на дорогу Пьеру.
«Как они добры все, – думал Пьер, – что они теперь, когда уж наверное им это не может быть более интересно, занимаются всем этим. И все для меня; вот что удивительно».
В этот же день к Пьеру приехал полицеймейстер с предложением прислать доверенного в Грановитую палату для приема вещей, раздаваемых нынче владельцам.
«Вот и этот тоже, – думал Пьер, глядя в лицо полицеймейстера, – какой славный, красивый офицер и как добр! Теперь занимается такими пустяками. А еще говорят, что он не честен и пользуется. Какой вздор! А впрочем, отчего же ему и не пользоваться? Он так и воспитан. И все так делают. А такое приятное, доброе лицо, и улыбается, глядя на меня».
Пьер поехал обедать к княжне Марье.
Проезжая по улицам между пожарищами домов, он удивлялся красоте этих развалин. Печные трубы домов, отвалившиеся стены, живописно напоминая Рейн и Колизей, тянулись, скрывая друг друга, по обгорелым кварталам. Встречавшиеся извозчики и ездоки, плотники, рубившие срубы, торговки и лавочники, все с веселыми, сияющими лицами, взглядывали на Пьера и говорили как будто: «А, вот он! Посмотрим, что выйдет из этого».
При входе в дом княжны Марьи на Пьера нашло сомнение в справедливости того, что он был здесь вчера, виделся с Наташей и говорил с ней. «Может быть, это я выдумал. Может быть, я войду и никого не увижу». Но не успел он вступить в комнату, как уже во всем существе своем, по мгновенному лишению своей свободы, он почувствовал ее присутствие. Она была в том же черном платье с мягкими складками и так же причесана, как и вчера, но она была совсем другая. Если б она была такою вчера, когда он вошел в комнату, он бы не мог ни на мгновение не узнать ее.
Она была такою же, какою он знал ее почти ребенком и потом невестой князя Андрея. Веселый вопросительный блеск светился в ее глазах; на лице было ласковое и странно шаловливое выражение.
Пьер обедал и просидел бы весь вечер; но княжна Марья ехала ко всенощной, и Пьер уехал с ними вместе.
На другой день Пьер приехал рано, обедал и просидел весь вечер. Несмотря на то, что княжна Марья и Наташа были очевидно рады гостю; несмотря на то, что весь интерес жизни Пьера сосредоточивался теперь в этом доме, к вечеру они всё переговорили, и разговор переходил беспрестанно с одного ничтожного предмета на другой и часто прерывался. Пьер засиделся в этот вечер так поздно, что княжна Марья и Наташа переглядывались между собою, очевидно ожидая, скоро ли он уйдет. Пьер видел это и не мог уйти. Ему становилось тяжело, неловко, но он все сидел, потому что не мог подняться и уйти.
Княжна Марья, не предвидя этому конца, первая встала и, жалуясь на мигрень, стала прощаться.
– Так вы завтра едете в Петербург? – сказала ока.
– Нет, я не еду, – с удивлением и как будто обидясь, поспешно сказал Пьер. – Да нет, в Петербург? Завтра; только я не прощаюсь. Я заеду за комиссиями, – сказал он, стоя перед княжной Марьей, краснея и не уходя.
Наташа подала ему руку и вышла. Княжна Марья, напротив, вместо того чтобы уйти, опустилась в кресло и своим лучистым, глубоким взглядом строго и внимательно посмотрела на Пьера. Усталость, которую она очевидно выказывала перед этим, теперь совсем прошла. Она тяжело и продолжительно вздохнула, как будто приготавливаясь к длинному разговору.
Все смущение и неловкость Пьера, при удалении Наташи, мгновенно исчезли и заменились взволнованным оживлением. Он быстро придвинул кресло совсем близко к княжне Марье.
– Да, я и хотел сказать вам, – сказал он, отвечая, как на слова, на ее взгляд. – Княжна, помогите мне. Что мне делать? Могу я надеяться? Княжна, друг мой, выслушайте меня. Я все знаю. Я знаю, что я не стою ее; я знаю, что теперь невозможно говорить об этом. Но я хочу быть братом ей. Нет, я не хочу.. я не могу…
Он остановился и потер себе лицо и глаза руками.
– Ну, вот, – продолжал он, видимо сделав усилие над собой, чтобы говорить связно. – Я не знаю, с каких пор я люблю ее. Но я одну только ее, одну любил во всю мою жизнь и люблю так, что без нее не могу себе представить жизни. Просить руки ее теперь я не решаюсь; но мысль о том, что, может быть, она могла бы быть моею и что я упущу эту возможность… возможность… ужасна. Скажите, могу я надеяться? Скажите, что мне делать? Милая княжна, – сказал он, помолчав немного и тронув ее за руку, так как она не отвечала.
– Я думаю о том, что вы мне сказали, – отвечала княжна Марья. – Вот что я скажу вам. Вы правы, что теперь говорить ей об любви… – Княжна остановилась. Она хотела сказать: говорить ей о любви теперь невозможно; но она остановилась, потому что она третий день видела по вдруг переменившейся Наташе, что не только Наташа не оскорбилась бы, если б ей Пьер высказал свою любовь, но что она одного только этого и желала.
– Говорить ей теперь… нельзя, – все таки сказала княжна Марья.
– Но что же мне делать?
– Поручите это мне, – сказала княжна Марья. – Я знаю…
Пьер смотрел в глаза княжне Марье.
– Ну, ну… – говорил он.
– Я знаю, что она любит… полюбит вас, – поправилась княжна Марья.
Не успела она сказать эти слова, как Пьер вскочил и с испуганным лицом схватил за руку княжну Марью.
– Отчего вы думаете? Вы думаете, что я могу надеяться? Вы думаете?!
– Да, думаю, – улыбаясь, сказала княжна Марья. – Напишите родителям. И поручите мне. Я скажу ей, когда будет можно. Я желаю этого. И сердце мое чувствует, что это будет.
– Нет, это не может быть! Как я счастлив! Но это не может быть… Как я счастлив! Нет, не может быть! – говорил Пьер, целуя руки княжны Марьи.
– Вы поезжайте в Петербург; это лучше. А я напишу вам, – сказала она.
– В Петербург? Ехать? Хорошо, да, ехать. Но завтра я могу приехать к вам?
На другой день Пьер приехал проститься. Наташа была менее оживлена, чем в прежние дни; но в этот день, иногда взглянув ей в глаза, Пьер чувствовал, что он исчезает, что ни его, ни ее нет больше, а есть одно чувство счастья. «Неужели? Нет, не может быть», – говорил он себе при каждом ее взгляде, жесте, слове, наполнявших его душу радостью.
Когда он, прощаясь с нею, взял ее тонкую, худую руку, он невольно несколько дольше удержал ее в своей.
«Неужели эта рука, это лицо, эти глаза, все это чуждое мне сокровище женской прелести, неужели это все будет вечно мое, привычное, такое же, каким я сам для себя? Нет, это невозможно!..»
– Прощайте, граф, – сказала она ему громко. – Я очень буду ждать вас, – прибавила она шепотом.
И эти простые слова, взгляд и выражение лица, сопровождавшие их, в продолжение двух месяцев составляли предмет неистощимых воспоминаний, объяснений и счастливых мечтаний Пьера. «Я очень буду ждать вас… Да, да, как она сказала? Да, я очень буду ждать вас. Ах, как я счастлив! Что ж это такое, как я счастлив!» – говорил себе Пьер.


В душе Пьера теперь не происходило ничего подобного тому, что происходило в ней в подобных же обстоятельствах во время его сватовства с Элен.
Он не повторял, как тогда, с болезненным стыдом слов, сказанных им, не говорил себе: «Ах, зачем я не сказал этого, и зачем, зачем я сказал тогда „je vous aime“?» [я люблю вас] Теперь, напротив, каждое слово ее, свое он повторял в своем воображении со всеми подробностями лица, улыбки и ничего не хотел ни убавить, ни прибавить: хотел только повторять. Сомнений в том, хорошо ли, или дурно то, что он предпринял, – теперь не было и тени. Одно только страшное сомнение иногда приходило ему в голову. Не во сне ли все это? Не ошиблась ли княжна Марья? Не слишком ли я горд и самонадеян? Я верю; а вдруг, что и должно случиться, княжна Марья скажет ей, а она улыбнется и ответит: «Как странно! Он, верно, ошибся. Разве он не знает, что он человек, просто человек, а я?.. Я совсем другое, высшее».
Только это сомнение часто приходило Пьеру. Планов он тоже не делал теперь никаких. Ему казалось так невероятно предстоящее счастье, что стоило этому совершиться, и уж дальше ничего не могло быть. Все кончалось.
Радостное, неожиданное сумасшествие, к которому Пьер считал себя неспособным, овладело им. Весь смысл жизни, не для него одного, но для всего мира, казался ему заключающимся только в его любви и в возможности ее любви к нему. Иногда все люди казались ему занятыми только одним – его будущим счастьем. Ему казалось иногда, что все они радуются так же, как и он сам, и только стараются скрыть эту радость, притворяясь занятыми другими интересами. В каждом слове и движении он видел намеки на свое счастие. Он часто удивлял людей, встречавшихся с ним, своими значительными, выражавшими тайное согласие, счастливыми взглядами и улыбками. Но когда он понимал, что люди могли не знать про его счастье, он от всей души жалел их и испытывал желание как нибудь объяснить им, что все то, чем они заняты, есть совершенный вздор и пустяки, не стоящие внимания.
Когда ему предлагали служить или когда обсуждали какие нибудь общие, государственные дела и войну, предполагая, что от такого или такого исхода такого то события зависит счастие всех людей, он слушал с кроткой соболезнующею улыбкой и удивлял говоривших с ним людей своими странными замечаниями. Но как те люди, которые казались Пьеру понимающими настоящий смысл жизни, то есть его чувство, так и те несчастные, которые, очевидно, не понимали этого, – все люди в этот период времени представлялись ему в таком ярком свете сиявшего в нем чувства, что без малейшего усилия, он сразу, встречаясь с каким бы то ни было человеком, видел в нем все, что было хорошего и достойного любви.
Рассматривая дела и бумаги своей покойной жены, он к ее памяти не испытывал никакого чувства, кроме жалости в том, что она не знала того счастья, которое он знал теперь. Князь Василий, особенно гордый теперь получением нового места и звезды, представлялся ему трогательным, добрым и жалким стариком.
Пьер часто потом вспоминал это время счастливого безумия. Все суждения, которые он составил себе о людях и обстоятельствах за этот период времени, остались для него навсегда верными. Он не только не отрекался впоследствии от этих взглядов на людей и вещи, но, напротив, в внутренних сомнениях и противуречиях прибегал к тому взгляду, который он имел в это время безумия, и взгляд этот всегда оказывался верен.
«Может быть, – думал он, – я и казался тогда странен и смешон; но я тогда не был так безумен, как казалось. Напротив, я был тогда умнее и проницательнее, чем когда либо, и понимал все, что стоит понимать в жизни, потому что… я был счастлив».
Безумие Пьера состояло в том, что он не дожидался, как прежде, личных причин, которые он называл достоинствами людей, для того чтобы любить их, а любовь переполняла его сердце, и он, беспричинно любя людей, находил несомненные причины, за которые стоило любить их.


С первого того вечера, когда Наташа, после отъезда Пьера, с радостно насмешливой улыбкой сказала княжне Марье, что он точно, ну точно из бани, и сюртучок, и стриженый, с этой минуты что то скрытое и самой ей неизвестное, но непреодолимое проснулось в душе Наташи.
Все: лицо, походка, взгляд, голос – все вдруг изменилось в ней. Неожиданные для нее самой – сила жизни, надежды на счастье всплыли наружу и требовали удовлетворения. С первого вечера Наташа как будто забыла все то, что с ней было. Она с тех пор ни разу не пожаловалась на свое положение, ни одного слова не сказала о прошедшем и не боялась уже делать веселые планы на будущее. Она мало говорила о Пьере, но когда княжна Марья упоминала о нем, давно потухший блеск зажигался в ее глазах и губы морщились странной улыбкой.
Перемена, происшедшая в Наташе, сначала удивила княжну Марью; но когда она поняла ее значение, то перемена эта огорчила ее. «Неужели она так мало любила брата, что так скоро могла забыть его», – думала княжна Марья, когда она одна обдумывала происшедшую перемену. Но когда она была с Наташей, то не сердилась на нее и не упрекала ее. Проснувшаяся сила жизни, охватившая Наташу, была, очевидно, так неудержима, так неожиданна для нее самой, что княжна Марья в присутствии Наташи чувствовала, что она не имела права упрекать ее даже в душе своей.
Наташа с такой полнотой и искренностью вся отдалась новому чувству, что и не пыталась скрывать, что ей было теперь не горестно, а радостно и весело.
Когда, после ночного объяснения с Пьером, княжна Марья вернулась в свою комнату, Наташа встретила ее на пороге.
– Он сказал? Да? Он сказал? – повторила она. И радостное и вместе жалкое, просящее прощения за свою радость, выражение остановилось на лице Наташи.
– Я хотела слушать у двери; но я знала, что ты скажешь мне.
Как ни понятен, как ни трогателен был для княжны Марьи тот взгляд, которым смотрела на нее Наташа; как ни жалко ей было видеть ее волнение; но слова Наташи в первую минуту оскорбили княжну Марью. Она вспомнила о брате, о его любви.
«Но что же делать! она не может иначе», – подумала княжна Марья; и с грустным и несколько строгим лицом передала она Наташе все, что сказал ей Пьер. Услыхав, что он собирается в Петербург, Наташа изумилась.
– В Петербург? – повторила она, как бы не понимая. Но, вглядевшись в грустное выражение лица княжны Марьи, она догадалась о причине ее грусти и вдруг заплакала. – Мари, – сказала она, – научи, что мне делать. Я боюсь быть дурной. Что ты скажешь, то я буду делать; научи меня…
– Ты любишь его?
– Да, – прошептала Наташа.
– О чем же ты плачешь? Я счастлива за тебя, – сказала княжна Марья, за эти слезы простив уже совершенно радость Наташи.
– Это будет не скоро, когда нибудь. Ты подумай, какое счастие, когда я буду его женой, а ты выйдешь за Nicolas.
– Наташа, я тебя просила не говорить об этом. Будем говорить о тебе.
Они помолчали.
– Только для чего же в Петербург! – вдруг сказала Наташа, и сама же поспешно ответила себе: – Нет, нет, это так надо… Да, Мари? Так надо…


Прошло семь лет после 12 го года. Взволнованное историческое море Европы улеглось в свои берега. Оно казалось затихшим; но таинственные силы, двигающие человечество (таинственные потому, что законы, определяющие их движение, неизвестны нам), продолжали свое действие.
Несмотря на то, что поверхность исторического моря казалась неподвижною, так же непрерывно, как движение времени, двигалось человечество. Слагались, разлагались различные группы людских сцеплений; подготовлялись причины образования и разложения государств, перемещений народов.
Историческое море, не как прежде, направлялось порывами от одного берега к другому: оно бурлило в глубине. Исторические лица, не как прежде, носились волнами от одного берега к другому; теперь они, казалось, кружились на одном месте. Исторические лица, прежде во главе войск отражавшие приказаниями войн, походов, сражений движение масс, теперь отражали бурлившее движение политическими и дипломатическими соображениями, законами, трактатами…
Эту деятельность исторических лиц историки называют реакцией.
Описывая деятельность этих исторических лиц, бывших, по их мнению, причиною того, что они называют реакцией, историки строго осуждают их. Все известные люди того времени, от Александра и Наполеона до m me Stael, Фотия, Шеллинга, Фихте, Шатобриана и проч., проходят перед их строгим судом и оправдываются или осуждаются, смотря по тому, содействовали ли они прогрессу или реакции.
В России, по их описанию, в этот период времени тоже происходила реакция, и главным виновником этой реакции был Александр I – тот самый Александр I, который, по их же описаниям, был главным виновником либеральных начинаний своего царствования и спасения России.
В настоящей русской литературе, от гимназиста до ученого историка, нет человека, который не бросил бы своего камушка в Александра I за неправильные поступки его в этот период царствования.
«Он должен был поступить так то и так то. В таком случае он поступил хорошо, в таком дурно. Он прекрасно вел себя в начале царствования и во время 12 го года; но он поступил дурно, дав конституцию Польше, сделав Священный Союз, дав власть Аракчееву, поощряя Голицына и мистицизм, потом поощряя Шишкова и Фотия. Он сделал дурно, занимаясь фронтовой частью армии; он поступил дурно, раскассировав Семеновский полк, и т. д.».
Надо бы исписать десять листов для того, чтобы перечислить все те упреки, которые делают ему историки на основании того знания блага человечества, которым они обладают.
Что значат эти упреки?
Те самые поступки, за которые историки одобряют Александра I, – как то: либеральные начинания царствования, борьба с Наполеоном, твердость, выказанная им в 12 м году, и поход 13 го года, не вытекают ли из одних и тех же источников – условий крови, воспитания, жизни, сделавших личность Александра тем, чем она была, – из которых вытекают и те поступки, за которые историки порицают его, как то: Священный Союз, восстановление Польши, реакция 20 х годов?
В чем же состоит сущность этих упреков?
В том, что такое историческое лицо, как Александр I, лицо, стоявшее на высшей возможной ступени человеческой власти, как бы в фокусе ослепляющего света всех сосредоточивающихся на нем исторических лучей; лицо, подлежавшее тем сильнейшим в мире влияниям интриг, обманов, лести, самообольщения, которые неразлучны с властью; лицо, чувствовавшее на себе, всякую минуту своей жизни, ответственность за все совершавшееся в Европе, и лицо не выдуманное, а живое, как и каждый человек, с своими личными привычками, страстями, стремлениями к добру, красоте, истине, – что это лицо, пятьдесят лет тому назад, не то что не было добродетельно (за это историки не упрекают), а не имело тех воззрений на благо человечества, которые имеет теперь профессор, смолоду занимающийся наукой, то есть читанном книжек, лекций и списыванием этих книжек и лекций в одну тетрадку.
Но если даже предположить, что Александр I пятьдесят лет тому назад ошибался в своем воззрении на то, что есть благо народов, невольно должно предположить, что и историк, судящий Александра, точно так же по прошествии некоторого времени окажется несправедливым, в своем воззрении на то, что есть благо человечества. Предположение это тем более естественно и необходимо, что, следя за развитием истории, мы видим, что с каждым годом, с каждым новым писателем изменяется воззрение на то, что есть благо человечества; так что то, что казалось благом, через десять лет представляется злом; и наоборот. Мало того, одновременно мы находим в истории совершенно противоположные взгляды на то, что было зло и что было благо: одни данную Польше конституцию и Священный Союз ставят в заслугу, другие в укор Александру.
Про деятельность Александра и Наполеона нельзя сказать, чтобы она была полезна или вредна, ибо мы не можем сказать, для чего она полезна и для чего вредна. Если деятельность эта кому нибудь не нравится, то она не нравится ему только вследствие несовпадения ее с ограниченным пониманием его о том, что есть благо. Представляется ли мне благом сохранение в 12 м году дома моего отца в Москве, или слава русских войск, или процветание Петербургского и других университетов, или свобода Польши, или могущество России, или равновесие Европы, или известного рода европейское просвещение – прогресс, я должен признать, что деятельность всякого исторического лица имела, кроме этих целей, ещь другие, более общие и недоступные мне цели.
Но положим, что так называемая наука имеет возможность примирить все противоречия и имеет для исторических лиц и событий неизменное мерило хорошего и дурного.
Положим, что Александр мог сделать все иначе. Положим, что он мог, по предписанию тех, которые обвиняют его, тех, которые профессируют знание конечной цели движения человечества, распорядиться по той программе народности, свободы, равенства и прогресса (другой, кажется, нет), которую бы ему дали теперешние обвинители. Положим, что эта программа была бы возможна и составлена и что Александр действовал бы по ней. Что же сталось бы тогда с деятельностью всех тех людей, которые противодействовали тогдашнему направлению правительства, – с деятельностью, которая, по мнению историков, хороша и полезна? Деятельности бы этой не было; жизни бы не было; ничего бы не было.
Если допустить, что жизнь человеческая может управляться разумом, – то уничтожится возможность жизни.


Если допустить, как то делают историки, что великие люди ведут человечество к достижению известных целей, состоящих или в величии России или Франции, или в равновесии Европы, или в разнесении идей революции, или в общем прогрессе, или в чем бы то ни было, то невозможно объяснить явлений истории без понятий о случае и о гении.
Если цель европейских войн начала нынешнего столетия состояла в величии России, то эта цель могла быть достигнута без всех предшествовавших войн и без нашествия. Если цель – величие Франции, то эта цель могла быть достигнута и без революции, и без империи. Если цель – распространение идей, то книгопечатание исполнило бы это гораздо лучше, чем солдаты. Если цель – прогресс цивилизации, то весьма легко предположить, что, кроме истребления людей и их богатств, есть другие более целесообразные пути для распространения цивилизации.
Почему же это случилось так, а не иначе?
Потому что это так случилось. «Случай сделал положение; гений воспользовался им», – говорит история.
Но что такое случай? Что такое гений?
Слова случай и гений не обозначают ничего действительно существующего и потому не могут быть определены. Слова эти только обозначают известную степень понимания явлений. Я не знаю, почему происходит такое то явление; думаю, что не могу знать; потому не хочу знать и говорю: случай. Я вижу силу, производящую несоразмерное с общечеловеческими свойствами действие; не понимаю, почему это происходит, и говорю: гений.
Для стада баранов тот баран, который каждый вечер отгоняется овчаром в особый денник к корму и становится вдвое толще других, должен казаться гением. И то обстоятельство, что каждый вечер именно этот самый баран попадает не в общую овчарню, а в особый денник к овсу, и что этот, именно этот самый баран, облитый жиром, убивается на мясо, должно представляться поразительным соединением гениальности с целым рядом необычайных случайностей.
Но баранам стоит только перестать думать, что все, что делается с ними, происходит только для достижения их бараньих целей; стоит допустить, что происходящие с ними события могут иметь и непонятные для них цели, – и они тотчас же увидят единство, последовательность в том, что происходит с откармливаемым бараном. Ежели они и не будут знать, для какой цели он откармливался, то, по крайней мере, они будут знать, что все случившееся с бараном случилось не нечаянно, и им уже не будет нужды в понятии ни о случае, ни о гении.
Только отрешившись от знаний близкой, понятной цели и признав, что конечная цель нам недоступна, мы увидим последовательность и целесообразность в жизни исторических лиц; нам откроется причина того несоразмерного с общечеловеческими свойствами действия, которое они производят, и не нужны будут нам слова случай и гений.
Стоит только признать, что цель волнений европейских народов нам неизвестна, а известны только факты, состоящие в убийствах, сначала во Франции, потом в Италии, в Африке, в Пруссии, в Австрии, в Испании, в России, и что движения с запада на восток и с востока на запад составляют сущность и цель этих событий, и нам не только не нужно будет видеть исключительность и гениальность в характерах Наполеона и Александра, но нельзя будет представить себе эти лица иначе, как такими же людьми, как и все остальные; и не только не нужно будет объяснять случайностию тех мелких событий, которые сделали этих людей тем, чем они были, но будет ясно, что все эти мелкие события были необходимы.
Отрешившись от знания конечной цели, мы ясно поймем, что точно так же, как ни к одному растению нельзя придумать других, более соответственных ему, цвета и семени, чем те, которые оно производит, точно так же невозможно придумать других двух людей, со всем их прошедшим, которое соответствовало бы до такой степени, до таких мельчайших подробностей тому назначению, которое им предлежало исполнить.


Основной, существенный смысл европейских событий начала нынешнего столетия есть воинственное движение масс европейских народов с запада на восток и потом с востока на запад. Первым зачинщиком этого движения было движение с запада на восток. Для того чтобы народы запада могли совершить то воинственное движение до Москвы, которое они совершили, необходимо было: 1) чтобы они сложились в воинственную группу такой величины, которая была бы в состоянии вынести столкновение с воинственной группой востока; 2) чтобы они отрешились от всех установившихся преданий и привычек и 3) чтобы, совершая свое воинственное движение, они имели во главе своей человека, который, и для себя и для них, мог бы оправдывать имеющие совершиться обманы, грабежи и убийства, которые сопутствовали этому движению.
И начиная с французской революции разрушается старая, недостаточно великая группа; уничтожаются старые привычки и предания; вырабатываются, шаг за шагом, группа новых размеров, новые привычки и предания, и приготовляется тот человек, который должен стоять во главе будущего движения и нести на себе всю ответственность имеющего совершиться.
Человек без убеждений, без привычек, без преданий, без имени, даже не француз, самыми, кажется, странными случайностями продвигается между всеми волнующими Францию партиями и, не приставая ни к одной из них, выносится на заметное место.
Невежество сотоварищей, слабость и ничтожество противников, искренность лжи и блестящая и самоуверенная ограниченность этого человека выдвигают его во главу армии. Блестящий состав солдат итальянской армии, нежелание драться противников, ребяческая дерзость и самоуверенность приобретают ему военную славу. Бесчисленное количество так называемых случайностей сопутствует ему везде. Немилость, в которую он впадает у правителей Франции, служит ему в пользу. Попытки его изменить предназначенный ему путь не удаются: его не принимают на службу в Россию, и не удается ему определение в Турцию. Во время войн в Италии он несколько раз находится на краю гибели и всякий раз спасается неожиданным образом. Русские войска, те самые, которые могут разрушить его славу, по разным дипломатическим соображениям, не вступают в Европу до тех пор, пока он там.
По возвращении из Италии он находит правительство в Париже в том процессе разложения, в котором люди, попадающие в это правительство, неизбежно стираются и уничтожаются. И сам собой для него является выход из этого опасного положения, состоящий в бессмысленной, беспричинной экспедиции в Африку. Опять те же так называемые случайности сопутствуют ему. Неприступная Мальта сдается без выстрела; самые неосторожные распоряжения увенчиваются успехом. Неприятельский флот, который не пропустит после ни одной лодки, пропускает целую армию. В Африке над безоружными почти жителями совершается целый ряд злодеяний. И люди, совершающие злодеяния эти, и в особенности их руководитель, уверяют себя, что это прекрасно, что это слава, что это похоже на Кесаря и Александра Македонского и что это хорошо.
Тот идеал славы и величия, состоящий в том, чтобы не только ничего не считать для себя дурным, но гордиться всяким своим преступлением, приписывая ему непонятное сверхъестественное значение, – этот идеал, долженствующий руководить этим человеком и связанными с ним людьми, на просторе вырабатывается в Африке. Все, что он ни делает, удается ему. Чума не пристает к нему. Жестокость убийства пленных не ставится ему в вину. Ребячески неосторожный, беспричинный и неблагородный отъезд его из Африки, от товарищей в беде, ставится ему в заслугу, и опять неприятельский флот два раза упускает его. В то время как он, уже совершенно одурманенный совершенными им счастливыми преступлениями, готовый для своей роли, без всякой цели приезжает в Париж, то разложение республиканского правительства, которое могло погубить его год тому назад, теперь дошло до крайней степени, и присутствие его, свежего от партий человека, теперь только может возвысить его.
Он не имеет никакого плана; он всего боится; но партии ухватываются за него и требуют его участия.
Он один, с своим выработанным в Италии и Египте идеалом славы и величия, с своим безумием самообожания, с своею дерзостью преступлений, с своею искренностью лжи, – он один может оправдать то, что имеет совершиться.
Он нужен для того места, которое ожидает его, и потому, почти независимо от его воли и несмотря на его нерешительность, на отсутствие плана, на все ошибки, которые он делает, он втягивается в заговор, имеющий целью овладение властью, и заговор увенчивается успехом.
Его вталкивают в заседание правителей. Испуганный, он хочет бежать, считая себя погибшим; притворяется, что падает в обморок; говорит бессмысленные вещи, которые должны бы погубить его. Но правители Франции, прежде сметливые и гордые, теперь, чувствуя, что роль их сыграна, смущены еще более, чем он, говорят не те слова, которые им нужно бы было говорить, для того чтоб удержать власть и погубить его.
Случайность, миллионы случайностей дают ему власть, и все люди, как бы сговорившись, содействуют утверждению этой власти. Случайности делают характеры тогдашних правителей Франции, подчиняющимися ему; случайности делают характер Павла I, признающего его власть; случайность делает против него заговор, не только не вредящий ему, но утверждающий его власть. Случайность посылает ему в руки Энгиенского и нечаянно заставляет его убить, тем самым, сильнее всех других средств, убеждая толпу, что он имеет право, так как он имеет силу. Случайность делает то, что он напрягает все силы на экспедицию в Англию, которая, очевидно, погубила бы его, и никогда не исполняет этого намерения, а нечаянно нападает на Мака с австрийцами, которые сдаются без сражения. Случайность и гениальность дают ему победу под Аустерлицем, и случайно все люди, не только французы, но и вся Европа, за исключением Англии, которая и не примет участия в имеющих совершиться событиях, все люди, несмотря на прежний ужас и отвращение к его преступлениям, теперь признают за ним его власть, название, которое он себе дал, и его идеал величия и славы, который кажется всем чем то прекрасным и разумным.
Как бы примериваясь и приготовляясь к предстоящему движению, силы запада несколько раз в 1805 м, 6 м, 7 м, 9 м году стремятся на восток, крепчая и нарастая. В 1811 м году группа людей, сложившаяся во Франции, сливается в одну огромную группу с серединными народами. Вместе с увеличивающейся группой людей дальше развивается сила оправдания человека, стоящего во главе движения. В десятилетний приготовительный период времени, предшествующий большому движению, человек этот сводится со всеми коронованными лицами Европы. Разоблаченные владыки мира не могут противопоставить наполеоновскому идеалу славы и величия, не имеющего смысла, никакого разумного идеала. Один перед другим, они стремятся показать ему свое ничтожество. Король прусский посылает свою жену заискивать милости великого человека; император Австрии считает за милость то, что человек этот принимает в свое ложе дочь кесарей; папа, блюститель святыни народов, служит своей религией возвышению великого человека. Не столько сам Наполеон приготовляет себя для исполнения своей роли, сколько все окружающее готовит его к принятию на себя всей ответственности того, что совершается и имеет совершиться. Нет поступка, нет злодеяния или мелочного обмана, который бы он совершил и который тотчас же в устах его окружающих не отразился бы в форме великого деяния. Лучший праздник, который могут придумать для него германцы, – это празднование Иены и Ауерштета. Не только он велик, но велики его предки, его братья, его пасынки, зятья. Все совершается для того, чтобы лишить его последней силы разума и приготовить к его страшной роли. И когда он готов, готовы и силы.
Нашествие стремится на восток, достигает конечной цели – Москвы. Столица взята; русское войско более уничтожено, чем когда нибудь были уничтожены неприятельские войска в прежних войнах от Аустерлица до Ваграма. Но вдруг вместо тех случайностей и гениальности, которые так последовательно вели его до сих пор непрерывным рядом успехов к предназначенной цели, является бесчисленное количество обратных случайностей, от насморка в Бородине до морозов и искры, зажегшей Москву; и вместо гениальности являются глупость и подлость, не имеющие примеров.
Нашествие бежит, возвращается назад, опять бежит, и все случайности постоянно теперь уже не за, а против него.
Совершается противодвижение с востока на запад с замечательным сходством с предшествовавшим движением с запада на восток. Те же попытки движения с востока на запад в 1805 – 1807 – 1809 годах предшествуют большому движению; то же сцепление и группу огромных размеров; то же приставание серединных народов к движению; то же колебание в середине пути и та же быстрота по мере приближения к цели.
Париж – крайняя цель достигнута. Наполеоновское правительство и войска разрушены. Сам Наполеон не имеет больше смысла; все действия его очевидно жалки и гадки; но опять совершается необъяснимая случайность: союзники ненавидят Наполеона, в котором они видят причину своих бедствий; лишенный силы и власти, изобличенный в злодействах и коварствах, он бы должен был представляться им таким, каким он представлялся им десять лет тому назад и год после, – разбойником вне закона. Но по какой то странной случайности никто не видит этого. Роль его еще не кончена. Человека, которого десять лет тому назад и год после считали разбойником вне закона, посылают в два дня переезда от Франции на остров, отдаваемый ему во владение с гвардией и миллионами, которые платят ему за что то.


Движение народов начинает укладываться в свои берега. Волны большого движения отхлынули, и на затихшем море образуются круги, по которым носятся дипломаты, воображая, что именно они производят затишье движения.
Но затихшее море вдруг поднимается. Дипломатам кажется, что они, их несогласия, причиной этого нового напора сил; они ждут войны между своими государями; положение им кажется неразрешимым. Но волна, подъем которой они чувствуют, несется не оттуда, откуда они ждут ее. Поднимается та же волна, с той же исходной точки движения – Парижа. Совершается последний отплеск движения с запада; отплеск, который должен разрешить кажущиеся неразрешимыми дипломатические затруднения и положить конец воинственному движению этого периода.
Человек, опустошивший Францию, один, без заговора, без солдат, приходит во Францию. Каждый сторож может взять его; но, по странной случайности, никто не только не берет, но все с восторгом встречают того человека, которого проклинали день тому назад и будут проклинать через месяц.
Человек этот нужен еще для оправдания последнего совокупного действия.
Действие совершено. Последняя роль сыграна. Актеру велено раздеться и смыть сурьму и румяны: он больше не понадобится.
И проходят несколько лет в том, что этот человек, в одиночестве на своем острове, играет сам перед собой жалкую комедию, мелочно интригует и лжет, оправдывая свои деяния, когда оправдание это уже не нужно, и показывает всему миру, что такое было то, что люди принимали за силу, когда невидимая рука водила им.
Распорядитель, окончив драму и раздев актера, показал его нам.
– Смотрите, чему вы верили! Вот он! Видите ли вы теперь, что не он, а Я двигал вас?
Но, ослепленные силой движения, люди долго не понимали этого.
Еще большую последовательность и необходимость представляет жизнь Александра I, того лица, которое стояло во главе противодвижения с востока на запад.
Что нужно для того человека, который бы, заслоняя других, стоял во главе этого движения с востока на запад?
Нужно чувство справедливости, участие к делам Европы, но отдаленное, не затемненное мелочными интересами; нужно преобладание высоты нравственной над сотоварищами – государями того времени; нужна кроткая и привлекательная личность; нужно личное оскорбление против Наполеона. И все это есть в Александре I; все это подготовлено бесчисленными так называемыми случайностями всей его прошедшей жизни: и воспитанием, и либеральными начинаниями, и окружающими советниками, и Аустерлицем, и Тильзитом, и Эрфуртом.
Во время народной войны лицо это бездействует, так как оно не нужно. Но как скоро является необходимость общей европейской войны, лицо это в данный момент является на свое место и, соединяя европейские народы, ведет их к цели.
Цель достигнута. После последней войны 1815 года Александр находится на вершине возможной человеческой власти. Как же он употребляет ее?
Александр I, умиротворитель Европы, человек, с молодых лет стремившийся только к благу своих народов, первый зачинщик либеральных нововведений в своем отечестве, теперь, когда, кажется, он владеет наибольшей властью и потому возможностью сделать благо своих народов, в то время как Наполеон в изгнании делает детские и лживые планы о том, как бы он осчастливил человечество, если бы имел власть, Александр I, исполнив свое призвание и почуяв на себе руку божию, вдруг признает ничтожность этой мнимой власти, отворачивается от нее, передает ее в руки презираемых им и презренных людей и говорит только:
– «Не нам, не нам, а имени твоему!» Я человек тоже, как и вы; оставьте меня жить, как человека, и думать о своей душе и о боге.

Как солнце и каждый атом эфира есть шар, законченный в самом себе и вместе с тем только атом недоступного человеку по огромности целого, – так и каждая личность носит в самой себе свои цели и между тем носит их для того, чтобы служить недоступным человеку целям общим.
Пчела, сидевшая на цветке, ужалила ребенка. И ребенок боится пчел и говорит, что цель пчелы состоит в том, чтобы жалить людей. Поэт любуется пчелой, впивающейся в чашечку цветка, и говорит, цель пчелы состоит во впивании в себя аромата цветов. Пчеловод, замечая, что пчела собирает цветочную пыль к приносит ее в улей, говорит, что цель пчелы состоит в собирании меда. Другой пчеловод, ближе изучив жизнь роя, говорит, что пчела собирает пыль для выкармливанья молодых пчел и выведения матки, что цель ее состоит в продолжении рода. Ботаник замечает, что, перелетая с пылью двудомного цветка на пестик, пчела оплодотворяет его, и ботаник в этом видит цель пчелы. Другой, наблюдая переселение растений, видит, что пчела содействует этому переселению, и этот новый наблюдатель может сказать, что в этом состоит цель пчелы. Но конечная цель пчелы не исчерпывается ни тою, ни другой, ни третьей целью, которые в состоянии открыть ум человеческий. Чем выше поднимается ум человеческий в открытии этих целей, тем очевиднее для него недоступность конечной цели.
Человеку доступно только наблюдение над соответственностью жизни пчелы с другими явлениями жизни. То же с целями исторических лиц и народов.


Свадьба Наташи, вышедшей в 13 м году за Безухова, было последнее радостное событие в старой семье Ростовых. В тот же год граф Илья Андреевич умер, и, как это всегда бывает, со смертью его распалась старая семья.
События последнего года: пожар Москвы и бегство из нее, смерть князя Андрея и отчаяние Наташи, смерть Пети, горе графини – все это, как удар за ударом, падало на голову старого графа. Он, казалось, не понимал и чувствовал себя не в силах понять значение всех этих событий и, нравственно согнув свою старую голову, как будто ожидал и просил новых ударов, которые бы его покончили. Он казался то испуганным и растерянным, то неестественно оживленным и предприимчивым.
Свадьба Наташи на время заняла его своей внешней стороной. Он заказывал обеды, ужины и, видимо, хотел казаться веселым; но веселье его не сообщалось, как прежде, а, напротив, возбуждало сострадание в людях, знавших и любивших его.
После отъезда Пьера с женой он затих и стал жаловаться на тоску. Через несколько дней он заболел и слег в постель. С первых дней его болезни, несмотря на утешения докторов, он понял, что ему не вставать. Графиня, не раздеваясь, две недели провела в кресле у его изголовья. Всякий раз, как она давала ему лекарство, он, всхлипывая, молча целовал ее руку. В последний день он, рыдая, просил прощения у жены и заочно у сына за разорение именья – главную вину, которую он за собой чувствовал. Причастившись и особоровавшись, он тихо умер, и на другой день толпа знакомых, приехавших отдать последний долг покойнику, наполняла наемную квартиру Ростовых. Все эти знакомые, столько раз обедавшие и танцевавшие у него, столько раз смеявшиеся над ним, теперь все с одинаковым чувством внутреннего упрека и умиления, как бы оправдываясь перед кем то, говорили: «Да, там как бы то ни было, а прекрасжейший был человек. Таких людей нынче уж не встретишь… А у кого ж нет своих слабостей?..»
Именно в то время, когда дела графа так запутались, что нельзя было себе представить, чем это все кончится, если продолжится еще год, он неожиданно умер.
Николай был с русскими войсками в Париже, когда к нему пришло известие о смерти отца. Он тотчас же подал в отставку и, не дожидаясь ее, взял отпуск и приехал в Москву. Положение денежных дел через месяц после смерти графа совершенно обозначилось, удивив всех громадностию суммы разных мелких долгов, существования которых никто и не подозревал. Долгов было вдвое больше, чем имения.
Родные и друзья советовали Николаю отказаться от наследства. Но Николай в отказе от наследства видел выражение укора священной для него памяти отца и потому не хотел слышать об отказе и принял наследство с обязательством уплаты долгов.
Кредиторы, так долго молчавшие, будучи связаны при жизни графа тем неопределенным, но могучим влиянием, которое имела на них его распущенная доброта, вдруг все подали ко взысканию. Явилось, как это всегда бывает, соревнование – кто прежде получит, – и те самые люди, которые, как Митенька и другие, имели безденежные векселя – подарки, явились теперь самыми требовательными кредиторами. Николаю не давали ни срока, ни отдыха, и те, которые, по видимому, жалели старика, бывшего виновником их потери (если были потери), теперь безжалостно накинулись на очевидно невинного перед ними молодого наследника, добровольно взявшего на себя уплату.
Ни один из предполагаемых Николаем оборотов не удался; имение с молотка было продано за полцены, а половина долгов оставалась все таки не уплаченною. Николай взял предложенные ему зятем Безуховым тридцать тысяч для уплаты той части долгов, которые он признавал за денежные, настоящие долги. А чтобы за оставшиеся долги не быть посаженным в яму, чем ему угрожали кредиторы, он снова поступил на службу.
Ехать в армию, где он был на первой вакансии полкового командира, нельзя было потому, что мать теперь держалась за сына, как за последнюю приманку жизни; и потому, несмотря на нежелание оставаться в Москве в кругу людей, знавших его прежде, несмотря на свое отвращение к статской службе, он взял в Москве место по статской части и, сняв любимый им мундир, поселился с матерью и Соней на маленькой квартире, на Сивцевом Вражке.
Наташа и Пьер жили в это время в Петербурге, не имея ясного понятия о положении Николая. Николай, заняв у зятя деньги, старался скрыть от него свое бедственное положение. Положение Николая было особенно дурно потому, что своими тысячью двумястами рублями жалованья он не только должен был содержать себя, Соню и мать, но он должен был содержать мать так, чтобы она не замечала, что они бедны. Графиня не могла понять возможности жизни без привычных ей с детства условий роскоши и беспрестанно, не понимая того, как это трудно было для сына, требовала то экипажа, которого у них не было, чтобы послать за знакомой, то дорогого кушанья для себя и вина для сына, то денег, чтобы сделать подарок сюрприз Наташе, Соне и тому же Николаю.
Соня вела домашнее хозяйство, ухаживала за теткой, читала ей вслух, переносила ее капризы и затаенное нерасположение и помогала Николаю скрывать от старой графини то положение нужды, в котором они находились. Николай чувствовал себя в неоплатном долгу благодарности перед Соней за все, что она делала для его матери, восхищался ее терпением и преданностью, но старался отдаляться от нее.
Он в душе своей как будто упрекал ее за то, что она была слишком совершенна, и за то, что не в чем было упрекать ее. В ней было все, за что ценят людей; но было мало того, что бы заставило его любить ее. И он чувствовал, что чем больше он ценит, тем меньше любит ее. Он поймал ее на слове, в ее письме, которым она давала ему свободу, и теперь держал себя с нею так, как будто все то, что было между ними, уже давным давно забыто и ни в каком случае не может повториться.
Положение Николая становилось хуже и хуже. Мысль о том, чтобы откладывать из своего жалованья, оказалась мечтою. Он не только не откладывал, но, удовлетворяя требования матери, должал по мелочам. Выхода из его положения ему не представлялось никакого. Мысль о женитьбе на богатой наследнице, которую ему предлагали его родственницы, была ему противна. Другой выход из его положения – смерть матери – никогда не приходила ему в голову. Он ничего не желал, ни на что не надеялся; и в самой глубине души испытывал мрачное и строгое наслаждение в безропотном перенесении своего положения. Он старался избегать прежних знакомых с их соболезнованием и предложениями оскорбительной помощи, избегал всякого рассеяния и развлечения, даже дома ничем не занимался, кроме раскладывания карт с своей матерью, молчаливыми прогулками по комнате и курением трубки за трубкой. Он как будто старательно соблюдал в себе то мрачное настроение духа, в котором одном он чувствовал себя в состоянии переносить свое положение.


В начале зимы княжна Марья приехала в Москву. Из городских слухов она узнала о положении Ростовых и о том, как «сын жертвовал собой для матери», – так говорили в городе.
«Я и не ожидала от него другого», – говорила себе княжна Марья, чувствуя радостное подтверждение своей любви к нему. Вспоминая свои дружеские и почти родственные отношения ко всему семейству, она считала своей обязанностью ехать к ним. Но, вспоминая свои отношения к Николаю в Воронеже, она боялась этого. Сделав над собой большое усилие, она, однако, через несколько недель после своего приезда в город приехала к Ростовым.
Николай первый встретил ее, так как к графине можно было проходить только через его комнату. При первом взгляде на нее лицо Николая вместо выражения радости, которую ожидала увидать на нем княжна Марья, приняло невиданное прежде княжной выражение холодности, сухости и гордости. Николай спросил о ее здоровье, проводил к матери и, посидев минут пять, вышел из комнаты.
Когда княжна выходила от графини, Николай опять встретил ее и особенно торжественно и сухо проводил до передней. Он ни слова не ответил на ее замечания о здоровье графини. «Вам какое дело? Оставьте меня в покое», – говорил его взгляд.
– И что шляется? Чего ей нужно? Терпеть не могу этих барынь и все эти любезности! – сказал он вслух при Соне, видимо не в силах удерживать свою досаду, после того как карета княжны отъехала от дома.
– Ах, как можно так говорить, Nicolas! – сказала Соня, едва скрывая свою радость. – Она такая добрая, и maman так любит ее.
Николай ничего не отвечал и хотел бы вовсе не говорить больше о княжне. Но со времени ее посещения старая графиня всякий день по нескольку раз заговаривала о ней.
Графиня хвалила ее, требовала, чтобы сын съездил к ней, выражала желание видеть ее почаще, но вместе с тем всегда становилась не в духе, когда она о ней говорила.
Николай старался молчать, когда мать говорила о княжне, но молчание его раздражало графиню.
– Она очень достойная и прекрасная девушка, – говорила она, – и тебе надо к ней съездить. Все таки ты увидишь кого нибудь; а то тебе скука, я думаю, с нами.
– Да я нисколько не желаю, маменька.
– То хотел видеть, а теперь не желаю. Я тебя, мой милый, право, не понимаю. То тебе скучно, то ты вдруг никого не хочешь видеть.
– Да я не говорил, что мне скучно.
– Как же, ты сам сказал, что ты и видеть ее не желаешь. Она очень достойная девушка и всегда тебе нравилась; а теперь вдруг какие то резоны. Всё от меня скрывают.
– Да нисколько, маменька.
– Если б я тебя просила сделать что нибудь неприятное, а то я тебя прошу съездить отдать визит. Кажется, и учтивость требует… Я тебя просила и теперь больше не вмешиваюсь, когда у тебя тайны от матери.
– Да я поеду, если вы хотите.
– Мне все равно; я для тебя желаю.
Николай вздыхал, кусая усы, и раскладывал карты, стараясь отвлечь внимание матери на другой предмет.
На другой, на третий и на четвертый день повторялся тот же и тот же разговор.
После своего посещения Ростовых и того неожиданного, холодного приема, сделанного ей Николаем, княжна Марья призналась себе, что она была права, не желая ехать первая к Ростовым.
«Я ничего и не ожидала другого, – говорила она себе, призывая на помощь свою гордость. – Мне нет никакого дела до него, и я только хотела видеть старушку, которая была всегда добра ко мне и которой я многим обязана».
Но она не могла успокоиться этими рассуждениями: чувство, похожее на раскаяние, мучило ее, когда она вспоминала свое посещение. Несмотря на то, что она твердо решилась не ездить больше к Ростовым и забыть все это, она чувствовала себя беспрестанно в неопределенном положении. И когда она спрашивала себя, что же такое было то, что мучило ее, она должна была признаваться, что это были ее отношения к Ростову. Его холодный, учтивый тон не вытекал из его чувства к ней (она это знала), а тон этот прикрывал что то. Это что то ей надо было разъяснить; и до тех пор она чувствовала, что не могла быть покойна.
В середине зимы она сидела в классной, следя за уроками племянника, когда ей пришли доложить о приезде Ростова. С твердым решением не выдавать своей тайны и не выказать своего смущения она пригласила m lle Bourienne и с ней вместе вышла в гостиную.
При первом взгляде на лицо Николая она увидала, что он приехал только для того, чтобы исполнить долг учтивости, и решилась твердо держаться в том самом тоне, в котором он обратится к ней.
Они заговорили о здоровье графини, об общих знакомых, о последних новостях войны, и когда прошли те требуемые приличием десять минут, после которых гость может встать, Николай поднялся, прощаясь.
Княжна с помощью m lle Bourienne выдержала разговор очень хорошо; но в самую последнюю минуту, в то время как он поднялся, она так устала говорить о том, до чего ей не было дела, и мысль о том, за что ей одной так мало дано радостей в жизни, так заняла ее, что она в припадке рассеянности, устремив вперед себя свои лучистые глаза, сидела неподвижно, не замечая, что он поднялся.
Николай посмотрел на нее и, желая сделать вид, что он не замечает ее рассеянности, сказал несколько слов m lle Bourienne и опять взглянул на княжну. Она сидела так же неподвижно, и на нежном лице ее выражалось страдание. Ему вдруг стало жалко ее и смутно представилось, что, может быть, он был причиной той печали, которая выражалась на ее лице. Ему захотелось помочь ей, сказать ей что нибудь приятное; но он не мог придумать, что бы сказать ей.
– Прощайте, княжна, – сказал он. Она опомнилась, вспыхнула и тяжело вздохнула.
– Ах, виновата, – сказала она, как бы проснувшись. – Вы уже едете, граф; ну, прощайте! А подушку графине?
– Постойте, я сейчас принесу ее, – сказала m lle Bourienne и вышла из комнаты.
Оба молчали, изредка взглядывая друг на друга.
– Да, княжна, – сказал, наконец, Николай, грустно улыбаясь, – недавно кажется, а сколько воды утекло с тех пор, как мы с вами в первый раз виделись в Богучарове. Как мы все казались в несчастии, – а я бы дорого дал, чтобы воротить это время… да не воротишь.
Княжна пристально глядела ему в глаза своим лучистым взглядом, когда он говорил это. Она как будто старалась понять тот тайный смысл его слов, который бы объяснил ей его чувство к ней.
– Да, да, – сказала она, – но вам нечего жалеть прошедшего, граф. Как я понимаю вашу жизнь теперь, вы всегда с наслаждением будете вспоминать ее, потому что самоотвержение, которым вы живете теперь…
– Я не принимаю ваших похвал, – перебил он ее поспешно, – напротив, я беспрестанно себя упрекаю; но это совсем неинтересный и невеселый разговор.
И опять взгляд его принял прежнее сухое и холодное выражение. Но княжна уже увидала в нем опять того же человека, которого она знала и любила, и говорила теперь только с этим человеком.
– Я думала, что вы позволите мне сказать вам это, – сказала она. – Мы так сблизились с вами… и с вашим семейством, и я думала, что вы не почтете неуместным мое участие; но я ошиблась, – сказала она. Голос ее вдруг дрогнул. – Я не знаю почему, – продолжала она, оправившись, – вы прежде были другой и…
– Есть тысячи причин почему (он сделал особое ударение на слово почему). Благодарю вас, княжна, – сказал он тихо. – Иногда тяжело.
«Так вот отчего! Вот отчего! – говорил внутренний голос в душе княжны Марьи. – Нет, я не один этот веселый, добрый и открытый взгляд, не одну красивую внешность полюбила в нем; я угадала его благородную, твердую, самоотверженную душу, – говорила она себе. – Да, он теперь беден, а я богата… Да, только от этого… Да, если б этого не было…» И, вспоминая прежнюю его нежность и теперь глядя на его доброе и грустное лицо, она вдруг поняла причину его холодности.
– Почему же, граф, почему? – вдруг почти вскрикнула она невольно, подвигаясь к нему. – Почему, скажите мне? Вы должны сказать. – Он молчал. – Я не знаю, граф, вашего почему, – продолжала она. – Но мне тяжело, мне… Я признаюсь вам в этом. Вы за что то хотите лишить меня прежней дружбы. И мне это больно. – У нее слезы были в глазах и в голосе. – У меня так мало было счастия в жизни, что мне тяжела всякая потеря… Извините меня, прощайте. – Она вдруг заплакала и пошла из комнаты.
– Княжна! постойте, ради бога, – вскрикнул он, стараясь остановить ее. – Княжна!
Она оглянулась. Несколько секунд они молча смотрели в глаза друг другу, и далекое, невозможное вдруг стало близким, возможным и неизбежным.
……


Осенью 1814 го года Николай женился на княжне Марье и с женой, матерью и Соней переехал на житье в Лысые Горы.
В три года он, не продавая именья жены, уплатил оставшиеся долги и, получив небольшое наследство после умершей кузины, заплатил и долг Пьеру.
Еще через три года, к 1820 му году, Николай так устроил свои денежные дела, что прикупил небольшое именье подле Лысых Гор и вел переговоры о выкупе отцовского Отрадного, что составляло его любимую мечту.
Начав хозяйничать по необходимости, он скоро так пристрастился к хозяйству, что оно сделалось для него любимым и почти исключительным занятием. Николай был хозяин простой, не любил нововведений, в особенности английских, которые входили тогда в моду, смеялся над теоретическими сочинениями о хозяйстве, не любил заводов, дорогих производств, посевов дорогих хлебов и вообще не занимался отдельно ни одной частью хозяйства. У него перед глазами всегда было только одно именье, а не какая нибудь отдельная часть его. В именье же главным предметом был не азот и не кислород, находящиеся в почве и воздухе, не особенный плуг и назем, а то главное орудие, чрез посредство которого действует и азот, и кислород, и назем, и плуг – то есть работник мужик. Когда Николай взялся за хозяйство и стал вникать в различные его части, мужик особенно привлек к себе его внимание; мужик представлялся ему не только орудием, но и целью и судьею. Он сначала всматривался в мужика, стараясь понять, что ему нужно, что он считает дурным и хорошим, и только притворялся, что распоряжается и приказывает, в сущности же только учился у мужиков и приемам, и речам, и суждениям о том, что хорошо и что дурно. И только тогда, когда понял вкусы и стремления мужика, научился говорить его речью и понимать тайный смысл его речи, когда почувствовал себя сроднившимся с ним, только тогда стал он смело управлять им, то есть исполнять по отношению к мужикам ту самую должность, исполнение которой от него требовалось. И хозяйство Николая приносило самые блестящие результаты.
Принимая в управление имение, Николай сразу, без ошибки, по какому то дару прозрения, назначал бурмистром, старостой, выборным тех самых людей, которые были бы выбраны самими мужиками, если б они могли выбирать, и начальники его никогда не переменялись. Прежде чем исследовать химические свойства навоза, прежде чем вдаваться в дебет и кредит (как он любил насмешливо говорить), он узнавал количество скота у крестьян и увеличивал это количество всеми возможными средствами. Семьи крестьян он поддерживал в самых больших размерах, не позволяя делиться. Ленивых, развратных и слабых он одинаково преследовал и старался изгонять из общества.
При посевах и уборке сена и хлебов он совершенно одинаково следил за своими и мужицкими полями. И у редких хозяев были так рано и хорошо посеяны и убраны поля и так много дохода, как у Николая.
С дворовыми он не любил иметь никакого дела, называл их дармоедами и, как все говорили, распустил и избаловал их; когда надо было сделать какое нибудь распоряжение насчет дворового, в особенности когда надо было наказывать, он бывал в нерешительности и советовался со всеми в доме; только когда возможно было отдать в солдаты вместо мужика дворового, он делал это без малейшего колебания. Во всех же распоряжениях, касавшихся мужиков, он никогда не испытывал ни малейшего сомнения. Всякое распоряжение его – он это знал – будет одобрено всеми против одного или нескольких.
Он одинаково не позволял себе утруждать или казнить человека потому только, что ему этого так хотелось, как и облегчать и награждать человека потому, что в этом состояло его личное желание. Он не умел бы сказать, в чем состояло это мерило того, что должно и чего не должно; но мерило это в его душе было твердо и непоколебимо.
Он часто говаривал с досадой о какой нибудь неудаче или беспорядке: «С нашим русским народом», – и воображал себе, что он терпеть не может мужика.
Но он всеми силами души любил этот наш русский народ и его быт и потому только понял и усвоил себе тот единственный путь и прием хозяйства, которые приносили хорошие результаты.
Графиня Марья ревновала своего мужа к этой любви его и жалела, что не могла в ней участвовать, но не могла понять радостей и огорчений, доставляемых ему этим отдельным, чуждым для нее миром. Она не могла понять, отчего он бывал так особенно оживлен и счастлив, когда он, встав на заре и проведя все утро в поле или на гумне, возвращался к ее чаю с посева, покоса или уборки. Она не понимала, чем он восхищался, рассказывая с восторгом про богатого хозяйственного мужика Матвея Ермишина, который всю ночь с семьей возил снопы, и еще ни у кого ничего не было убрано, а у него уже стояли одонья. Она не понимала, отчего он так радостно, переходя от окна к балкону, улыбался под усами и подмигивал, когда на засыхающие всходы овса выпадал теплый частый дождик, или отчего, когда в покос или уборку угрожающая туча уносилась ветром, он, красный, загорелый и в поту, с запахом полыни и горчавки в волосах, приходя с гумна, радостно потирая руки, говорил: «Ну еще денек, и мое и крестьянское все будет в гумне».
Еще менее могла она понять, почему он, с его добрым сердцем, с его всегдашнею готовностью предупредить ее желания, приходил почти в отчаяние, когда она передавала ему просьбы каких нибудь баб или мужиков, обращавшихся к ней, чтобы освободить их от работ, почему он, добрый Nicolas, упорно отказывал ей, сердито прося ее не вмешиваться не в свое дело. Она чувствовала, что у него был особый мир, страстно им любимый, с какими то законами, которых она не понимала.
Когда она иногда, стараясь понять его, говорила ему о его заслуге, состоящей в том, что он делает добро своих подданных, он сердился и отвечал: «Вот уж нисколько: никогда и в голову мне не приходит; и для их блага вот чего не сделаю. Все это поэзия и бабьи сказки, – все это благо ближнего. Мне нужно, чтобы наши дети не пошли по миру; мне надо устроить наше состояние, пока я жив; вот и все. Для этого нужен порядок, нужна строгость… Вот что!» – говорил он, сжимая свой сангвинический кулак. «И справедливость, разумеется, – прибавлял он, – потому что если крестьянин гол и голоден, и лошаденка у него одна, так он ни на себя, ни на меня не сработает».
И, должно быть, потому, что Николай не позволял себе мысли о том, что он делает что нибудь для других, для добродетели, – все, что он делал, было плодотворно: состояние его быстро увеличивалось; соседние мужики приходили просить его, чтобы он купил их, и долго после его смерти в народе хранилась набожная память об его управлении. «Хозяин был… Наперед мужицкое, а потом свое. Ну и потачки не давал. Одно слово – хозяин!»


Одно, что мучило Николая по отношению к его хозяйничанию, это была его вспыльчивость в соединении с старой гусарской привычкой давать волю рукам. В первое время он не видел в этом ничего предосудительного, но на второй год своей женитьбы его взгляд на такого рода расправы вдруг изменился.
Однажды летом из Богучарова был вызван староста, заменивший умершего Дрона, обвиняемый в разных мошенничествах и неисправностях. Николай вышел к нему на крыльцо, и с первых ответов старосты в сенях послышались крики и удары. Вернувшись к завтраку домой, Николай подошел к жене, сидевшей с низко опущенной над пяльцами головой, и стал рассказывать ей, по обыкновению, все то, что занимало его в это утро, и между прочим и про богучаровского старосту. Графиня Марья, краснея, бледнея и поджимая губы, сидела все так же, опустив голову, и ничего не отвечала на слова мужа.
– Эдакой наглый мерзавец, – говорил он, горячась при одном воспоминании. – Ну, сказал бы он мне, что был пьян, не видал… Да что с тобой, Мари? – вдруг спросил он.
Графиня Марья подняла голову, хотела что то сказать, но опять поспешно потупилась и собрала губы.
– Что ты? что с тобой, дружок мой?..
Некрасивая графиня Марья всегда хорошела, когда плакала. Она никогда не плакала от боли или досады, но всегда от грусти и жалости. И когда она плакала, лучистые глаза ее приобретали неотразимую прелесть.
Как только Николай взял ее за руку, она не в силах была удержаться и заплакала.
– Nicolas, я видела… он виноват, но ты, зачем ты! Nicolas!.. – И она закрыла лицо руками.
Николай замолчал, багрово покраснел и, отойдя от нее, молча стал ходить по комнате. Он понял, о чем она плакала; но вдруг он не мог в душе своей согласиться с ней, что то, с чем он сжился с детства, что он считал самым обыкновенным, – было дурно.
«Любезности это, бабьи сказки, или она права?» – спрашивал он сам себя. Не решив сам с собою этого вопроса, он еще раз взглянул на ее страдающее и любящее лицо и вдруг понял, что она была права, а он давно уже виноват сам перед собою.
– Мари, – сказал он тихо, подойдя к ней, – этого больше не будет никогда; даю тебе слово. Никогда, – повторил он дрогнувшим голосом, как мальчик, который просит прощения.
Слезы еще чаще полились из глаз графини. Она взяла руку мужа и поцеловала ее.
– Nicolas, когда ты разбил камэ? – чтобы переменить разговор, сказала она, разглядывая его руку, на которой был перстень с головой Лаокоона.
– Нынче; все то же. Ах, Мари, не напоминай мне об этом. – Он опять вспыхнул. – Даю тебе честное слово, что этого больше не будет. И пусть это будет мне память навсегда, – сказал он, указывая на разбитый перстень.
С тех пор, как только при объяснениях со старостами и приказчиками кровь бросалась ему в лицо и руки начинали сжиматься в кулаки, Николай вертел разбитый перстень на пальце и опускал глаза перед человеком, рассердившим его. Однако же раза два в год он забывался и тогда, придя к жене, признавался и опять давал обещание, что уже теперь это было последний раз.
– Мари, ты, верно, меня презираешь? – говорил он ей. – Я стою этого.
– Ты уйди, уйди поскорее, ежели чувствуешь себя не в силах удержаться, – с грустью говорила графиня Марья, стараясь утешить мужа.
В дворянском обществе губернии Николай был уважаем, но не любим. Дворянские интересы не занимали его. И за это то одни считали его гордым, другие – глупым человеком. Все время его летом, с весеннего посева и до уборки, проходило в занятиях по хозяйству. Осенью он с тою же деловою серьезностию, с которою занимался хозяйством, предавался охоте, уходя на месяц и на два в отъезд с своей охотой. Зимой он ездил по другим деревням и занимался чтением. Чтение его составляли книги преимущественно исторические, выписывавшиеся им ежегодно на известную сумму. Он составлял себе, как говорил, серьезную библиотеку и за правило поставлял прочитывать все те книги, которые он покупал. Он с значительным видом сиживал в кабинете за этим чтением, сперва возложенным на себя как обязанность, а потом сделавшимся привычным занятием, доставлявшим ему особого рода удовольствие и сознание того, что он занят серьезным делом. За исключением поездок по делам, бо льшую часть времени зимой он проводил дома, сживаясь с семьей и входя в мелкие отношения между матерью и детьми. С женой он сходился все ближе и ближе, с каждым днем открывая в ней новые душевные сокровища.
Соня со времени женитьбы Николая жила в его доме. Еще перед своей женитьбой Николай, обвиняя себя и хваля ее, рассказал своей невесте все, что было между ним и Соней. Он просил княжну Марью быть ласковой и доброй с его кузиной. Графиня Марья чувствовала вполне вину своего мужа; чувствовала и свою вину перед Соней; думала, что ее состояние имело влияние на выбор Николая, не могла ни в чем упрекнуть Соню, желала любить ее; но не только не любила, а часто находила против нее в своей душе злые чувства и не могла преодолеть их.
Однажды она разговорилась с другом своим Наташей о Соне и о своей к ней несправедливости.
– Знаешь что, – сказала Наташа, – вот ты много читала Евангелие; там есть одно место прямо о Соне.
– Что? – с удивлением спросила графиня Марья.
– «Имущему дастся, а у неимущего отнимется», помнишь? Она – неимущий: за что? не знаю; в ней нет, может быть, эгоизма, – я не знаю, но у нее отнимется, и все отнялось. Мне ее ужасно жалко иногда; я ужасно желала прежде, чтобы Nicolas женился на ней; но я всегда как бы предчувствовала, что этого не будет. Она пустоцвет, знаешь, как на клубнике? Иногда мне ее жалко, а иногда я думаю, что она не чувствует этого, как чувствовали бы мы.
И несмотря на то, что графиня Марья толковала Наташе, что эти слова Евангелия надо понимать иначе, – глядя на Соню, она соглашалась с объяснением, данным Наташей. Действительно, казалось, что Соня не тяготится своим положением и совершенно примирилась с своим назначением пустоцвета. Она дорожила, казалось, не столько людьми, сколько всей семьей. Она, как кошка, прижилась не к людям, а к дому. Она ухаживала за старой графиней, ласкала и баловала детей, всегда была готова оказать те мелкие услуги, на которые она была способна; но все это принималось невольно с слишком слабою благодарностию…
Усадьба Лысых Гор была вновь отстроена, но уже не на ту ногу, на которой она была при покойном князе.
Постройки, начатые во времена нужды, были более чем просты. Огромный дом, на старом каменном фундаменте, был деревянный, оштукатуренный только снутри. Большой поместительный дом с некрашеным дощатым полом был меблирован самыми простыми жесткими диванами и креслами, столами и стульями из своих берез и работы своих столяров. Дом был поместителен, с комнатами для дворни и отделениями для приезжих. Родные Ростовых и Болконских иногда съезжались гостить в Лысые Горы семьями, на своих шестнадцати лошадях, с десятками слуг, и жили месяцами. Кроме того, четыре раза в год, в именины и рожденья хозяев, съезжалось до ста человек гостей на один два дня. Остальное время года шла ненарушимо правильная жизнь с обычными занятиями, чаями, завтраками, обедами, ужинами из домашней провизии.


Выл канун зимнего Николина дня, 5 е декабря 1820 года. В этот год Наташа с детьми и мужем с начала осени гостила у брата. Пьер был в Петербурге, куда он поехал по своим особенным делам, как он говорил, на три недели, и где он теперь проживал уже седьмую. Его ждали каждую минуту.
5 го декабря, кроме семейства Безуховых, у Ростовых гостил еще старый друг Николая, отставной генерал Василий Федорович Денисов.
6 го числа, в день торжества, в который съедутся гости, Николай знал, что ему придется снять бешмет, надеть сюртук и с узкими носками узкие сапоги и ехать в новую построенную им церковь, а потом принимать поздравления и предлагать закуски и говорить о дворянских выборах и урожае; но канун дня он еще считал себя вправе провести обычно. До обеда Николай поверил счеты бурмистра из рязанской деревни, по именью племянника жены, написал два письма по делам и прошелся на гумно, скотный и конный дворы. Приняв меры против ожидаемого на завтра общего пьянства по случаю престольного праздника, он пришел к обеду и, не успев с глазу на глаз переговорить с женою, сел за длинный стол в двадцать приборов, за который собрались все домашние. За столом были мать, жившая при ней старушка Белова, жена, трое детей, гувернантка, гувернер, племянник с своим гувернером, Соня, Денисов, Наташа, ее трое детей, их гувернантка и старичок Михаил Иваныч, архитектор князя, живший в Лысых Горах на покое.
Графиня Марья сидела на противоположном конце стола. Как только муж сел на свое место, по тому жесту, с которым он, сняв салфетку, быстро передвинул стоявшие перед ним стакан и рюмку, графиня Марья решила, что он не в духе, как это иногда с ним бывает, в особенности перед супом и когда он прямо с хозяйства придет к обеду. Графиня Марья знала очень хорошо это его настроение, и, когда она сама была в хорошем расположении, она спокойно ожидала, пока он поест супу, и тогда уже начинала говорить с ним и заставляла его признаваться, что он без причины был не в духе; но нынче она совершенно забыла это свое наблюдение; ей стало больно, что он без причины на нее сердится, и она почувствовала себя несчастной. Она спросила его, где он был. Он отвечал. Она еще спросила, все ли в порядке по хозяйству. Он неприятно поморщился от ее ненатурального тона и поспешно ответил.
«Так я не ошибалась, – подумала графиня Марья, – и за что он на меня сердится?» В тоне, которым он отвечал ей, графиня Марья слышала недоброжелательство к себе и желание прекратить разговор. Она чувствовала, что ее слова были неестественны; но она не могла удержаться, чтобы не сделать еще несколько вопросов.
Разговор за обедом благодаря Денисову скоро сделался общим и оживленным, и графиня Марья не говорила с мужем. Когда вышли из за стола и пришли благодарить старую графиню, графиня Марья поцеловала, подставляя свою руку, мужа и спросила, за что он на нее сердится.
– У тебя всегда странные мысли; и не думал сердиться, – сказал он.
Но слово всегда отвечало графине Марье: да, сержусь и не хочу сказать.
Николай жил с своей женой так хорошо, что даже Соня и старая графиня, желавшие из ревности несогласия между ними, не могли найти предлога для упрека; но и между ними бывали минуты враждебности. Иногда, именно после самых счастливых периодов, на них находило вдруг чувство отчужденности и враждебности; это чувство являлось чаще всего во времена беременности графини Марьи. Теперь она находилась в этом периоде.
– Ну, messieurs et mesdames, – сказал Николай громко и как бы весело (графине Марье казалось, что это нарочно, чтобы ее оскорбить), – я с шести часов на ногах. Завтра уж надо страдать, а нынче пойти отдохнуть. – И, не сказав больше ничего графине Марье, он ушел в маленькую диванную и лег на диван.
«Вот это всегда так, – думала графиня Марья. – Со всеми говорит, только не со мною. Вижу, вижу, что я ему противна. Особенно в этом положении». Она посмотрела на свой высокий живот и в зеркало на свое желто бледное, исхудавшее лицо с более, чем когда нибудь, большими глазами.
И все ей стало неприятно: и крик и хохот Денисова, и разговор Наташи, и в особенности тот взгляд, который на нее поспешно бросила Соня.
Соня всегда была первым предлогом, который избирала графиня Марья для своего раздражения.
Посидев с гостями и не понимая ничего из того, что они говорили, она потихоньку вышла и пошла в детскую.
Дети на стульях ехали в Москву и пригласили ее с собою. Она села, поиграла с ними, но мысль о муже и о беспричинной досаде его не переставая мучила ее. Она встала и пошла, с трудом ступая на цыпочки, в маленькую диванную.
«Может, он не спит; я объяснюсь с ним», – сказала она себе. Андрюша, старший мальчик, подражая ей, пошел за ней на цыпочках. Графиня Марья не заметила его.
– Chere Marie, il dort, je crois; il est si fatigue, [Мари, он спит, кажется; он устал.] – сказала (как казалось графине Марье везде ей встречавшаяся) Соня в большой диванной. – Андрюша не разбудил бы его.
Графиня Марья оглянулась, увидала за собой Андрюшу, почувствовала, что Соня права, и именно от этого вспыхнула и, видимо, с трудом удержалась от жесткого слова. Она ничего не сказала и, чтобы не послушаться ее, сделала знак рукой, чтобы Андрюша не шумел, а все таки шел за ней, и подошла к двери. Соня прошла в другую дверь. Из комнаты, в которой спал Николай, слышалось его ровное, знакомое жене до малейших оттенков дыхание. Она, слыша это дыхание, видела перед собой его гладкий красивый лоб, усы, все лицо, на которое она так часто подолгу глядела, когда он спал, в тишине ночи. Николай вдруг пошевелился и крякнул. И в то же мгновение Андрюша из за двери закричал:
– Папенька, маменька тут стоит.
Графиня Марья побледнела от испуга и стала делать знаки сыну. Он замолк, и с минуту продолжалось страшное для графини Марьи молчание. Она знала, как не любил Николай, чтобы его будили. Вдруг за дверью послышалось новое кряхтение, движение, и недовольный голос Николая сказал:
– Ни минуты не дадут покоя. Мари, ты? Зачем ты привела его сюда?
– Я подошла только посмотреть, я не видала… извини…
Николай прокашлялся и замолк. Графиня Марья отошла от двери и проводила сына в детскую. Через пять минут маленькая черноглазая трехлетняя Наташа, любимица отца, узнав от брата, что папенька спит в маленькой диванной, не замеченная матерью, побежала к отцу. Черноглазая девочка смело скрыпнула дверью, подошла энергическими шажками тупых ножек к дивану и, рассмотрев положение отца, спавшего к ней спиною, поднялась на цыпочки и поцеловала лежавшую под головой руку отца. Николай обернулся с умиленной улыбкой на лице.
– Наташа, Наташа! – слышался из двери испуганный шепот графини Марьи, – папенька спать хочет.
– Нет, мама, он не хочет спать, – с убедительностью отвечала маленькая Наташа, – он смеется.
Николай спустил ноги, поднялся и взял на руки дочь.
– Взойди, Маша, – сказал он жене. Графиня Марья вошла в комнату и села подле мужа.
– Я и не видала, как он за мной прибежал, – робко сказала она. – Я так…
Николай, держа одной рукой дочь, поглядел на жену и, заметив виноватое выражение ее лица, другой рукой обнял ее и поцеловал в волоса.
– Можно целовать мама ? – спросил он у Наташи.
Наташа застенчиво улыбнулась.
– Опять, – сказала она, с повелительным жестом указывая на то место, куда Николай поцеловал жену.
– Я не знаю, отчего ты думаешь, что я не в духе, – сказал Николай, отвечая на вопрос, который, он знал, был в душе его жены.
– Ты не можешь себе представить, как я бываю несчастна, одинока, когда ты такой. Мне все кажется…
– Мари, полно, глупости. Как тебе не совестно, – сказал он весело.
– Мне кажется, что ты не можешь любить меня, что я так дурна… и всегда… а теперь… в этом по…
– Ах, какая ты смешная! Не по хорошу мил, а по милу хорош. Это только Malvina и других любят за то, что они красивы; а жену разве я люблю? Я не люблю, а так, не знаю, как тебе сказать. Без тебя и когда вот так у нас какая то кошка пробежит, я как будто пропал и ничего не могу. Ну, что я люблю палец свой? Я не люблю, а попробуй, отрежь его…
– Нет, я не так, но я понимаю. Так ты на меня не сердишься?
– Ужасно сержусь, – сказал он, улыбаясь, и, встав и оправив волосы, стал ходить по комнате.
– Ты знаешь, Мари, о чем я думал? – начал он, теперь, когда примирение было сделано, тотчас же начиная думать вслух при жене. Он не спрашивал о том, готова ли она слушать его; ему все равно было. Мысль пришла ему, стало быть, и ей. И он рассказал ей свое намерении уговорить Пьера остаться с ними до весны.
Графиня Марья выслушала его, сделала замечания и начала в свою очередь думать вслух свои мысли. Ее мысли были о детях.
– Как женщина видна уже теперь, – сказала она по французски, указывая на Наташу. – Вы нас, женщин, упрекаете в нелогичности. Вот она – наша логика. Я говорю: папа хочет спать, а она говорит: нет, он смеется. И она права, – сказала графиня Марья, счастливо улыбаясь.
– Да, да! – И Николай, взяв на свою сильную руку дочь, высоко поднял ее, посадил на плечо, перехватив за ножки, и стал с ней ходить по комнате. У отца и у дочери были одинаково бессмысленно счастливые лица.
– А знаешь, ты, может быть, несправедлив. Ты слишком любишь эту, – шепотом по французски сказала графиня Марья.
– Да, но что ж делать?.. Я стараюсь не показать…
В это время в сенях и передней послышались звуки блока и шагов, похожих на звуки приезда.
– Кто то приехал.
– Я уверена, что Пьер. Я пойду узнаю, – сказала графиня Марья и вышла из комнаты.
В ее отсутствие Николай позволил себе галопом прокатить дочь вокруг комнаты. Запыхавшись, он быстро скинул смеющуюся девочку и прижал ее к груди. Его прыжки напомнили ему танцы, и он, глядя на детское круглое счастливое личико, думал о том, какою она будет, когда он начнет вывозить ее старичком и, как, бывало, покойник отец танцовывал с дочерью Данилу Купора, пройдется с нею мазурку.
– Он, он, Nicolas, – сказала через несколько минут графиня Марья, возвращаясь в комнату. – Теперь ожила наша Наташа. Надо было видеть ее восторг и как ему досталось сейчас же за то, что он просрочил. – Ну, пойдем скорее, пойдем! Расстаньтесь же наконец, – сказала она, улыбаясь, глядя на девочку, жавшуюся к отцу. Николай вышел, держа дочь за руку.
Графиня Марья осталась в диванной.
– Никогда, никогда не поверила бы, – прошептала она сама с собой, – что можно быть так счастливой. – Лицо ее просияло улыбкой; но в то же самое время она вздохнула, и тихая грусть выразилась в ее глубоком взгляде. Как будто, кроме того счастья, которое она испытывала, было другое, недостижимое в этой жизни счастье, о котором она невольно вспомнила в эту минуту.

Х
Наташа вышла замуж ранней весной 1813 года, и у ней в 1820 году было уже три дочери и один сын, которого она страстно желала и теперь сама кормила. Она пополнела и поширела, так что трудно было узнать в этой сильной матери прежнюю тонкую, подвижную Наташу. Черты лица ее определились и имели выражение спокойной мягкости и ясности. В ее лице не было, как прежде, этого непрестанно горевшего огня оживления, составлявшего ее прелесть. Теперь часто видно было одно ее лицо и тело, а души вовсе не было видно. Видна была одна сильная, красивая и плодовитая самка. Очень редко зажигался в ней теперь прежний огонь. Это бывало только тогда, когда, как теперь, возвращался муж, когда выздоравливал ребенок или когда она с графиней Марьей вспоминала о князе Андрее (с мужем она, предполагая, что он ревнует ее к памяти князя Андрея, никогда не говорила о нем), и очень редко, когда что нибудь случайно вовлекало ее в пение, которое она совершенно оставила после замужества. И в те редкие минуты, когда прежний огонь зажигался в ее развившемся красивом теле, она бывала еще более привлекательна, чем прежде.
Со времени своего замужества Наташа жила с мужем в Москве, в Петербурге, и в подмосковной деревне, и у матери, то есть у Николая. В обществе молодую графиню Безухову видели мало, и те, которые видели, остались ею недовольны. Она не была ни мила, ни любезна. Наташа не то что любила уединение (она не знала, любила ли она или нет; ей даже казалось, что нет), но она, нося, рожая, кормя детей и принимая участие в каждой минуте жизни мужа, не могла удовлетворить этим потребностям иначе, как отказавшись от света. Все, знавшие Наташу до замужества, удивлялись происшедшей в ней перемене, как чему то необыкновенному. Одна старая графиня, материнским чутьем понявшая, что все порывы Наташи имели началом только потребность иметь семью, иметь мужа, как она, не столько шутя, сколько взаправду, кричала в Отрадном, мать удивлялась удивлению людей, не понимавших Наташи, и повторяла, что она всегда знала, что Наташа будет примерной женой и матерью.
– Она только до крайности доводит свою любовь к мужу и детям, – говорила графиня, – так что это даже глупо.
Наташа не следовала тому золотому правилу, проповедоваемому умными людьми, в особенности французами, и состоящему в том, что девушка, выходя замуж, не должна опускаться, не должна бросать свои таланты, должна еще более, чем в девушках, заниматься своей внешностью, должна прельщать мужа так же, как она прежде прельщала не мужа. Наташа, напротив, бросила сразу все свои очарованья, из которых у ней было одно необычайно сильное – пение. Она оттого и бросила его, что это было сильное очарованье. Она, то что называют, опустилась. Наташа не заботилась ни о своих манерах, ни о деликатности речей, ни о том, чтобы показываться мужу в самых выгодных позах, ни о своем туалете, ни о том, чтобы не стеснять мужа своей требовательностью. Она делала все противное этим правилам. Она чувствовала, что те очарования, которые инстинкт ее научал употреблять прежде, теперь только были бы смешны в глазах ее мужа, которому она с первой минуты отдалась вся – то есть всей душой, не оставив ни одного уголка не открытым для него. Она чувствовала, что связь ее с мужем держалась не теми поэтическими чувствами, которые привлекли его к ней, а держалась чем то другим, неопределенным, но твердым, как связь ее собственной души с ее телом.