const, constexpr und auto
const kennzeichnet hier ein Objekt, dessen Wert du nach der Initialisierung nicht verändern darfst. Eine Konstante ist in diesem Sinn ein festgehaltener Wert. Auch eine erst eingelesene Zahl kann danach in einem const-Objekt stehen.
const, constexpr und auto#
Werte und Ausdrücke · Lektion 14 von 60
Voraussetzungen: Datentypen. Lernziel: Du unterscheidest feste Werte, Übersetzungszeitwerte und abgeleitete Typen.
const kennzeichnet hier ein Objekt, dessen Wert du nach der Initialisierung nicht verändern darfst. Eine Konstante ist in diesem Sinn ein festgehaltener Wert. Auch eine erst eingelesene Zahl kann danach in einem const-Objekt stehen.
1#include <iostream>2 3int main() {4 constexpr int sekundenProMinute{60};5 int minuten{};6 if (!(std::cin >> minuten) || minuten < 0 || minuten > 1000) {7 return 1;8 }9 const long long sekunden{1LL * minuten * sekundenProMinute};10 std::cout << sekunden << '\n';11}sekunden hängt von der Eingabe ab. Es darf nach der Definition trotzdem nicht verändert werden. 1LL ist ein Literal vom Typ long long: Dadurch findet die Multiplikation in einem ausreichend großen Ganzzahltyp für den geprüften Bereich statt.
Was constexpr zusätzlich verlangt#
Bei einer Variable verlangt constexpr, dass der Anfangswert ein geeigneter konstanter Ausdruck ist: eine Berechnung, die nach den Sprachregeln schon bei der Übersetzung ausgewertet werden kann. constexpr int sekundenProMinute{60}; macht das Objekt zugleich konstant.
Eine constexpr-Funktion kann unter passenden Bedingungen bei der Übersetzung ausgewertet werden; Aufrufe mit Laufzeitwerten sind dadurch nicht automatisch verboten. consteval aus C++20 ist die strengere Variante für unmittelbare Funktionen, deren entsprechende Aufrufe konstante Auswertung benötigen.
Typableitung mit auto#
Typableitung bedeutet, dass der Compiler einen Typ aus einem Ausdruck ermittelt. auto anzahl = 3; hat den Typ int, auto preis = 3.5; den Typ double. auto bedeutet nicht „beliebiger Typ zur Laufzeit“.
auto name = std::string{"Ada"}; ergibt einen String. auto text = "Ada"; erzeugt dagegen einen Zeiger auf konstante Zeichen. Die Zeigerbedeutung lernst du später; verwende für veränderbaren Text zunächst ausdrücklich std::string.
Best Practice und Fehlerbilder#
Nutze const, wenn ein Wert unverändert bleiben soll, und gib bedeutsamen Zahlen Namen. Eine magische Zahl ist ein unerklärter Zahlenwert, dessen Zweck unklar bleibt. sekundenProMinute erklärt die 60 besser als verstreute Literale.
assignment of read-only variable bezeichnet eine verbotene Änderung. not a constant expression weist bei constexpr auf einen unzulässigen Anfangswert hin. Bei auto wert; fehlt der Anfangswert für die Typableitung.
Übung#
Kann constexpr int zahl{eingeleseneZahl}; einen erst zur Laufzeit ermittelten Wert aufnehmen?
Lösung
Nein. Verwende const int zahl{eingeleseneZahl};, wenn du diesen Laufzeitwert danach unverändert halten möchtest.
Weiterlernen#
Zurück: Datentypen, Wertebereiche und Genauigkeit · Kursübersicht · Weiter: Rechnen, vergleichen und logische Ausdrücke
Kommentare 0
Kommentare sind für diese Seite deaktiviert.