Что такое c – C++ — это… Что такое C++?

Содержание

Что такое Net Framework и язык C#? — Хабр Q&A

Опускаясь до уровня «на пальцах»:
Например, можно написать программу на ассемблере (поскольку он платформеннозависимый), ваша программа будет выполняться, например, только на процессорах архитектуры x86. При этом, вам придётся писать эту же программу для другой архитектуры.

Поднимемся выше. Напишем программу на C или С++. Она уже отчасти платформеннонезависима, так как при компиляции на разных архитектурах, та или иная реализация компилятора учитывает особенности платформы и генерирует совместимый машинный код. Но допустим, вам необходимо написать что-то сложнее hello world. Вы ищете подходящий функционал в стандартных библиотеках и, допустим, не находите. Зато вы находите подходящую библиотеку А, но вдруг выясняется, что она использует компоненты сторонней библиотеки Б, которая …
Ну, в целом, цепочка зависимостей может быть весьма длинной. И вот, ваш проект, ради одной фичи обрастает кучей зависимостей. Более того, вы сталкиваетесь с проблемами лицензирования, так как программный код, который вы гуглите и скачиваете из интернетов, скорее всего распространяется как Open Source, а значит — вы не можете закрывать свой исходный код (всё немного сложнее, но если ваши намерения по распространению своего проекта выходят несколько дальше, чем лабораторная работа по информатике, эти проблемы могут возникнуть).

У вас может возникнуть желание написать свой «велосипед» под себя, но, тем самым, вы тратите время на создание некоего вспомогательного компонента, и вообще, ваша программа не про это.

Теперь перейдём к .Net Framework. Разработчики постарались для вас и написали несколько десятков (или сотен) тысяч классов практически подо все умозрительные задачи, которые могут вам понадобиться, то есть это «кубики лего», позволяющие вам БЫСТРО писать приложения, сосредоточившись на логике вашей программы.
Вам не надо реализовывать свой файловый ввод-вывод, работу с сетью, криптографию, коллекции, работу с базами данных и пр. Всё уже есть, всё пишется в 1-2 строки. Всё готово к употреблению.

Как же этим пользоваться? В объектами фреймворка можно работать на нескольких языках: C#, VB.Net, F# и что там ещё напридумывали, все они взаимодействуют с Common Language Runtime и имеют доступ ко всем классам фреймворка.

qna.habr.com

С++ — это… Что такое С++?

Проект под названием 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

C++ | Введение

Язык программирования C++

Последнее обновление: 28.08.2017

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

Своими корнями он уходит в язык Си, который был разработан в 1969—1973 годах в компании Bell Labs программистом Деннисом Ритчи (Dennis Ritchie). В начале 1980-х годов датский программист Бьерн Страуструп (Bjarne Stroustrup), который в то время работал в компании Bell Labs, разработал С++ как расширение к языку Си. Фактически вначале C++ просто дополнял язык Си некоторыми возможностями объектно-ориентированного программирования. И поэтому сам Страуструп вначале называл его как «C with classes» («Си с классами»).

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

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

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

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

Основные этапы развития

В 1979-80 годах Бьерн Страуструп разработал расширение к языку Си — «Си с классами». В 1983 язык был переименован в С++.

В 1985 году была выпущена первая коммерческая версия языка С++, а также первое издание книги «Языка программирования C++», которая представляла первое описание этого языка при отсутствии официального стандарта.

В 1989 была выпущена новая версия языка C++ 2.0, которая включала ряд новых возможностей. После этого язык развивался относительно медленно вплоть до 2011 года. Но при этом в 1998 году была предпринята первая попытка по стандартизации языка организацией ISO (International Organiztion for Standartization). Первый стандарт получил название ISO/IEC 14882:1998 или сокращенно С++98. В дальнейшем в 2003 была издана новая версия стандарта C++03.

В 2011 году был издан новый стандарт C++11, который содержал множество добавлений и обогащал язык С++ большим числом новых функциональных возможностей. После этого в 2014 году было выпущено небольшое добавление к стандарту, известное также как C++14. И еще один ключевой релиз языка намечен на 2017.

Компиляторы и среды разработки

Для разработки программ на С++ необходим компилятор — он транслирует исходный код на языке С++ в исполняемый файл, который затем можно запускать. Но в настоящий момент есть очень много различных компиляторов. Они могут отличаться по различным аспектам, в частности, по реализации стандартов. Базовый список компиляторов для С++ можно посмотреть в википедии. Рекомендуется для разработки выбирать те компиляторы, которые развиваются и реализуют все последние стандарты. Так, на протяжении всего руководства преимущественно будет использоваться свободно распространяемый компилятор g++, разработанный в рамках проекта GNU.

Также для создания программ можно использовать интегрированные среды разработки IDE, такие как Visual Studio, Netbeans, Eclipse, Qt и т.д.

metanit.com

C++ — Операторы

Уважаемый пользователь! Реклама помогает поддерживать и развивать наш проект, делая его простым и удобным специально для Вас. Если проект интересный и важный для Вас, то отключите на нем блокировщик рекламы. Спасибо, что читаете сайт!

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

  • Арифметические операторы
  • Реляционные операторы
  • Логические операторы
  • Побитовые операторы
  • Операторы присваивания
  • Другие операторы

Арифметические операторы

Существуют следующие арифметические операторы, поддерживаемые языком C ++:

ОператорОписаниеПример
+Добавляет два операндаA + B даст 30
Вычитает второй операнд с первогоA — B даст -10
*Умножает оба операндаA * B даст 200
/Делит числитель на де-числительB / A даст 2
%Оператор модуля и остаток после целочисленного деленияB% A даст 0
++Оператор приращения увеличивает целочисленное значение на единицуA ++ даст 11
Уменьшает целочисленное значение на единицуA— даст 9

Реляционные операторы

Существуют следующие реляционные операторы, поддерживаемые языком C ++:

ОператорОписаниеПример
==Проверяет, равны ли значения двух операндов или нет, если да, то условие становится истинным.(A == B) не соответствует действительности.
знак равноПроверяет, равны ли значения двух операндов или нет, если значения не равны, условие становится истинным.(A! = B) истинно.
>Проверяет, превышает ли значение левого операнда значение правого операнда, если да, тогда условие становится истинным.(A> B) неверно.
<Проверяет, является ли значение левого операнда меньше значения правильного операнда, если да, тогда условие становится истинным.(A <B) истинно.
> =Проверяет, превышает ли значение левого операнда значение правого операнда, если да, тогда условие становится истинным.(A> = B) неверно.
<=Проверяет, является ли значение левого операнда меньше или равно значению правильного операнда, если да, тогда условие становится истинным.(A <= B) истинно.

Логические операторы

Существуют следующие логические операторы, поддерживаемые языком C ++:

ОператорОписаниеПример
&&Вызывается логическим оператором AND. Если оба операнда отличны от нуля, условие становится истинным.(A && B) является ложным.
||Вызывается логическим оператором ИЛИ. Если любой из двух операндов отличен от нуля, тогда условие становится истинным.(A || B) истинно.
!Вызывается логическим оператором NOT. Используется для изменения логического состояния операнда. Если условие истинно, то логический оператор NOT сделает ложным.! (A && B) истинно.

Побитовые операторы

Побитовый оператор работает с битами и выполняет побитовую операцию. Таблицы истинности для &, |, и ^ заключаются в следующем:

pqp & qp | qp ^ q
00000
01011
11110
10011

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

ОператорОписаниеПример
&Двоичный оператор AND копирует бит в результат, если он существует в обоих операндах.(A & B) даст 12, что составляет 0000 1100
|Двоичный оператор OR копирует бит, если он существует в любом из операндов.(A | B) даст 61, который равен 0011 1101
^Оператор двоичного XOR копирует бит, если он установлен в один операнд, но не тот и другой.(A ^ B) даст 49, который равен 0011 0001
~Binary Ones Оператор дополнения является унарным и имеет эффект «flipping» бит.(~ A) даст -61, что составляет 1100 0011 в форме дополнения 2 из-за подписанного двоичного числа.
<<Двойной левый оператор сдвига.Значение левых операндов перемещается влево на количество бит, заданных правым операндом.A << 2 даст 240, что составляет 1111 0000
>>Двоичный оператор правого сдвига. Значение левых операндов перемещается вправо на количество бит, заданных правым операндом.A >> 2 даст 15, что составляет 0000 1111

Операторы присваивания

Существуют следующие операторы присваивания, поддерживаемые языком C ++:

ОператорОписаниеПример
знак равноПростой оператор присваивания, присваивает значения из правых операндов в левый операнд.C = A + B присваивает значение A + B в C
+ =Оператор Add AND присваивания, Он добавляет правый операнд в левый операнд и присваивает результат левому операнду.C + = A эквивалентно C = C + A
знак равноSubtract AND assign operator, вычитает правый операнд из левого операнда и присваивает результат левому операнду.C — = A эквивалентно C = C — A
знак равноОператор умножения и присваивания, Он умножает правый операнд на левый операнд и присваивает результат левому операнду.C * = A эквивалентно C = C * A
знак равноОператор Divide AND assign. Он делит левый операнд на правый операнд и присваивает результат левому операнду.C / = A эквивалентно C = C / A
знак равноМодуль и оператор присваивания, он принимает модуль с использованием двух операндов и присваивает результат левому операнду.C% = A эквивалентно C = C% A
<< =Оператор сдвига слева и.C << = 2 совпадает с C = C << 2
>> =Оператор правой смещения и назначения.C >> = 2 совпадает с C = C >> 2
знак равноПобитовый И оператор присваивания.C & = 2 является таким же, как C = C & 2
^ =Побитовое исключающее ИЛИ и оператор присваивания.C ^ = 2 является таким же, как C = C ^ 2
| =Побитовое включение оператора OR и присваивания.C | = 2 совпадает с C = C |2

Другие операторы

В следующей таблице перечислены некоторые другие операторы, поддерживаемые C ++:

ОператорОписание
sizeof

Возвращает размер переменной. Например, sizeof (a), где ‘a’ является целым числом и будет возвращать 4.

Condition ? X : Y

Если Условие истинно, то оно возвращает значение X, иначе возвращает значение Y.

,

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

. (dot) and -> (arrow)

Используются для ссылки на отдельных членов классов, структур и союзов.

Cast

Преобразуют один тип данных в другой. Например, int (2.2000) вернет 2.

&

Возвращает адрес переменной. Например, & a; даст фактический адрес переменной.

*

Является указателем на переменную. Например * var; будет указывать на переменную var.

Приоритеты операторов в C ++

Приоритет оператора определяет группировку терминов в выражении. Это влияет на оценку выражения. Некоторые операторы имеют более высокий приоритет, чем другие; например, оператор умножения имеет более высокий приоритет, чем оператор сложения —

Например, x = 7 + 3 * 2; здесь x назначается 13, а не 20, потому что оператор * имеет более высокий приоритет, чем +, поэтому он сначала умножается на 3 * 2, а затем добавляется в 7.

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

Категория Оператор Ассоциативность 
постфикс () [] ->. ++ — —  Слева направо 
Одинарный + -! ~ ++ — — (тип) * & sizeof Справа налево 
Multiplicative  * /% Слева направо 
присадка  + — Слева направо 
сдвиг  << >> Слева направо 
реляционный  <<=>> = Слева направо 
равенство  ==! = Слева направо 
Побитовое AND Слева направо 
Побитовое XOR Слева направо 
Побитовое OR Слева направо 
Логические AND && Слева направо 
Логический OR || Слева направо 
условный ?: Справа налево 
присваивание = + = — = * = / =% = >> = << = & = ^ = | = Справа налево 
запятая Слева направо

 

Уважаемый пользователь! Реклама помогает поддерживать и развивать наш проект, делая его простым и удобным специально для Вас. Если проект интересный и важный для Вас, то отключите на нем блокировщик рекламы. Спасибо, что читаете сайт!

unetway.com

Microsoft Visual C++ — это… Что такое Microsoft Visual C++?

Question book-4.svgВ этой статье не хватает ссылок на источники информации. Информация должна быть проверяема, иначе она может быть поставлена под сомнение и удалена.
Вы можете отредактировать эту статью, добавив ссылки на авторитетные источники.
Эта отметка установлена 12 мая 2011.

Microsoft Visual C++ (MSVC) — интегрированная среда разработки приложений на языке C++, разработанная фирмой Microsoft и поставляемая либо как часть комплекта Microsoft Visual Studio, либо отдельно в виде бесплатного функционально ограниченного комплекта Visual C++ Express Edition. Сменила интегрированную среду разработки Microsoft QuickC.

Проблемы с содержанием статьиПроверить информацию.

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

Visual C++ поддерживает разработку приложений как на Managed C++ и C++/CLI, так и на обычном C++, и тем самым позволяет генерировать код как для платформы .NET Framework, так и для исполнения в среде «чистой» Windows. В этом отношении Visual C++ является уникальным среди других языковых средств, предоставляемых средой Visual Studio, поскольку ни Visual Basic .NET, ни Visual J# не способны генерировать код для чистого Win32, в отличие от предыдущих версий (Visual Basic и Visual J++ соответственно).

Последняя версия

Последняя версия Visual C++ (11.0) входит в комплект Visual Studio 2012. Предоставляет разработчикам более мощные средства. Присутствует поддержка нескольких мониторов.

Ссылки

Литература

  • Айвор Хортон Microsoft Visual C++ 2005: базовый курс = Beginning Visual C++ 2005. — М.: «Диалектика», 2007. — С. 1152. — ISBN 0-7645-7197-4

dik.academic.ru

Что такое USB Type C: Достоинства и недостатки

Новый стандарт USB имеет много достойных преимуществ, но также не лишен и недостатков. Разберемся с USB Type C – что же это такое, как распознать его в устройстве, и чем такой разъем лучше.

Особенности

Новый порт USB Type-C стал компактнее своих предшественников. Его главное отличие – симметричность разъема, поэтому у такого кабеля нельзя перепутать верх и низ. Он разработан под версию 3.1 интерфейса USB. Ее отличает увеличенная скорость передачи данных – до 10 Гб в сек – и усиленный ток до 5 А. При этом версия 3.1 еще может быть изредка представлена в привычном формате разъема Type-A, а Type-С работает только под протоколом 3.1.

Разъем тайп юсб си выделяется большим числом контактов, образующими линии:

  • высокоскоростной передачи данных до 10 Гб/с;
  • низкоскоростной передачи до 480 Мб/с для совместимости со старыми устройствами;
  • питание с регулируемой в зависимости от потребности техники силой тока;
  • согласующая;
  • дополнительная – для передачи аудио.

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

Преимущества

К преимуществам USB Type-C отнесем:

  • кабель можно вставлять любой стороной;
  • увеличенная мощность питания уменьшает время подзарядки телефонов, позволяет подключать периферийные устройства – мониторы, колонки;
  • совместимость с предыдущими стандартами, начиная с USB1;
  • компактность – позволяет делать мобильные гаджеты более тонкими.

Также новый разъем в альтернативных режимах может работать как DisplayPort (подключение внешнего монитора с разрешением до 3840х2400), соединяться без адаптеров с портами HDMI, MHL и Thunderbolt.

Недостатки

Не лишен интерфейс и недостатков:

  • не самая прочная конструкция из-за большого количества контактов в центре;
  • увеличенный уровень напряжения при недостаточном контроле может вызвать перегрев и возгорание устройства – это произошло с Samsung Galaxy Note 7;
  • для подключения старых гаджетов понадобятся переходник micro USB, Type-A на версию C;
  • не все кабели и устройства Type-C поддерживают все его возможные функции – можно столкнуться с неполной совместимостью внешне одинаковых портов.

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

Доступные устройства

В формате USB-C выпускают флешки, хотя стоимость их выше аналогов с обычным разъемом. Новый порт вы найдете в ноутбуках MacBook, Samsung Notebook 9, Chromebook Pixel 2. Телефоны с USB type C – Xiaomi Mi5S, OnePlus 2 и 3Т, Google Nexus 5X и 6Р, HTC 10, Meizu Pro 6 Plus, LG G5.

Заключение

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

droidov.com

C++ в современном мире / PVS-Studio corporate blog / Habr

Дискуссии о текущем положении C++ в мире программирования, как правило, делят участников на два фронта: одни этот язык недолюбливают, пророча ему скорую гибель; другие же наоборот утверждают, что на C++ писали, пишут и будут писать. Я бы сказал, что истина находится где-то посередине, но это означало бы, что C++ находится в неком «подвешенном» состоянии, в котором он был, например, между выходами стандартов C++03 и C++11. На самом деле всё обстоит немного иначе. Как? Давайте попробуем в этом разобраться.

Идём ко дну?


Ничего подобного. Может быть C++ не настолько популярен в плане изучения начинающими программистами, как C# или Java, может быть под него не затачиваются новые технологии, выпускаемые корпорациями-гигантами, может быть он не продвигается теми же Microsoft и Oracle, но сказать, что C++ пошёл на дно — значит нагло соврать. Программное обеспечение, написанное с использованием C++, никуда не делось и требует поддержки. Новое ПО, например, игровые движки, также вовсю использует C++, а стандарты C++11, C++14 и готовящийся C++17 только подтверждают, что дела у этого языка программирования идут неплохо. Но давайте обо всё по порядку.

C++11, C++14, C++17…


Как упоминалось ранее, между стандартами C++11 и C++03 язык находился в своеобразном «подвешенном» состоянии. Вроде бы развивались и дополнялась такие библиотеки, как boost, Qt и прочие, появился C++/CLI, а нового официального стандарта всё не было и не было.

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

Отлично, стандарт C++11 вышел, а что дальше? Опять простой на 8 лет? А вот и нет. Ни для кого не новость, что уже вышел стандарт C++14. Нет, о таком расширении, какое привнёс C++11, и речи не идёт, но дополнения и улучшения имеют место быть.

Но что не менее важно — тенденция не потеряна и на горизонте уже виднеются заготовки для нового стандарта — C++17.

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

А что же со старым ПО?

Существующее программное обеспечение


С использованием C++ написано множество программного обеспечения. И, конечно, его необходимо поддерживать. Хотите взглянуть на реальные примеры? Пожалуйста, соответствующий список в помощь. Наверняка вы найдёте там немало знакомых продуктов. Не думаю, что кто-то кинется переписывать существующий работающий С++ код на C# или Java, только потому, что так будет удобнее в дальнейшем, потому, что «сборщики мусора» и т.д. и т.п. Выходит, что знания C++ снова необходимы. А с учётом того, что C++ стал намного удобнее в работе с выходом новых стандартов, идея писать модули/дополнения на современном C++ имеет место быть и не выглядит безумной. В дальнейшем такой код будет куда проще поддерживать. В то же время это всё тот же производительный C++, с обширнейшим набором возможностей. А дополненная стандартная библиотека позволит использовать уже готовые решения без необходимости изобретения велосипедов.

Популярность среди начинающих


На этом фронте дела идут не слишком гладко: С++ не слишком популярный язык среди начинающих программистов и существенно проигрывает таким языкам, как C# или Java. Почему? Тут можно выделить несколько причин:

Высокий порог вхождения


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

Тем не менее, хоть вероятность этого весьма снижена, прострелить себе ногу при желании всё же можно.

Слабое продвижение


Думаю, ни для кого не секрет, как продвигаются такие языки как C# или Java корпорациями-владельцами: Microsoft и Oracle. Не буду наверняка говорить про Java, так как с тенденциями на этом фронте не слишком знаком, но вот со стороны Microsoft продвижения весьма заметно. Большинство технологий Microsoft затачиваются именно под C#. Хакатоны, проводимые Microsoft, опять же проходят с использованием C#. Нет, это не плохо, просто констатация факта.

Для C++ такой поддержки нет. Да, для него выпускаются различные инструменты, позволяющие облегчить работу и процесс создания приложений. Тут стоит вспомнить тот же Qt, недавно вышедший ReSharper C++ от JetBrains. В Visual Studio 2015 ввели поддержку некоторых нововведений из последних стандартов, плюс некоторые дополнительные функции — работать стало удобнее.

Но с масштабом вышеупомянутых продвижений это всё же в сравнение не идёт.

Специализация


Несмотря на то, что C++ — язык, дающий разработчику, как говорится, все карты в руки, область его применения не всеобъемлюща и занимает определённую нишу. Конкуренты есть, это тоже оказывает свое влияние. Взять, например, мобильную разработку. Основные платформы заняты теми или иными языками: Windows Phone — C#, Android — Java, iOS — Objective-C. И это вовсе не означает, что под эти платформы нет возможности писать на C++, вопрос лишь в том, насколько это будет удобно и будет ли также эффективно. Для веба, разработка под который с каждым годом становится популярнее и популярнее, C++ тоже не очень подходит. Возможность работы с сокетами есть, библиотеки, наподобие Wt, есть. Но вы много слышали о веб-приложениях, работающих на С++? Вот и я нет. С учётом того, что мобильная и веб-разработка стали очень популярны и только набирают обороты, понятен выбор начинающих в пользу других языков.

TIOBE Index


Слова словами, но, как говорится, лучше 1 раз увидеть, чем 100 раз услышать.

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

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

Заключение


Думаю, что вы уже сформировали мнение о текущем положении C++ в современном мире. Позвольте и мне высказать своё.

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


Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: Sergey Vasiliev. C++ in the modern world.

habr.com

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *