с. ?


С++ - это... Что такое С++?

Проект под названием STLport[2], основанный на SGI STL, осуществляет постоянное обновление STL, IOstream и строковых классов. Некоторые другие проекты также занимаются разработкой частных применений стандартной библиотеки для различных конструкторских задач. Каждый производитель компиляторов Си++ обязательно поставляет какую-либо реализацию этой библиотеки, так как она является очень важной частью стандарта и широко используется.

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

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

Существует два значения слова класс. В широком смысле класс — это пользовательский тип, объявленный с использованием одного из ключевых слов class, struct или union. В узком смысле класс — это пользовательский тип, объявленный с использованием ключевого слова class.

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

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

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

Используя инкапсуляцию, автор класса может защитить свои данные от некорректного использования. Кроме того, она задумывалась для облегчения совместной разработки классов. Имелось в виду, что при изменении способа хранения данных, если они объявлены как защищённые или собственные, не требуется соответствующих изменений в классах, которые используют изменённый класс. Например, если в старой версии класса данные хранились в виде линейного списка, а в новой версии — в виде дерева, те классы, которые были написаны до изменения формата хранения данных, переписывать не потребуется, если данные были приватными или защищёнными (в последнем случае — если использующие классы не были классами-наследниками), так как ни один из них этих классов не мог бы напрямую обращаться к данным, а только через стандартные функции, которые в новой версии должны уже корректно работать с новым форматом данных. Даже оператор доступа operator [] может быть определён как такая стандартная функция.

Используя инкапсуляцию, структуру Array из предыдущего раздела можно переписать следующим образом:

class Array { public: void Alloc(int new_len); void Free(); inline double Elem(int i); inline void ChangeElem(int i, double x); protected: int len; double* val; }; void Array::Alloc(int new_len) {if (len>0) Free(); len=new_len; val=new double[new_len];} void Array::Free() {delete [] val; len=0;} inline double Array::Elem(int i) {assert(i>=0 && i<len ); return val[i];} inline void Array::ChangeElem(int i, double x) {assert(i>=0 && i<len); val[i]=x;}

И далее

Array a; a.Alloc(10); a.ChangeElem(3, 2.78); double b = a.Elem(3); a.Free();

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

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

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

class Array { public: void Alloc(int _len) {if (len==0) Free(); len=_len; val=new double[len];}

и так далее.

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

Однако в приведённом примере не решена важная проблема: функции Alloc и Free по-прежнему надо вызывать вручную. Другая проблема данного примера — опасность оператора присваивания.

Для решения этих проблем в язык были введены конструкторы и деструкторы. Конструктор вызывается каждый раз, когда создаётся объект данного типа; деструктор — при уничтожении. При преобразованиях типов с участием экземпляров классов тоже вызываются конструкторы и деструкторы.

С конструкторами и деструктором класс выглядит так:

class Array { public: Array() : len(0), val(NULL) {} Array(int _len) : len(_len) {val = new double[_len];} Array(const Array& a); ~Array() { Free(); } inline double Elem(int i); inline void ChangeElem(int i, double x); protected: void Alloc(int _len); void Free(); int len; double* val; }; Array::Array(const Array& a) : len(a.len) { val = new double[len]; for (int i=0; i<len; i++) val[i] = a.val[i]; }

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

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

Оператор new тоже вызывает конструкторы, а delete — деструкторы.

По умолчанию, каждый класс имеет неявно объявленные конструктор без параметров, копирующий конструктор, копирующий оператор присваивания и деструктор.

Класс может иметь сколько угодно конструкторов (с разными наборами параметров), но только один деструктор (без параметров).

Другие возможности функций-членов

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

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

И далее

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

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

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

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

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

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

Класс-наследник может добавлять свои поля и функции или переопределять функции базового класса.

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

class ArrayWithAdd : public Array { ArrayWithAdd(int n) : Array(n) {} ArrayWithAdd() : Array() {} ArrayWithAdd(const Array& a) : Array(a) {} void Add(const Array& a); };

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

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

Класс может быть наследником нескольких классов. Это называется множественным наследованием. Такой класс обладает полями и функциями-членами всех его предков. Например, класс FlyingCat (ЛетающийКот) может быть наследником классов Cat (Кот) и FlyingAnimal (ЛетающееЖивотное)

class Cat { ... void Purr(); ... }; class FlyingAnimal { ... void Fly(); ... }; class FlyingCat : public Cat, public FlyingAnimal { ... PurrAndFly() {Purr(); Fly();} ... };

Полиморфизм

Полиморфизмом в программировании называется переопределение наследником функций-членов базового класса, например

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

В этом примере, какая из функций будет вызвана — Circle::Draw(), Square::Draw() или Figure::Draw(), определяется во время компиляции. К примеру, если написать

Figure* x = new Circle(0,0,5); x->Draw();

то будет вызвана Figure::Draw(), поскольку x — объект класса Figure. Такой полиморфизм называется статическим.

Но в C++ есть и динамический полиморфизм, когда вызываемая функция определяется во время выполнения. Для этого функции-члены должны быть виртуальными.

class Figure { ... virtual void Draw() const; ... }; class Square : public Figure { ... virtual void Draw() const; ... }; class Circle : public Figure { ... virtual 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; );

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

Друзья

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

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

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

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

class Matrix { ... friend class Vector; ... };

Однако в С++ не действует правило «друг моего друга — мой друг».

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

Будущее развитие

Текущий стандарт языка был принят в 2003 году. Следующая версия стандарта носит неофициальное название C++0x.

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

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

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

Ключевое слово export

Одной из точек преткновения в этом вопросе является ключевое слово export, используемое также и для разделения объявления и определения шаблонов.

Первым компилятором, поддерживающим export в шаблонах, стал Comeau C++ в начале 2003 года (спустя пять лет после выхода стандарта). В 2004 году бета-версия компилятора Borland C++ Builder X также начала его поддержку.

Оба этих компилятора основаны на внешнем интерфейсе EDG. Другие компиляторы, такие как Microsoft Visual C++ или GCC (GCC 3.4.4), вообще этого не поддерживают. Герб Саттер (англ.), секретарь комитета по стандартизации Си++, рекомендовал убрать export из будущих версий стандарта по причине серьёзных сложностей в полноценной реализации, однако впоследствии окончательным решением было решено его оставить.

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

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

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

Например, следующий фрагмент кода корректен с точки зрения Си, но некорректен с точки зрения Си++:

typedef struct mystr { int a; int b; } mystr;

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

Другим источником несовместимости являются добавленные ключевые слова. Так, описание переменной

является вполне корректным для Си, но заведомо ошибочным для Си++, поскольку слово try является в Си++ ключевым.

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

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

#include <stdio.h> int main() { printf("%s\n", (sizeof('a') == sizeof(char)) ? "C++" : "C"); return 0; }

Примеры программ на Си++

Пример № 1

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

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

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

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

Пример № 2

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

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

Пример № 3

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

#include <iostream> // это необходимо для std::cout и std::endl int main() { std::cout << "Hello, world!" << std::endl; }

Пример № 4

Современный Си++ позволяет решать простым способом и более сложные задачи. Этот пример демонстрирует кроме всего прочего использование контейнеров стандартной библиотеки шаблонов (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["Dimitri"].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; }

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

Сравнение C++ с языками Java и C#

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

В области прикладного программирования альтернативой C++ стал его язык-потомок, Майкрософт предложила язык C#, представляющий собой ещё одну переработку C++ в том же направлении, что и Java. В дальнейшем появился язык функционального программирования. Ещё позже появилась попытка объединения эффективности C++ с безопасностью и скоростью разработки C# — был предложен язык D, который пока не получил широкого признания.

Java и C++ можно рассматривать как два языка-потомка Си, разработанных из различных соображений и пошедших, вследствие этого, по разным путям. В этой связи представляет интерес сравнение данных языков (всё, сказанное ниже про Java, можно с равным успехом отнести к языкам C# и Nemerle, поскольку в рассматриваемых деталях эти языки отличаются лишь внешне).

Синтаксис  C++ сохраняет совместимость с C, насколько это возможно. Java сохраняет внешнее подобие C и C++, но, в действительности, сильно отличается от них — из языка удалено большое число синтаксических средств, признанных необязательными. В результате Java гораздо проще C++, что облегчает как изучение языка, так и создание трансляторов для него. Исполнение программы  Java-код компилируются в промежуточный код, который в дальнейшем интерпретируется или компилируется, тогда как C++ изначально ориентирован на компиляцию в машинный код заданной платформы (хотя, теоретически, ничто не мешает создавать для C++ трансляторы в промежуточный код). Это уже определяет разницу в сферах применения языков: Java вряд ли может быть использована при написании таких специфических программ, как драйвера устройств или низкоуровневые системные утилиты. Механизм исполнения Java делает программы, даже откомпилированные (в байт-код) полностью переносимыми. Стандартное окружение и среда исполнения позволяют выполнять программы на Java на любой аппаратной платформе и в любой ОС, без каких-либо изменений, усилия по портированию программ минимальны (при соблюдении рекомендаций по созданию переносимых программ — и вовсе нулевые). Ценой переносимости становится потеря эффективности — работа среды исполнения приводит к дополнительным накладным расходам. Управление памятью  C++ следует классической технике управления памятью, когда программист, выделяя динамически память под объекты, обязан позаботиться о своевременном её освобождении. Java работает в среде со сборкой мусора, которая автоматически отслеживает прекращение использования объектов и освобождает занимаемую ими память. Первый вариант предпочтительнее в системном программировании, где требуется полный контроль программиста над используемыми программой ресурсами, второй удобнее в прикладном программировании, поскольку в значительной степени освобождает программиста от необходимости отслеживать момент прекращения использования ранее выделенной памяти. Сборщик мусора Java требует системных ресурсов, что также снижает эффективность выполнения программ. Стандартизация окружения  В Java есть чётко определённые стандарты на ввод-вывод, графику, геометрию, диалог, доступ к базам данных и прочим типовым приложениям. C++ в этом отношении гораздо более свободен. Стандарты на графику, доступ к базам данных и т. д. являются недостатком, если программист хочет определить свой собственный стандарт. Указатели  C++ сохраняет возможность работы с низкоуровневыми указателями. В Java указателей нет. Использование указателей часто является причиной труднообнаруживаемых ошибок, но необходимо для низкоуровневого программирования. В принципе, C++ обладает набором средств (конструкторы и деструкторы, стандартные шаблоны, ссылки), позволяющих почти полностью исключить выделение и освобождение памяти вручную и опасные операции с указателями. Однако такое исключение требует определённой культуры программирования, в то время как в языке Java оно реализуется автоматически. Парадигма программирования  Язык Java является чисто объектно-ориентированным, тогда как C++ сохраняет возможности чисто процедурного программирования (свободные функции и переменные). Динамическая информация о типах  В C++ отсутствует полноценная информации о типах во время исполнения RTTI. Эту возможность можно было бы реализовать в C++, имея полную информацию о типах во время компиляции CTTI. Препроцессор  C++ сохранил препроцессор Си, в том числе возможность введения пользовательского синтаксиса с помощью #define. Этот механизм небезопасен, он может привести к тому, что модули в крупных пакетах программ становятся сильно связаны друг с другом, что резко понижает надёжность пакетов и возможность организации разделённых модулей. С++ предоставляет достаточно средств (константы, шаблоны, встроенные функции) для того, чтобы практически полностью исключить использование #define. Java просто исключила препроцессор полностью, избавившись разом от всех проблем с его использованием, хотя и потеряв при этом некоторые возможности.

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

Далеко не все программисты являются сторонниками одного из языков. По мнению большинства программистов, Java и C++ не являются конкурентами, потому что обладают различными областями применимости. Другие считают, что выбор языка для многих задач является вопросом личного вкуса.

Достоинства и недостатки языка

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

Достоинства

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

  • Высокая совместимость с языком С, позволяющая использовать весь существующий С-код (код С может быть с минимальными переделками скомпилирован компилятором С++; библиотеки, написанные на С, обычно могут быть вызваны из С++ непосредственно без каких-либо дополнительных затрат, в том числе и на уровне функций обратного вызова, позволяя библиотекам, написанным на С, вызывать код, написанный на С++).
  • Поддерживаются различные стили и технологии программирования, включая традиционное директивное программирование, ООП, обобщенное программирование, метапрограммирование (шаблоны, макросы).
  • Имеется возможность работы на низком уровне с памятью, адресами, портами.
  • Возможность создания обобщённых контейнеров и алгоритмов для разных типов данных, их специализация и вычисления на этапе компиляции, используя шаблоны.
  • Кроссплатформенность. Доступны компиляторы для большого количества платформ, на языке C++ разрабатывают программы для самых различных платформ и систем.
  • Эффективность. Язык спроектирован так, чтобы дать программисту максимальный контроль над всеми аспектами структуры и порядка исполнения программы. Ни одна из языковых возможностей, приводящая к дополнительным накладным расходам, не является обязательной для использования — при необходимости язык позволяет обеспечить максимальную эффективность программы.

Недостатки

Отчасти недостатки C++ унаследованы от языка-предка — Си, — и вызваны изначально заданным требованием возможно большей совместимости с Си. Это такие недостатки, как:

  • Синтаксис, провоцирующий ошибки:
    • Операция присваивания обозначается как = , а операция сравнения как ==. Их легко спутать, при этом операция присваивания возвращает значение, поэтому присваивание на месте выражения является синтаксически корректным, а в конструкциях цикла и ветвления появление числа на месте логического значения также допустимо, так что ошибочная конструкция оказывается синтаксически правильной. Типичный пример подобной ошибки: if (x=0) { операторы } Здесь в условном операторе по ошибке написано присваивание вместо сравнения. В результате, вместо того, чтобы сравнить текущее значение x с нулём, программа присвоит x нулевое значение, а потом интерпретирует его как значение условия в операторе if. Так как нуль соответствует логическому значению «ложь» (false), блок операторов в условной конструкции не выполнится никогда. Ошибки такого рода трудно выявлять, но во многих современных компиляторах предлагается диагностика некоторых подобных конструкций.
    • Операции присваивания (=), инкрементации (++), декрементации (--) и другие возвращают значение. В сочетании с обилием операций это позволяет, хотя и не обязывает, создавать трудночитаемые выражения. Наличие этих операций в Си было вызвано желанием получить инструмент ручной оптимизации кода, но в настоящее время оптимизирующие компиляторы обычно генерируют оптимальный код и на традиционных выражениях. С другой стороны, один из основных принципов языков C и C++ — позволять программисту писать в любом стиле, а не навязывать «хороший» стиль.
    • Макросы (#define) являются мощным, но опасным средством. Они сохранены в C++ несмотря на то, что необходимость в них, благодаря шаблонам и встроенным функциям, не так уж велика. В унаследованных стандартных С-библиотеках много потенциально опасных макросов.
    • Некоторые преобразования типов неинтуитивны. В частности, операция над беззнаковым и знаковым числами выдаёт беззнаковый результат.
    • Необходимость записывать break в каждой ветви оператора switch и возможность последовательного выполнения нескольких ветвей при его отсутствии провоцирует ошибки из-за пропуска break. Эта же особенность позволяет делать сомнительные «трюки», базирующиеся на избирательном неприменении break и затрудняющие понимание кода.
  • Препроцессор, унаследованный от С, очень примитивен. Это приводит с одной стороны к тому, что с его помощью нельзя (или тяжело) осуществлять некоторые задачи метапрограммирования, а с другой, вследствие своей примитивности, он часто приводит к ошибкам и требует много действий по обходу потенциальных проблем. Некоторые языки программирования (например, Nemerle) имеют намного более мощные и более безопасные системы метапрограммирования (также называемые макросами, но мало напоминающие макросы С/С++).
  • Плохая поддержка модульности (по сути, в классическом Си модульность на уровне языка отсутствует, её обеспечение переложено на компоновщик). Подключение интерфейса внешнего модуля через препроцессорную вставку заголовочного файла (#include) серьёзно замедляет компиляцию при подключении большого количества модулей (потому что результирующий файл, который обрабатывается компилятором, оказывается очень велик). Эта схема без изменений скопирована в C++. Для устранения этого недостатка, многие компиляторы реализуют механизм прекомпиляции заголовочных файлов Precompiled Headers.

К собственным недостаткам C++ можно отнести:

  • Сложность и избыточность, из-за которых C++ трудно изучать, а построение компилятора сопряжено с большим количеством проблем. В частности:
    • В языке практически полностью сохранён набор конструкций Си, к которому добавлены новые средства. Во многих случаях новые средства и механизмы позволяют делать то же самое, что и старые, но в языке сохраняются оба варианта.
    • Поддержка множественного наследования реализации в ООП-подсистеме языка вызывает целый ряд логических проблем, а также создаёт дополнительные трудности в реализации компилятора.
    • Шаблоны в своём исходном виде приводят к порождению кода очень большого объёма, а введённая позже в язык возможность частичной спецификации шаблонов трудно реализуема и не поддерживается многими существующими компиляторами.
  • Недостаток информации о типах данных во время компиляции (CTTI).
  • Метапрограммирование на основе шаблонов C++ сложно и при этом ограничено в возможностях. Оно состоит в реализации средствами шаблонов C++ интерпретатора примитивного функционального языка программирования выполняющегося во время компиляции. Сама по себе данная возможность весьма привлекательна, но такой код весьма трудно воспринимать и отлаживать. Языки Lisp/Nemerle и некоторые другие имеют более мощные и одновременно более простые для восприятия подсистемы метапрограммирования. Кроме того, в языке D реализована сравнимая по мощности, но значительно более простая в применении подсистема шаблонного метапрограммирования.
  • Хотя декларируется, что С++ мультипарадигменный язык, реально в языке отсутствует поддержка функционального программирования. Отчасти, данный пробел устраняется различными библиотеками (Boost) использующими средства метапрограммирования для расширения языка функциональными конструкциями (например, поддержкой лямбд/анонимных методов), но качество подобных решений значительно уступает качеству встроенных в функциональные языки решений. Такие возможности функциональных языков, как сопоставление с образцом, вообще крайне сложно эмулировать средствами метапрограммирования.
  • Некоторые считают недостатком языка C++ отсутствие встроенной системы сборки мусора. С другой стороны, в C++ имеется достаточно средств, позволяющих почти исключить использование опасных указателей, нет принципиальных проблем и в реализации и использовании сборки мусора (на уровне библиотек, а не языка). Отсутствие встроенной сборки мусора позволяет пользователю самому выбрать стратегию управления ресурсами.

Примечания

См. также

Ссылки

Статьи и книги, библиотеки материалов по C++ Форумы
  • codeby.net C, С++ и С Builder. Белорусский форум по C++
  • www.rsdn.ru/forum/?group=cpp — форум по C++ на
    • Bloodshed Dev-C++ (сайт) — бесплатная и свободная среда разработки в C++ под Windows.
    • (сайт) — бесплатная и свободная кроссплатформенная среда разработки.
    • Blitz++ — библиотека научных программ на C++, с упором на линейную алгебру
    • The Matrix Template Library — линейная алгебра на C++
    • Boost C++ Libraries — свободные кроссплатформенные библиотеки на C++
    • GNU Scientific Library — свободная математическая библиотека для C/C++, распространяемая на условиях лицензии GNU General Public License.
    • The C++ Standards Committee
    • VivaCore — свободная библиотека для создания систем статического анализа Си/Си++ кода [1].
    • сайт) — бесплатная открытая библиотека для создания своего пользовательского интерфейса.
    • сайт) — ещё одна библиотека создания кроссплатформенных приложений, бесплатная для некоммерческого использования.

    Литература

    • Страуструп Б. Язык программирования C++. Специальное издание = The C++ programming language. Special edition. — М.: Бином-Пресс, 2007. — 1104 с. — ISBN 5-7989-0223-4
    • Герберт Шилдт. Полный справочник по C++ = C++: The Complete Reference. — 4-е изд. — М.: Вильямс, 2006. — 800 с. — ISBN 0-07-222680-3
    • Джесс Либерти, Дэвид Хорват. Освой самостоятельно C++ за 24 часа = Sams Teach Yourself C++ in 24 Hours, Complete Starter Kit. — 4-е изд. — М.: Вильямс, 2007. — 448 с. — ISBN 0-672-32681-7
    • Стефенс Д. Р. C++. Сборник рецептов. — КУДИЦ-ПРЕСС, 2007. — 624 с. — ISBN 5-91136-030-6

dic.academic.ru

с - это... Что такое с?

1)

2)

и СО, предлог с родительным, винительным и творительным падежами.

I.

С родительным падежом.

1.

Употребляется при обозначении предмета, места, с поверхности которого или от которого удаляется, отделяется кто-, что-л.

Сорвать яблоко с ветки. Сбросить ношу с плеч. Убрать посуду со стола. Встать со стула. Свернуть с дороги.

Улыбка сошла с лица Лизы. Тургенев, Дворянское гнездо.

Дрожа от холода и брезгливо пожимаясь, Егорушка стащил с себя промокшее пальто. Чехов, Степь.

|

С существительными, обозначающими сферу деятельности, занятий, отношений и т. п.

Уволить с работы. Удалить с урока. Уйти с заседания. Снять с учета.

|

В составе некоторых устойчивых сочетаний и выражений.

Сойти с ума. Сжить со свету. Сбыть с рук. Сбить с толку.

Все сходило ему с рук. Григорович, Деревня.

Все сбились с ног, готовясь к празднику. Бунин, Суходол.

2.

Употребляется при обозначении места, пространства, откуда направлено движение, действие.

Со степи понеслось звонкое ржание жеребенка. Гоголь, Тарас Бульба.

Ветер с моря волны гонит. Брюсов, Балтика.

|

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

Приехать с Украины. Вернуться с Кавказа.

[Карела:] К тебе я с Дона послан От вольных войск, от храбрых атаманов. Пушкин, Борис Годунов.

Почта с Амура идет редко. Чехов, Письмо Н. А. Лейкину, 20 июня 1890.

|

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

Идти с работы. Прийти с лекций. Вернуться с тренировки.

|

С существительными, обозначающими какие-л. условия, какое-л. свойство, проявляющееся в каком-л. месте, пространстве.

Она пришла с мороза, Раскрасневшаяся, наполнила комнату Ароматом воздуха и духов. Блок, Она пришла с мороза.

Человек этот попал со света в темную камеру. Фадеев, Молодая гвардия.

| С предлогом „на“ (с… на…)

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

Прыгать с кочки на кочку.

[Бабочка] перепархивает с цветка на цветок. Григорович, Переселенцы.

[Пароходик] валяло со стороны на сторону. Бунин, Господин из Сан-Франциско.

|

В составе некоторых устойчивых сочетаний и выражений.

Вертеться с боку на бок. Переминаться с ноги на ногу. Остаться с глазу на глаз. Перебиваться с хлеба на воду.

Шамет привез девочку в Руан и сдал с рук на руки высокой женщине. Паустовский, Золотая роза.

||

при обозначении местонахождения предмета, лица, производящего действие, или места, с которого возможно наблюдение, восприятие чего-л.

Пушки с пристани палят, Кораблю пристать велят. Пушкин, Сказка о царе Салтане.

А вон Яков сонно смотрит с крыльца по сторонам. И. Гончаров, Обрыв.

И вот в селенье с минарета Запел протяжно муэдзин. Брюсов, Крым. Черное море.

||

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

Вход со двора. Удар с фланга. Со стороны леса. Окружить со всех сторон.

Мы ехали берегом Лены на юг, а зима догоняла нас с севера. Короленко, Мороз.

Через несколько минут ударил снаряд в рубку с носа. Новиков-Прибой, Цусима.

|| (со словами: „сторона“, „позиция“, „точка зрения“ и т. п.) при указании на направленность чьих-л. взглядов на что-л., чьих-л. отношений к кому-, чему-л.

Решение вопроса с позиций материализма.

— Надо заметить, что с юридической точки зрения дело это весьма темное. Достоевский, Преступление и наказание.

— Это было бы глупо и бесчестно с моей стороны. Писемский, Тюфяк.

3.

Употребляется при указании на место проявления или наличия какого-л. признака, свойства.

Парень-ремесленник фертом глядит, Красен с лица и с затылка подбрит. Н. Некрасов, Свадьба.

Истомин — красивый, лысоватый со лба. Сергеев-Ценский, Синопский бой.

Листья его [папоротника] с изнанки покрыты спорами, похожими на красноватую пыль. Паустовский, Золотая роза.

4.

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

Цветы с юга. Перчатка с правой руки. Картина с выставки. Телеграмма с дороги. Девочка с соседней дачи. Моряк с Балтики.

[Спивак] была похожа на Мадонну с картины сентиментального художника Боденгаузена. М. Горький, Жизнь Клима Самгина.

[Грубек:] Как вы не понимаете, что это человек с другой планеты? Симонов, Под каштанами Праги.

||

при обозначении предмета, лица, служащего образцом для воспроизведения, подражания.

Рисунок с натуры. Копия с документа. Репродукция с картины.

— Им нужен пример, но с меня что за пример? Гоголь, Мертвые души.

[Андрей:] Хочу за лето, пока буду здесь, перевести одну книжку с английского. Чехов, Три сестры.

5.

Употребляется при обозначении лица или предмета, от которого берут, получают, требуют и т. п. что-л.

Получить деньги с заказчика.

С миру по нитке — голому рубашка. Пословица.

Не главный ли доход твой с нивы: А, посмотри, в какой небрежности она! И. Крылов, Колос.

Она стара, и потому с нее грех спрашивать как с молоденькой. Писемский, Тюфяк.

||

при обозначении, лица или предмета, являющегося единицей исчисления, расчета при взимании, получении чего-л.

Урожай 50 центнеров с гектара. Отчислять по два рубля с тысячи.

6. (со словами: „довольно“, „достаточно“, „хватит“ и т. п.). Употребляется при указании на лицо, с которым соразмеряется что-л., определяющее для себя достаточность чего-л., какого-л. количества, меры.

Будет с вас.

[Приказчик и войт] нашли вполне излишним привозить всю муку в барские амбары, а что с бар будет довольно и половины. Гоголь, Старосветские помещики.

[Нестрашный:] Наслушался. Хватит с меня. М. Горький, Достигаев и другие.

— Утром на мое предложение он ответил, что навоевался и с него довольно. Н. Островский, Рожденные бурей.

7.

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

Рыба гниет с головы.

С Ломоносова начинается наша литература; он был ее отцом и пестуном. Белинский, Литературные мечтания.

Рабочий день у него начинался с обхода палат. Сартаков, Хребты Саянские.

|

В сочетании с предлогом „до“ и существительным, обозначающим предельный пункт распространения действия.

С вершины до подножия.

Дельцы окинули друг друга с ног до головы проницательными взглядами. Мамин-Сибиряк, Горное гнездо.

8.

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

С прошлого года. С двух часов дня.

С младенчества дух песен в нас горел. Пушкин, 19 октября.

Райский с раннего утра сидит за портретом Софьи. И. Гончаров, Обрыв.

Каждый русский человек знал его стихи со школьной парты или даже еще раньше. Тихонов, В пушкинских местах.

||

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

С пятидесятых по восьмидесятые годы. С весны до осени. С мая по октябрь. С утра до вечера.

Мы сговорились честно работать с утра до обеда. Паустовский, Золотая роза.

||

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

С четверга на пятницу. С первого на второе января.

Каждую неделю, аккуратно с субботы на воскресенье, отец писал ему письма. Сергеев-Ценский, Валя.

Елена Николаевна на всю жизнь запомнила эту морозную ночь, это была ночь с одиннадцатого на двенадцатое января. Фадеев, Молодая

гвардия.

||

В сочетании с предлогом „на“ (с… на…) употребляется в составе некоторых устойчивых сочетаний (с минуты на минуту, с часу на час, со дня на день и т. п.), обозначающих: в ближайший из названных промежутков времени, в самом скором времени.

Беспокойство князя возрастало с минуты на минуту. Достоевский, Идиот.

Со дня на день надо было ждать оттепели. Арсеньев, В горах Сихотэ-Алиня.

9.

Употребляется при указании на обстоятельство, действие, состояние, вслед за которым следует или должно следовать какое-л. действие.

[Онегин] Со сна садится в ванну. Пушкин, Евгений Онегин.

— Я вам пришлю человека, платье вычистить с дороги, сапожки. Мамин-Сибиряк, Горное гнездо.

— Обещал сейчас же с получки деньги занести, а до сих пор нет. Вересаев, Два конца.

10.

Употребляется при указании на причину действия или состояния.

Вскрикнуть с испуга. Устать с дороги. Умереть с голоду. Трудно с непривычки.

Выпьем, что ли, Ваня, С холода да с горя. Огарев, Кабак.

[Софья:] Из трусости или со зла — ты сделал подлость. М. Горький, Последние.

|

В составе некоторых устойчивых сочетаний и выражений.

Сгореть со стыда. Покатиться со смеху. Беситься с жиру. Ни с того ни с сего.

Я думаю, что он мне с пьяных глаз такую грубость сказал. Достоевский, Бедные люди.

|| (с сущ.: „согласие“, „разрешение“, „позволение“, „одобрение“ и т. п.) при указании на основание для совершения действия.

С согласия автора. С позволения родителей.

[Другой актер:] Если своя братья-товарищи поднесут кому с единодушного приговора венок, то, значит, такой человек, точно, достоин венка. Гоголь, Развязка «Ревизора».

— Здесь один попик организует рабочих. Совершенно легально, с благословения властей. М. Горький, Жизнь Клима Самгина.

11.

Употребляется при обозначении предмета, орудия, с помощью которого совершается действие.

Кормить ребенка с ложечки. Пить с блюдечка.

— Для Александры Николаевны он невозможен, он, страшно сказать, «с ножа ест». Л. Толстой, Нет в мире виноватых.

||

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

Опьянеть с двух рюмок. Узнать с первого взгляда.

Ужель влюбиться с первой встречи Она в Онегина могла. Пушкин, Евгений Онегин (из ранних редакций).

Со второго патрона Лопахин подбил танк. Шолохов, Они сражались за Родину.

||

при обозначении способа, приема осуществления действия (обычно в составе устойчивых сочетаний).

Продавать с аукциона. Взять с бою. Стрелять с колена. Ударить с плеча. Торговать с рук.

□ [Пропотей:]

Да не больно грамотен я. С голоса учился… стихам-то. М. Горький, Достигаев и другие.

— Я учу, что руду надо мыть, надо сортировать, а у вас загрузка идет прямо с колес. Бек, У взорванных печей.

|

В составе некоторых наречных сочетаний со значением образа действия.

С маху. С разбега. С налета. С размаху. С разгона. С ходу.

II.

С винительным падежом.

1.

Употребляется при указании на приблизительную меру, примерное количество чего-л.; соответствует по значению словам: около, приблизительно.

Отдохнуть с полчаса. Отъехать с километр. С метр величиной.

Собак сбежалося с полсотни. И. Крылов, Прохожие и Собаки.

[Самозванец:] Давно ли ты на службе? [Пленник:] С месяц будет. Пушкин, Борис Годунов.

Федор с минуту смотрел на парторга своими темными, чуть поблескивавшими глазами. М. Алексеев, Солдаты.

|

В составе некоторых устойчивых сочетаний и выражений.

Наговорить с три короба.

2.

Употребляется при указании на предмет, лицо, к которому приравнивается по величине, размерам другой предмет, лицо.

Мальчик с пальчик. Мужичок с ноготок.

Ковригу съем Гора горой, Ватрушку съем Со стол большой! Н. Некрасов, Кому на Руси жить хорошо.

Звезды, величиною каждая с яблоко, так и сверкали. Короленко, Сон Макара.

[Соня:] Двенадцать лет, а с маму ростом. Афиногенов, Мать своих детей.

||

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

— Ты сперва с мое поживи, Константин Наркизыч, а тогда уже и осуждай меня. Тургенев, Контора.

Мы барщинные! С наше-то Попробуй, потерпи! Н. Некрасов, Кому на Руси жить хорошо.

III.

С творительным падежом.

1.

Служит для обозначения совместности, указывая на предмет или лицо, участвующее в чем-л. вместе с кем-, чем-л.

Кошка с котятами. Дождь со снегом. Сосиски с капустой.

Вот опальный домик, Где жил я с бедной нянею моей. Пушкин, Вновь я посетил.

Посредине двора был устроен маленький садик с клумбами. Казакевич, При свете дня.

И минуло лето, и осень с зимой, И минуло целых два года. Твардовский, Дорога до дому.

|

При первом участнике действия, выраженном личным местоимением 1 или 2 лица мн. ч. (употребленном взамен местоимения ед. ч. по образцу: мы с тобой — я и ты, вы с братом — ты и брат и т. п.).

Мы с тобой играли вместе, Пыль топтали у завалин. Твардовский, Невесте.

[Отец:] Ты вспомни нашу с тобой молодость. Розов, В дороге.

Потом мы с артельщиком пьем чай. Бунин, Новая дорога.

||

Присоединяя местоимение или существительное к притяжательному местоимению „наш“, „ваш“, указывает на лицо, предмет, которому принадлежит или присуще что-л. так же, как и другому лицу.

Наше с вами путешествие. Ваши с ним разногласия. Наша с тобой находка.

||

Употребляется при обозначении кого-, чего-л. входящего совместно с кем-, чем-л. другим в состав, общее количество, сумму кого-, чего-л.

Нас с детьми семь человек.

— Я должен буду пролететь в атмосфере Земли и Марса сто тридцать пять километров. С подъемом и спуском это займет полтора часа. А. Н. Толстой, Аэлита.

||

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

Два с полтиной. Семь верст с гаком. Уплатить долг с процентами. Строгий выговор с предупреждением.

Приехала она домой через двое с половиной суток. Чехов, Попрыгунья.

||

при обозначении предмета, на который распространяется действие и который является пределом охвата действием.

Сесть с ногами на диван. Укрыться с головой одеялом. Съесть с потрохами. Вырвать с корнем.

В густой траве пропадешь с головой. Блок, В густой траве…

|

В составе некоторых устойчивых сочетаний и выражений.

С руками оторвать. Уйти с головой в работу.

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

2.

Употребляется при обозначении лица, предмета, явления и т. п., которое имеется у кого-л. при совершении действия, которым располагает, обладает кто-л.

Стоять на посту с автоматом. Сидеть у реки с удочкой. Остаться с тремя рублями.

3.

Употребляется при указании на предмет, свойство, наличие которого характеризует, определяет другой предмет, лицо, свойство.

Дом с мезонином. Девочка с косичками. Задача с двумя неизвестными. Платье с воланами. Нос с горбинкой. Черная с проседью борода.

В доме знали ее за девушку с характером. Тургенев, Яков Пасынков.

Дни были прохладные, ясные, с голубым небом и с прозрачной далью. Чехов, Палата № 6.

||

при указании на содержимое или содержание чего-л., наличие которого характеризует предмет.

Мешок с мукой. Корзина с углем. Бутылка с молоком. Письмо с жалобой. Заявление с просьбой об увольнении.

Навстречу едет воз со снопами. Чехов, Степь.

Под елкой лежали бумажные пакеты с подарками. А. Н. Толстой, Детство Никиты.

4.

Употребляется при обозначении действия, состояния, сопровождающего какое-л. другое действие.

Идти с песнями. Проснуться с головной болью.

Старушки с плачем обнялись. Пушкин, Евгений Онегин.

Там шла торговля бойкая, С божбою, с прибаутками. Н. Некрасов, Кому на Руси жить хорошо.

Его дивизия прошла с боями почти от самой границы. В. Кожевников, В полдень на солнечной стороне.

5.

Употребляется при обозначении характера, образа действия.

Ударить с силой. Есть с жадностью. Одеваться со вкусом. Ждать с нетерпением. Читать с выражением.

Он держал себя скромно, с достоинством. Достоевский, Идиот.

Генерал с трудом поднялся --- и пошел в свой блиндаж. М. Алексеев, Солдаты.

6.

Употребляется при обозначении предмета, лица, посредством или с помощью которого осуществляется действие.

Отправить пакет со связным. Мыть с мылом.

|

В составе некоторых устойчивых сочетаний и выражений.

Днем с огнем не сыщешь. Броситься с кулаками на кого-л.

7.

Употребляется при обозначении цели действия.

Явиться с докладом. Обратиться с просьбой. Сделать с намерением.

[Городничий:] Я пригласил вас, господа, с тем, чтобы сообщить вам пренеприятное известие. К нам едет ревизор. Гоголь, Ревизор.

8.

Употребляется при обозначении смежности, близости в пространстве.

Граница с Польшей. Комната, смежная с кухней. Сидеть рядом с сестрой.

Поравнявшись с первыми избушками, он круто своротил к огородам. Григорович, Антон-Горемыка.

В низеньком окне, в уровень с землею, отдувается коленкоровая занавеска. И. Гончаров, Обрыв.

|

При повторении существительного.

Столкнуться нос с носом.

Они лежали голова с головой и бок с боком. Л. Толстой, Воскресение.

9.

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

Встать с зарей. Выехать с рассветом.

Птицы замолчали с заходом солнца. Куприн, Болото.

С отъездом гостей в усадьбе все стихло. Короленко, Слепой музыкант.

— С темнотой никому не разрешается выходить на улицу без специальных пропусков. Степанов, Семья Звонаревых.

||

При количественно-временных существительных (во мн. ч. или с собирательным значением), а также при существительных с местоимением „каждый“ употребляется для указания на ряд последовательных промежутков времени и чередующихся явлений, по мере наступления которых развивается какое-л. действие или наступает какое-л. состояние.

Остепениться с годами. Поумнеть с возрастом.

С каждым шагом темный бор становился непроходимее. Загоскин, Юрий Милославский.

С каждым часом, с каждым километром идти становилось труднее. Арсеньев, В горах Сихотэ-Алиня.

10.

Употребляется при обозначении лица

или предмета, участвующего во взаимном, обоюдном действии.

Спорить с учителем. Торговаться с продавцом. Переписываться с родными. Соревноваться с соседним заводом.

[Моцарт:] Играл я на полу С моим мальчишкой. Пушкин, Моцарт и Сальери.

Ты знаешь край, где с Русью бились ляхи. А. К. Толстой, Ты знаешь край, где все обильем дышит.

11.

Употребляется при обозначении лица или предмета, к которому устанавливается какое-л. отношение другого лица или предмета (сходство или различие, связь и нарушение ее, соединение и отдаление и т. п.).

Познакомить с девушкой. Поссорить с приятелем. Связаться по телефону с Москвой. Сравнить с оригиналом. Согласиться с выводами.

И с песнями бокалов звон мешался. Пушкин, Была пора: наш праздник молодой.

Душа моя полна Разлукою с тобой и горьких сожалений. А. К. Толстой, На нивы желтые нисходит тишина.

Бурный поток рвет камни, чтобы слиться с морем. Сергеев-Ценский, Пушки заговорили.

||

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

Приехать одновременно с братом.

Какой смелый! И все знает, а — одних лет со мной. М. Горький, Жизнь ненужного человека.

[Грубек:] Боюсь, что мы с ним люди слишком разных взглядов. Симонов, Под каштанами Праги.

12.

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

Авария с самолетом. С больным обморок.

[Епиходов:] Каждый день случается со мной какое-нибудь несчастье. Чехов, Вишневый сад.

— У вас с дисциплиной дело плохо. Емельянова, Сестра.

13.

Употребляется при некоторых именах и глаголах для обозначения предмета, лица, на которые направлено действие.

Бороться с засухой. Справиться с работой. Освоиться с техникой. Поспешить с выводами. Быть осторожным с огнем.

Начальники поступали с ним как-то холодно-деспотически. Гоголь, Шинель.

[Горский:] Будьте снисходительны со мной. Тургенев, Где тонко, там и рвется.

Малый академический словарь. — М.: Институт русского языка Академии наук СССР. Евгеньева А. П.. 1957—1984.

dic.academic.ru

S7 Airlines | Buy air ticket online

bannerIdentifiers: 6ca8d987-9b19-4e35-86fe-ee5c767e35d1 dd377e02-3392-42d3-a547-fea6ecfac634 e243fd20-feb0-4ff6-92ce-1665f47179d3 71ffa597-5811-47ff-863d-5402101e1636 ,allNotifications: [[email protected][[email protected]421588[map={owner=dotcms.org.2897, identifier=5e303749-4e81-410a-b711-1fe82d236222, modDate=2018-06-21 11:17:10.141, languageId=1, title=FIFA 2018, content=

Dear participants of FIFA 2018, if you are going by ground transport to Kaliningrad from other Russian cities, please note that you need to have a schengen or Lithuanian transit visa.

, inode=1d035dc0-b2ee-45f2-b6a0-d8d0badab086, folder=SYSTEM_FOLDER, disabledWYSIWYG=[content], sortOrder=0, modUser=dotcms.org.2897, host=SYSTEM_HOST, lastReview=2018-06-21 11:17:10.011, stInode=18a11079-75e6-424d-84bc-c74a1e5fa4ee},lowIndexPriority=false],conAPI=com.dot[email protected]49a0077a,[email protected],fields=[[email protected][structureInode=18a11079-75e6-424d-84bc-c74a1e5fa4ee,fieldName=title|minLength:|maxLength:100|suggestFun:|maxDate:|minDate:|width:12|radioButtonType:horizontal,fieldType=text,fieldRelationType=,fieldContentlet=text1,required=true,velocityVarName=title,sortOrder=1,values=,regexCheck=,hint=,defaultValue=,indexed=true,listed=true,fixed=false,readOnly=false,searchable=true,unique=true,modDate=2018-04-16 17:49:11.011,iDate=2015-09-28 18:15:40.896,type=field,owner=,inode=28f373cc-4795-45c5-88a0-a2fe8f1f0fc4,identifier=], [email protected][structureInode=18a11079-75e6-424d-84bc-c74a1e5fa4ee,fieldName=content|minLength:|maxLength:null|suggestFun:|maxDate:|minDate:|width:12|radioButtonType:horizontal,fieldType=wysiwyg,fieldRelationType=,fieldContentlet=text_area1,required=false,velocityVarName=content,sortOrder=2,values=,regexCheck=,hint=,defaultValue=,indexed=true,listed=false,fixed=false,readOnly=false,searchable=true,unique=false,modDate=2018-04-16 17:49:11.02,iDate=2015-09-28 18:16:06.137,type=field,owner=,inode=346a1a11-4560-45a6-a814-433272905905,identifier=], [email protected][structureInode=18a11079-75e6-424d-84bc-c74a1e5fa4ee,fieldName=NotificationcontentNew-BannerAdManagement|minLength:|maxLength:null|suggestFun:|maxDate:|minDate:|width:12|radioButtonType:horizontal,fieldType=relationships_tab,fieldRelationType=,fieldContentlet=system_field1,required=false,velocityVarName=notificationcontentnewbanneradmanagement,sortOrder=3,values=,regexCheck=,hint=,defaultValue=,indexed=false,listed=false,fixed=false,readOnly=false,searchable=false,unique=false,modDate=2018-04-16 17:49:11.026,iDate=2015-09-28 18:18:58.085,type=field,owner=,inode=b4124ae8-d01b-46f8-9e91-edcee244484f,identifier=]],fieldMap=,fieldValueMap=,user=,EDIT_OR_PREVIEW_MODE=false,[email protected][map={template=t1, owner=dotcms.org.1, identifier=408c5c6b-95f1-464f-af6c-1d9c12fe4216, hostName=www.s7.ru, modDate=2018-03-13 18:19:10.909, aliases=www.s7.ru www.s7-airlines.com, keywords=авиабилеты, билеты на самолет, стоимость авиабилетов москва, заказ, онлайн, продажа авиа билета в москве, купить билет на самолет, авиабилет, runDashboard=false, languageId=1, description=S7 — крупнейшая авиакомпания на внутренних воздушных линиях России. На сайте www.s7.ru можно заказать авиабилеты онлайн или забронировать билет на самолет, осуществить покупку авиабилета online круглосуточно, pageWidth=doc3, otherInformation=Тест, inode=b915f63d-f864-4578-8e0e-fa60993a98c9, isDefault=true, folder=SYSTEM_FOLDER, disabledWYSIWYG=[], isSystemHost=false, sortOrder=0, modUser=dotcms.org.2915, host=SYSTEM_HOST, lastReview=2018-03-13 18:19:10.896, theme=default, stInode=855a2d72-f2f3-4169-8b04-ac5157c4380c},lowIndexPriority=false],[email protected]109933[name=NotificationContent new,description=NotificationContent new homepage,defaultStructure=false,reviewInterval=,reviewerRole=,pagedetail=,structureType=1,fixed=false,system=false,velocityVarName=NotificationcontentNew,urlMapPattern=,host=408c5c6b-95f1-464f-af6c-1d9c12fe4216,folder=SYSTEM_FOLDER,publishDateVar=,expireDateVar=,modDate=2015-09-28 18:18:58.102,iDate=2015-09-28 18:18:58.102,type=structure,owner=dotcms.org.2837,inode=18a11079-75e6-424d-84bc-c74a1e5fa4ee,identifier=],title=FIFA 2018,[email protected]fd79fa]]

www.s7.ru

Видеохостинг Rutube. Смотрите видео онлайн, бесплатно

Для тебя не осталось слов и мыслей хороших, нет. А я - новая, новая, ночь превращаю в рассвет, но снова одна. Я запуталась в глянце. Мы почти иностранцы в нём. Ты хотел уходить и смотреть, как я буду потом Бежать за тобой босиком. Сегодня, сегодня, сегодня ты, а завтра я. Запомни, мой сладкий - Все люди, как люди, а я - Суперзвезда. Звезда! А я - суперзвезда! Звезда! Мы другие планеты. Видно выбора больше нет. А я, da -; а я, da -; а я, dance станцевала тебе, красивый такой. А слова твои резали нежно. Сопротивляться почти бесполезно. Всё на паузу, всё на потом; на потом, на потом, на потом. А я, о -, а я очень хотела забыть обо всём. Бежать за тобой босиком. Сегодня, сегодня, сегодня ты, а завтра я. Запомни, мой сладкий - Все люди, как люди, а я - Суперзвезда. Звезда! А я - суперзвезда! Да, Звезда! Как всегда неразлучен ты с телефонными сучками. Мне с тобой очень скучно - не такая, как все я. Стоп, я не micro bitch! Я могу всего сама достичь. Люди, как люди. Низкие старты. Три к одному, что ты плачешь друзьям То, что я виновата, всё - окей. Зову подруг, прихожу с утра. Да, мне можно всё, я же суперзвезда.

rutube.ru


Смотрите также