C++ Tutorial

Inline Methoden/Funktionen

Wird eine als inline definiert Methode bzw. Funktion aufgerufen, kann (und diese ist kein Muss!) der Compiler anstelle eines Funktionsaufrufs den Funktionscode einfügen.

inline-Methoden/Funktionen werden aus zwei Gründen eingesetzt:

1. Bei als inline definierten Funktionen ist sichergestellt, dass die Funktion nur einmal instanziiert wird, unabhängig davon, wie oft die Funktion definiert ist. Sehen Sie sich dazu das nachfolgende Beispiel an.

1: // Datei common.h
2: int RetFive()
3: {
4:    return 5;
5: }
1: // Datei main.cpp
2: #include "common.h"
3:
4: int main()
5: {
6:    std::cout << RetFive() << '\n';
7: }
1: // Datei calc.cpp
2: #include "common.h"
3:
4: void Calc()
5: {
6:    std::cout << RetFive() << '\n';
7: }

Sowohl main.cpp wie auch calc.cpp binden die Header-Datei common.h ein. Dadurch, dass die Funktion RetFive() innerhalb der Header-Datei definiert ist, wird sich beim Zusammenbinden der Anwendung der Linker beschweren, dass RetFive() mehrfach definiert ist. Durch die Definition von RetFive() als inline-Funktion wird die Funktion nur einmal instanziiert und die Anwendung kann erfolgreich erstellt werden.

2. Wie bekannt, kann der Zugriff auf private-Eigenschaften einer Klasse nur über public-Methoden erfolgen. Bei sehr kleinen Methoden, die z.B. nur eine Eigenschaft setzen oder zurückliefern, kann aber mehr Zeit für den Aufruf der Methode benötigt werden als für die Bearbeitung der Eigenschaft.

inline-Funktionen

inline-Funktionen werden dadurch gekennzeichnet, dass vor dem Returntyp der Funktion das Schlüsselwort inline gestellt wird.

1: inline void CheckError(int err, char* pT)
2: {
3:    if (err)
4:    {
5:       std::println("Fehler: {} {}", err, pT);
6:       exit (err);
7:    }
8: }

inline-Funktionen entsprechen von der Wirkungsweise her in etwa den veralteten Präprozessor-Makros (#define-Direktive). Der Hauptunterschied zu den Makros liegt darin, dass die Parameter bei inline-Funktionen typisiert sind und inline-Funktionen einen Rückgabewert haben können.

inline-Methoden

Werden Methoden innerhalb einer Klasse, die nicht in einem benannten Modul liegt, definiert, werden sie automatisch als inline-Methode behandelt.

1: // Klassendefinition
2: class Window
3: {
4:    string title;
5: public:
6:    // defaultmässig inline-Methode!
7:    const string& GetTitle() const
8:    {
9:       return title;
10:   }
11: };
12: // main() Funktion
13: int main()
14: {
15:    Window myWin;
16:    std::cout << myWin.GetTitle() << '\n';
17:    // wird compiliert zu:
18:    // std::cout << myWin.title << '\n';
19: }

Wird eine Methode innerhalb einer Klasse deklariert, kann sie bei ihrer Definition außerhalb der Klasse durch voranstellen des Schlüsselworts inline vor dem Returntyp ebenfalls als inline-Methode definiert werden.

1: // Klassendefinition
2: class Window
3: {
4:    string title;
5: public:
6:    const string& GetTitle() const;
7: };
8:
9:  // inline Definition
10: inline const string& Win::GetTitle() const
11: {
12:    return title;
13: }

In Klassen in einem benannten Modul müssen inline-Methoden immer explizit als inline definiert werden.

1: // Modul exportieren
2: export module Window;
3: // Klassendefinition
4: export class Window
5: {
6:     string title;
7: public:
8:     // Methode explizit als inline kennzeichnen
9:     inline const string& GetTitle() const
10:    {
11:       return title;
12:    }
13: };

Copyright 2024 © Wolfgang Schröder
E-Mail mit Fragen oder Kommentaren zu dieser Website an: info@cpp-tutor.de
Impressum & Datenschutz