Работа с типами

Задания раздела 2.5.2
2.33. С учетом определения переменных из этого раздела укажите то, что происходит в каждом из этих присвоений.
a=42; b=42; c=42;
d=42; e=42; g=42;
2.34. Напишите программу, содержащую переменные и присвоения из предыдущего упражнения. Выведите значения переменных до и после присвоений, чтобы проверить правильность предположений в предыдущем упражнении. Если они неправильны, изучите примеры еще раз и выясните, что привело к неправильному заключению.
2.35. Укажите типы, выведенные в каждом из следующих определений. Затем напишите программу, чтобы убедиться в своей правоте.
const int i=42;
auto j=i; const auto &k=i; auto *p=&i;
const auto j2=i, &k2=i;
Хоть первые два задания бессмысленны, есть немного теории!

p109_ex2-5-2

Итак, в этом разделе все начинается с псевдонимов типов typedef. Она нужна, чтобы запутать кого угодно (шпионов и нерадивых) в коде программы, особенно если код видишь первый раз.
typedef double security;
и всё, теперь тип double имеет синоним в виде security;
security i=2.48;
Так же с помощью typedef можно объявлять переменные:
typedef security spying, *p;
теперь spying это синоним типа double, а *p это указатель на тип double*;
так же можно объявить псевдоним еще проще
using SI=Sales_item;
using security=double;

#include <iostream>
int main ()
{
using security=double;
security i=3.14;
std::cout << i <<" " ;
return(0);
}
так же можно сделать такое объявление:
typedef char *pstring;
const pstring *ps;
ps - это указатель на константный указатель на тип char.
Можно еще вот так:
typedef char *pstring;
const psting cstr=0;
А теперь дословно перепечатываю и в рамочку:

Неправильно интерпретировать объявление, которое использует псевдоним типа как концептуальную замену псевдонима, соответствующим ему типом:
const char *cstr=0;
Эта интерпретация неправильна. Когда используется тип pstring в объявлении, базовым типом объявления является тип указателя. При перезаписи объявления с использованием char*, базовым типом будет char, а * будет частью оператора объявления. В данном случае базовый тип - это const char. Перезапись объявляет cstr указателем на тип const char, а не константным указателем на тип чар.

Что написано выше, я при прочтении не понял. Надо медитировать.

Так, теперь про auto. Автотипирование (где-то слышал модное слово) используется, когда тип сходу придумать не удаётся. Обычно если переменную инициализируем результатом какого-то вычисления - компилятор может сам разобраться (да, он умнее меня). При определении нескольких переменных типом auto (да, они должны быть инициализированы обязательно) их типы должны совпасть.
auto i=0, b=2.65; - так нельзя делать
Ссылка использует объект, на который ссылается:
int i=0; &r=i;
auto a=r; // переменная a становится типа int
Всякое с auto:
int i=0; &r=i;
const int ci=i, &cr=ci;
auto b=ci; /* b становится типа int (const у ci верхнего уровня и он отбрасывается) */
auto c=cr; /* то же самое что и у b, то есть тип int, а const верхнего уровня мне не нужен */
auto d=&i; /* &i - это адрес, значит d будет указателем на тип int, потому что i не константа */
auto e=&ci; /* &ci - содержит адрес константы, и чтобы не пытаться его изменить обращением через указатель, надо бы записать его в указатель на константу (нижнего уровня) */

если вдруг надо, чтобы спецификатор const верхнего уровня был, надо указать его явно:
int i=0; const int ci=i;
const auto f=ci; // компилятор определит тип f как int, а я от себя добавлю const

запросить тип ссылки так же можно руками:
int i=0; const int ci=i;
auto &g=ci; // g имеет тип const int&
auto &h=42; // ссылка на литерал не может быть простой
const auto &j=42; // а так можно

При определении нескольких переменных в том же операторе важно не забывать, что ссылка или указатель - это часть специфического оператора объявления. Как обычно, инициализаторы должны быть совместимы с автоматически выведенными типами:
int i=0; const int ci=i;
auto k=ci, &l=i; // k - тип int, l - int&
auto &m=ci, *p=&ci; // m - const int&, p - указатель на константу (const int)
auto &n=i, *p2=&ci; /* а так нельзя, потому что разные типы у переменных. n - int, p2 - указатель на const int

2.33. С учетом определения переменных из этого раздела укажите то, что происходит в каждом из этих присвоений.
a=42; b=42; c=42;
d=42; e=42; g=42;

У меня просто нет слов. Что здесь происходит? Ничего. Где типы я вас спрашиваю? Сэкономили чернила и место снова.

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

Еще раз доброе утро. Просто прочитаю тему еще раз. На всякий случай.

2.35. Укажите типы, выведенные в каждом из следующих определений. Затем напишите программу, чтобы убедиться в своей правоте.
const int i=42;
auto j=i; const auto &k=i; auto *p=&i;
const auto j2=i, &k2=i;

const int i=42;
auto j=i; // j - int
const auto &k=i; // auto выводит тип int, я дописываю const
auto *p=&i; // указатель на const int. i - константа, указатель соответствующий
const auto j2=i, &k2=i; /* i- константа, &k2 - запрашиваю ссылку на константу (константную), поэтому j2 тоже надо быть константой, чтобы не нафэйлить с объявлением разных типов одним auto*/

#include <iostream>
int main ()
{
const int i=42;
auto j=i;
const auto &k=i;
auto *p=&i;
const auto j2=i, &k2=i;
return(0);
}

Вот программа, она ошибок не выдаёт, значит написано всё правильно. Тема не сложная с auto, а выделенное жирным и в рамочке надо будет просто понять.

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