type conversions c
Перегляньте різні перетворення типів, що підтримуються в C ++.
Ми сподіваємось, ви повинні знати про всі типи даних, доступні в C ++ із наших попередніх підручників. Іноді може виникнути така потреба, що нам потрібно перетворити один тип на інший. Це називається перетворенням типу або литтям типу.
У цьому підручнику ми обговоримо різні перетворення типів, що підтримуються в C ++.
найкращий безкоштовний брандмауер для Windows 10 2018
=> Клацніть тут для безкоштовного курсу C ++.
Що ви дізнаєтесь:
Перетворення типів
C ++ підтримує два типи перетворень типів:
- Неявне перетворення типу: Неявне перетворення типу відбувається автоматично. Користувач не перешкоджає цьому типу перетворення, і компілятор безпосередньо здійснює перетворення. Перетворення зазвичай здійснюється, коли у виразі є більше одного типу даних. Але загалом, при цьому типі перетворення існує ймовірність втрати даних, втрати ознак або переповнення даних.
- Явне перетворення типів: Явне перетворення типів визначається користувачем і зазвичай називається 'литтям типу'. Тут користувач передає або перетворює значення одного типу даних в інший залежно від вимог. Цей тип перетворення безпечніший.
Тепер ми детально побачимо обидва типи перетворення типів.
Неявна конверсія
При неявному перетворенні компілятор здійснює перетворення з одного типу даних на інший, коли вираз має більше одного типу даних. Щоб запобігти втраті даних, всі змінні інших типів даних перетворюються на найбільший тип даних. Це називається підвищенням.
Давайте зрозуміємо неявне перетворення, використовуючи приклад коду.
#include using namespace std; int main() { int num = 10; char ch = 'A'; cout<<'10 + 'A' = '< Вихід:
10 + 'A' = 75
float val (10 + ‘a’) = 107
var_int = 1000
Наведений вище приклад коду демонструє неявне перетворення. Ми оголосили ціле число та символьну змінну зі значеннями 10 та „A” відповідно. Коли ми складаємо ці дві змінні, відбувається неявне перетворення.
Оскільки ціле число є більшим типом у цьому виразі, значення змінної символу 'A' перетворюється на його цілочисельний еквівалент, тобто значення 65 (значення ASCII). Таким чином, результат виразу дорівнює 75.
У наступному виразі ми додаємо ціле число та символ (‘a’ -> 97), а потім призначаємо результат плаваючому. Таким чином, результат виразу неявно перетворюється компілятором у float.
У третьому виразі коротка змінна int неявно перетворюється на ціле число.
Примітка : У разі неявних перетворень, якщо компілятор виявить потенційну втрату даних, він може блимати попередженням про це.
Явне перетворення
Явне перетворення також відоме як 'лиття типу', оскільки ми 'перекидаємо' один тип даних на інший тип даних. Тут користувачі чітко визначають кастинг, на відміну від неявного перетворення, де компілятор внутрішньо здійснює перетворення.
Ми можемо виконати явне перетворення двома способами:
# 1) Використання оператора присвоєння
Явне перетворення або прогнозування типу за допомогою оператора присвоєння виконується з силою. Тут ми передаємо або перетворюємо один тип даних на інший тип даних за допомогою оператора присвоєння.
Загальний синтаксис:
(data type) expression;
Наступний приклад пояснює це:
#include #include using namespace std; int main() { int sum; double salary = 4563.75; sum = (int)salary + 1000; cout<<'Sum = '< Вихід:
Сума = 5563
Комп = 5563,2
У наведеному вище прикладі ми показали явне лиття за допомогою оператора присвоєння. Спочатку ми переводимо змінну зарплати типу double на цілочисельний тип. Далі ми додаємо цілочисельну змінну sum до подвійного типу.
Як показано на виході, тип, до якого ми застосовуємо, вказує на кінцевий тип результату виразу.
Це вигідно, оскільки користувач може змінити тип виразу відповідно до вимог.
# 2) Використання оператора Cast
У цьому типі кастингу ми використовуємо “оператор приведення”, який є унарним оператором для переходу від одного типу до іншого.
Види лиття
Ми маємо такі типи кастингу залежно від оператора акторського складу, який ми використовуємо:
# 1) Статичний акторський склад
Статичний привід є найпростішим серед усіх типів, що використовують оператор приведення . Статичний привід здатний виконувати всі перетворення, які виконуються неявно. Він також виконує перетворення між покажчиками класів, пов'язаних один з одним (upcast -> з похідного на базу або downcast -> з бази на похідне).
Окрім перерахованих вище перетворень, статичний привід також може перетворити будь-який покажчик на void *.
Статичний привід - це складений час. Це означає, що під час виконання не проводиться перевірка, чи дійсно виконана акторська робота чи ні. Таким чином, програміст залишається відповідальним за те, щоб перетворення було безпечним та дійсним.
Іншими словами, користувач повинен переконатись, що перетворений об’єкт був заповненим щодо типу даних призначення.
Ми вказуємо статичний склад так:
static_cast (expression)
Давайте розберемося зі статичним складом на прикладі.
#include using namespace std; int main() { double df = 3.5 * 3.5 * 3.5; cout<<'Before casting: df = '<У наведеному вище прикладі ми трохи змінили код, щоб включити символьну змінну зі значенням „A”. Потім ми оголошуємо цілочисельний покажчик і застосовуємо статичний привід для перетворення символу в цілочисельний покажчик.
Коли ми компілюємо цю програму, ми отримуємо наступний результат.
У функції ‘int main ()’:
10:35: помилка: недійсний static_cast від типу ‘char *’ до типу ‘int *’
Програма видає помилку для статичного виконання, оскільки вона є недійсною. Таким чином, статична передача дозволяє лише припустиме приведення типу або перетворення та видає помилку, коли ми намагаємось виконати деяке небажане лиття тексту.
# 2) Динамічний акторський склад
Динамічний привід - це виконання під час виконання, яке виконується для перевірки правильності складання. Динамічний привід виконується лише на покажчиках класу та посиланнях. Вираз повертає значення NULL, якщо приведення не вдається.
Запитання та відповіді на інтерв’ю для настільних ПК для рівня l2 pdf
У динамічному складі використовується механізм, відомий як RTTI (ідентифікація типу виконання) . RTTI робить всю інформацію про тип даних об’єкта доступною під час виконання і доступна лише для класів, які мають принаймні одну віртуальну функцію (поліморфний тип). RTTI дозволяє визначати тип об'єкта під час виконання або під час виконання.
Спробуємо один приклад, щоб зрозуміти динамічний склад.
#include #include using namespace std; class base {public: virtual void print(){}}; class derived:public base{}; int main() { base* b = new derived; derived* d = dynamic_cast(b); if(d != NULL) cout<<'Dynamic_cast done successfully'; else cout<<'Dynamic_cast not successful'; }
У цій програмі ми визначили два класи, base з віртуальною функцією та похідні, що мають базовий клас, base.
У головній функції ми створюємо похідний об’єкт класу, на який вказує вказівник базового класу. Потім ми виконуємо dynamic_cast на базовому покажчику, вказуючи на похідний клас, щоб передати його на похідний покажчик класу.
Як і в базовому класі, база є поліморфною (містить віртуальну функцію), Dynamiccast успішний.
Примітка: Якщо ми вилучимо віртуальну функцію з вищезазначеного класу, тоді dynamic_cast не вдасться, оскільки інформація RTTI для об’єктів буде недоступною.
яка різниця між qa та qc
Динамічний склад має накладні витрати на безпеку типу під час виконання.
# 3) Перетлумачити акторський склад
Цей тип приведення найнебезпечніший у використанні, оскільки він працює на будь-якому типі об’єктів, не маючи прив’язки класів один до одного.
Reintepret_cast працює на будь-яких покажчиках, і він перетворює покажчик будь-якого типу на будь-який інший тип незалежно від того, пов’язані між собою покажчики чи ні. Він не перевіряє, чи вказівник або дані, на які вказує вказівник, однакові чи ні.
Оператор приведення приймає лише один параметр, вихідний вказівник для перетворення і не повертає жодного значення. Він просто перетворює тип покажчика.
Ми не повинні використовувати, якщо це не потрібно. Зазвичай ми вводимо вказівник джерела на вихідний тип.
Ми використовуємо переважно для роботи з бітами. Коли використовується для булевих значень, булеві значення перетворюються у цілі значення, тобто 1 для true та 0 для false.
Давайте подивимось Приклад повторного тлумачення акторського складу:
#include using namespace std; int main() { int* ptr = new int(97); char* ch = reinterpret_cast(ptr); cout << ptr << endl; cout << ch << endl; cout << *ptr << endl; cout << *ch << endl; return 0; }
Вихід:
0x3ef3090
до
97
до
У наведеному вище прикладі ми оголосили цілочисельний вказівник ptr, що вказує на значення 97. Далі ми оголошуємо покажчик символів ch і додаємо до нього ptr, використовуючи.
Далі ми друкуємо різні значення. Першим, що ми друкуємо, є ptr, який вказує на ціле число. Звідси друкується адреса.
Наступне значення ch містить значення 97, і, отже, воно друкує 'a', що є ASCII-еквівалентом 97. Наступне значення '* ptr' містить значення 97, тоді як '* ch' містить ASCII-еквівалент 97, тобто 'a', як це зроблено за допомогою reinterpret_cast.
# 4) Const Cast
Оператор трансляції використовується для зміни або маніпуляцій зі стійкістю вказівника джерела. Під маніпуляцією ми маємо на увазі, що це може бути або встановлення constness на неконстантний покажчик, або видалення constness з покажчика const.
Умовою успішного оператора приведення є те, що вказівник та джерело, яке передається, повинні бути одного типу.
Візьмемо приклад, щоб зрозуміти це.
#include using namespace std; int printVal(int* ptr) { return(*ptr*10); } int main(void) { const int value = 10; const int *ptr = &value; int *ptr_cast = const_cast (ptr); cout <<'printVal returned = '<< printVal(ptr_cast); return 0; }
У цьому прикладі ми бачимо, що функція 'printVal' приймає неконстантний покажчик. У основній функції ми маємо змінну const ‘value’, призначену покажчику const ptr.
Для того, щоб передати цей покажчик const функції printVal, ми додаємо його, застосовуючи, щоб видалити constness. Потім ми передаємо покажчик ptr_cast функції, щоб отримати бажані результати.
Висновок
Цим ми завершимо цю тему перетворення типів на C ++. Ми бачили все про неявні та явні перетворення, які використовуються в C ++.
Однак слід пам’ятати, що для запобігання втраті даних та інших подібних труднощів перетворення або типорозміщення слід застосовувати розумно, лише якщо ситуація вимагає використання.
=> Ознайомтесь з навчальним посібником для початківців C ++ тут.
Рекомендована література
- Кращий БЕЗКОШТОВНИЙ підручник з C #: Остаточний посібник для C # для початківців
- Введіть Кваліфікатори та класи зберігання на C ++
- Типи тестування на міграцію: зі сценаріями тестування для кожного типу
- Як вирішити, який тип тестування необхідний для проекту? - Вручну або автоматизація
- Типи даних C ++
- Тестування навантаження за допомогою підручників HP LoadRunner
- Змінні в C ++
- Шаблони на C ++ з прикладами