Лекции (13) (1119484)
Текст из файла
Введение в С++11(стандарт ISO/IEC 14882:2011 )Вне рассмотрения в рамках курса остаются нововведения для работыс шаблонами: ведение понятий лямбда-функций и выражений, внешние шаблоны, альтернативный синтаксис шаблонных функций, расширение возможностей использования угловых скобок в шаблонах, typedef для шаблонов, шаблоны с переменным числом аргументов, статическая диагностика, изменения в STL, регулярные выражения.Не рассматриваются также новые понятия тривиального класса, класса с простым размещением, explicit перед функциями преобразования, новшества в ограничениях для union, новые строковые литералы, новые символьные типы char16_t и char32_t для хранения UTF-16 и UTF-32символов, некоторое другое...1Введение в С++11(стандарт ISO/IEC 14882:2011 )Полностью новый стандарт поддерживаюткомпиляторы g++ начиная с версии 4.7. …Для компиляции программы в соответствии с новымстандартом в командной строке в качестве опциикомпилятору g++ надо указать:-std=c++0x (или в новых версиях -std=c++11 ) :g++ ………….
-std=c++0x(или g++ ………… -std=c++11)2Введение в С++11rvalue- ссылкиВ С++11 появился новый тип данных – rvalue-ссылка:<тип> && <имя> = <временный объект>;В С++11 можно использовать перегруженные функции длянеконстантных временных объектов, обозначаемых посредствомrvalue-ссылок.Например:class A; … A a; …void f (A & x);~ f (a);void f (A && y);~ f ( A() );…A && rr1 = A();// A && rr2 = a; // Err!int && n = 1+2;n++;…3Введение в С++11Семантика переноса (Move semantics).При создании/уничтожении временных объектов неплоскихклассов, как правило, требуется выделение-освобождениединамической памяти, что может отнимать много времени.Однако, можно оптимизировать работу с временнымиобъектами неплоских классов, если не освобождать ихдинамическую память, а просто перенаправить указатель на неев объект, который копирует значение временного объектанеплоского класса (посредством поверхностного копирования).При этом после копирования надо обнулить соответствующиеуказатели у временного объекта, чтобы его конструктор ее незачистил.Это возможно сделать с помощью перегруженных конструкторакопирования и операции присваивания с параметрами – rvalueссылками.
Их называют конструктором переноса ( moveconstructor) и операцией переноса ( move assignment operator).При этом компилятор сам выбирает нужный метод класса, еслиего параметром является временный объект.4Введение в С++11Семантика переноса (Move semantics).Пример:class Str {char * s;int len;public:Str (const char * sss = NULL); // обычный конструктор неплоского классаStr (const Str &); // традиционный конструктор копированияStr (Str && x) { // move constructors = x.s;x.s = NULL; // !!!len = x.len;}Str & operator = (const Str & x); // обычная перегруженная операция =Str & operator = (Str && x) { // move assignment operators = x.s;x.s = NULL; // !!!len = x.len;return *this;}~Str(); // традиционный деструктор неплоского класса5Str operator + ( Str x);...};Введение в С++11Семантика переноса (Move semantics).Использование rvalue-ссылок в описании методов классаStr приведет к более эффективной работе, например,следующих фрагментов программы:...
Str a(“abc”), b(“def”), c;c = b+a; // Str& operator= (Str &&);...Str f (Str a ) {Str b; ... return a;}... Str d = f (Str (“dd”) ); ... // Str (Str &&);6Введение в С++11Обобщенные константные выражения .Введено ключевое словоconstexpr,которое указывает компилятору, что обозначаемое имвыражение является константным, что в свою очередьпозволяет компилятору вычислить его еще на этапекомпиляции и использовать как константу.Пример:constexpr int give5 () {return 5;}int mas [give5 () + 7];// создание массива из 12// элемнтов, так можно в С++11.7Введение в С++11Обобщенные константные выражения .Однако, использование constexpr накладывает жесткиеограничения на функцию:она не может быть типа void;тело функции должно быть вида return выражение;выражение должно быть константой,функция, специфицированная constexpr не можетвызываться до ее определения.В константных выражениях можно использовать нетолько переменные целого типа, но и переменныедругих числовых типов, перед определением которыхстоит constexpr.Пример:constexpr double a = 9.8;constexpr double b = a/6;8Введение в С++11Вывод типов.Описание явно инициализируемой переменной можетсодержать ключевое слово auto: при этом типомсозданной переменной будет тип инициализирующеговыражения.Пример:Пусть ft(....) – шаблонная функция, которая возвращаетзначение шаблонного типа, тогда при описанииauto var1 = ft(....);переменная var1 будет иметь соответствующийшаблонный тип.Возможно также:auto var2 = 5; // var2 имеет тип int9Введение в С++11Вывод типов.Для определения типа выражения во время компиляции при описаниипеременных можно использовать ключевое слово decltype.Пример:int v1;decltype (v1) v2 = 5; // тип переменной v2 такой же, как у v1.Вывод типов наиболее интересен при работе с шаблонами, а также дляуменьшения избыточности кода.Пример: Вместоfor(vector <int>::const_iterator itr = myvec.cbegin(); itr != myvec.cend(); ++itr)...можно написать:for(auto itr = myvec.cbegin(); itr != myvec.cend(); ++itr) ...10Введение в С++11For-цикл по коллекции.Введена новая форма цикла for, позволяющаяавтоматически осуществлять перебор элементовколлекции (массивы и любые другие коллекции, длякоторых определены функции begin () и end()).Пример:int arr[5] = {1, 2, 3, 4, 5};for (int &x : arr) {x *= 2;} ...При этом каждый элемент массива увеличится вдвое.for (int x : arr) {cout << x << ‘ ‘;} ...11Введение в С++11Улучшение конструкторов объектов.В отличие от старого стандарта новый стандарт С++11позволяет вызывать одни конструкторы класса (такназываемые делегирующие конструкторы) из других, чтов целом позволяет избежать дублирования кода.Пример:class A {int n;public:A (int x) : n (x) { }A ( ) : A (14) { }};12Введение в С++11Улучшение конструкторов объектов.Стало возможно инициализировать члены-данные класса в областиих объявления в классе.Пример:class A {int n = 14;public:explicit A (int x) : n (x) { }A(){}};Любой конструктор класса А будет инициализировать n значением14, если сам не присвоит n другое значение.Замечание: Если до конца проработал хотя бы один делегирующийконструктор, его объект уже считается полностью созданным.Однако, объекты производного класса начнут конструироватьсятолько после выполнения всех конструкторов (основного и егоделегирующих) базовых классов.13Введение в С++11Явное замещение виртуальных функций ифинальность .В С++11 добавлена возможность (с помощью спецификатора override)отследить ситуации, когда виртуальная функция в базовом классе и впроизводных классах имеет разные прототипы, например, в результатеслучайной ошибки (что приводит к тому, что механизм виртуальностидля такой функции работать не будет).Кроме того, введен спецификатор final, который обозначаетследующее:- в описании классов - то, что они не могут быть базовыми для новыхклассов,- в описании виртуальных функций - то, что возможные производныеклассы от рассматриваемого не могут иметь виртуальные функции,которые бы замещали финальные функции.Замечание: спецификаторы override и final имеют специальныезначения только в приведенных ниже ситуациях, в остальных случаяхони могут использоваться как обычные идентификаторы.14Введение в С++11Явное замещение виртуальных функций ифинальность .Пример:struct B {virtual void some_func ();virtual void f (int);virtual void g () const;};struct D1 : public B {virtual void sone_func () override; // Err: нет такой функции в Вvirtual void f (int) override;// OK!virtual void f (long) override;// Err: несоответствие типа параметраvirtual void f (int) const override;// Err: несоответствие квалификации функцииvirtual int f (int) override; // Err: несоответствие типа результатаvirtual void g () const final; // OK!virtual void g (long);// OK: новая виртуальная функция15};Введение в С++11Явное замещение виртуальных функций ифинальность .Пример:struct D2 : D1 { // см.
предыдущий слайдvirtual void g () const;// Err: замещение финальной функции};struct F final {int x,y;};struct D : F {int z;};// Err: наследование от финального класса16Введение в С++11Константа нулевого указателя.В С++ NULL – это константа 0, что может привести кнежелательному результату при перегрузке функций:void f (char *);void f (int);При обращении f (NULL) будет вызвана f (int); ,что, вероятно, несовпадает с планами программиста.В С++11 введено новое ключевое слово nullptr для описанияконстанты нулевого указателя:std::nullptr_t nullptr;где тип nullptr_t можно неявно конвертировать в тип любогоуказателя и сравнивать с любым указателем.Неявная конверсия в целочисленный тип недопустима, заисключением bool (в целях совместимости).Для обратной совместимости константа 0 также можетиспользоваться в качестве нулевого указателя.17Введение в С++11Константа нулевого указателя.Пример:char * pc = nullptr;// OK!int * pi = nullptr;// OK!bool b = nullptr;// OK: b = false;int i = nullptr;// Err!f (nullptr);// вызывается f(char*) а не f(int).18Введение в С++11Перечисления со строгой типизацией.В С++ :перечислимый тип данных фактически совпадает с целым типом,если перечисления заданы в одной области видимости, то имена ихконстант не могут совпадать.В С++11 наряду с обычным перечислением предложен такжеспособ задания перечислений, позволяющий избежать указанныхнедостатков.
Характеристики
Тип файла PDF
PDF-формат наиболее широко используется для просмотра любого типа файлов на любом устройстве. В него можно сохранить документ, таблицы, презентацию, текст, чертежи, вычисления, графики и всё остальное, что можно показать на экране любого устройства. Именно его лучше всего использовать для печати.
Например, если Вам нужно распечатать чертёж из автокада, Вы сохраните чертёж на флешку, но будет ли автокад в пункте печати? А если будет, то нужная версия с нужными библиотеками? Именно для этого и нужен формат PDF - в нём точно будет показано верно вне зависимости от того, в какой программе создали PDF-файл и есть ли нужная программа для его просмотра.