Inhaltsverzeichnis
Funktionsgrundlagen
int main()
返回数组指针
函数重载
特殊用途语言特性
默认实参
内联函数(inline)
constexpr函数
内联函数和constexpr函数通常定义在头文件中
调试帮助
assert预处理宏
NDEBUG预处理变量
函数指针
Heim Backend-Entwicklung C#.Net-Tutorial Kapitel 6 C++: Funktionsgrundlagen und Anwendungen

Kapitel 6 C++: Funktionsgrundlagen und Anwendungen

Aug 06, 2018 am 10:47 AM
c++

Kapitel 6 Funktionen

Eine Funktion ist ein benannter Codeblock, der den entsprechenden Code durch Aufrufen der Funktion ausführt.

Funktionsgrundlagen

  • Funktionen über den Anrufoperator (Anrufoperator) ausführen. Seine Form ist ein Klammerpaar. Der Aufruf der Funktion

  • führt zwei Aufgaben aus (wie unten gezeigt). Zu diesem Zeitpunkt wird die Ausführung der Hauptaufruffunktion (Aufruffunktion) vorübergehend unterbrochen , und die aufgerufene Funktion (genannt Funktion) beginnt mit der Ausführung.

    • Initialisieren Sie die formalen Parameter, die der Funktion entsprechen, mit tatsächlichen Parametern.

    • Kontrolle an die aufgerufene Funktion übergeben.

  • Rückgabeerklärung:

    • Gibt den Wert in der Rückgabeerklärung zurück

    • Kontrolle von der aufgerufenen Funktion zurück zur aufrufenden Funktion verschieben

Lokales Objekt

  • Der Name hat Gültigkeit und das Objekt hat

    Lifetime (Lebensdauer)

  • Automatisches Objekt (automatisches Objekt): Dieses Objekt wird erstellt, wenn der Steuerpfad der Funktion durch die Variable verläuft Definitionsanweisung Zerstören Sie es, wenn das Ende des Blocks erreicht ist, in dem es definiert ist.

  • Lokales statisches Objekt: Es wird initialisiert, wenn der Programmausführungspfad zum ersten Mal die Objektdefinitionsanweisung durchläuft, und wird erst zerstört, wenn das Programm beendet wird.

    • Definieren Sie lokale Variablen als

      statisch, um zum Beispiel Folgendes zu erhalten: <br>//Statistische Funktion count_calls ( ) Wie oft wurde es aufgerufen<code> <br>//统计函数count_calls ()被调用了多少次 <br>size_t count_calls () <br>{ <br>static size_t ctr = 0;  //调用结束后,这个值仍然有效 <br>return ++ctr; <br>} <br>int main() <br>{ <br>for (size_t i = 0; i != 10; ++i) <br>cout << cout_calls() << endl; <br>return 0; <br>} <br>size_t count_calls ()

      {
    • static size_t ctr = 0; //Nach Abschluss des Aufrufs ist dieser Wert noch gültig
    return ++ctr
}

int main()

{
    for (size_t i = 0; i != 10; ++i)
  • cout <<

    return 0; }

  • Funktionsdeklaration

  • auch Funktionsprototyp

    (Funktionsprototyp)

  • Die drei Elemente der Funktion (

    Rückgabetyp, Funktionsname, formaler Parametertyp
  • ) beschreiben die Schnittstelle der Funktion und der formale Parametername in der Funktionsdeklaration Kann weggelassen werden.

Funktionen sollten in der Header-Datei deklariert und in der Quelldatei definiert werden.

Separate Kompilierung

Parameterübergabe


Wenn der formale Parameter ein Referenztyp ist, wird er an den entsprechenden gebunden Aktualparameter; andernfalls kopieren Sie den Wert des Aktualparameters und weisen Sie ihn dem Formalparameter zu.

- Wenn der Wert eines Referenzparameters nicht geändert werden muss, ist es am besten, ihn als konstante Referenz zu deklarieren.

main: Umgang mit Befehlszeilenoptionen
  • Angenommen, dass sich die Hauptfunktion innerhalb der ausführbaren Datei prog befindet, können wir die folgenden Optionen an das Programm übergeben:

    prog -d -o ofile data0
    Nach dem Login kopieren

    Diese Befehle werden übergeben zwei ausführbare Dateien Die ausgewählten formalen Parameter werden an die Hauptfunktion übergeben:

    int main(int argc, char *argv[]) {...}
    //或:
    int main(int argc, char **argv) {...}
    Nach dem Login kopieren
  • Wenn die tatsächlichen Parameter an die Hauptfunktion übergeben werden, zeigt das erste Element von argv auf den Namen des Programms oder eine leere Zeichenfolge und die Die nächsten Elemente werden jeweils als tatsächliche Parameter an die Befehlszeile übergeben. Der letzte Zeiger lässt nur den Elementwert fallen und ist garantiert 0.
      - Nehmen Sie die obige Befehlszeile als Beispiel:
    1. argc = 5;argv[0] = "prog";argv[1] = "-d";argv[2] = "-o";argv[3] = "ofile";argv[4] = "data0";argv[5] = 0;
      Nach dem Login kopieren

      Funktion mit variablen Parametern

    2. Der neue C++11-Standard stellt zwei Methoden zum Schreiben bereit verschiedene Funktionen mit Mengenargumenten:

  • Alle Argumente sind vom gleichen Typ und ein Standardbibliothekstyp namens initializer_list kann übergeben werden.
  • Mit verschiedenen tatsächlichen Parametertypen können wir eine spezielle Funktion schreiben, die als variable Parametervorlage bezeichnet wird.

    • C++ hat auch einen speziellen Parametertyp: Auslassungspunkte. Sie können damit eine variable Anzahl tatsächlicher Parameter übergeben. Diese Funktion wird im Allgemeinen nur für Schnittstellenprogramme verwendet, die mit C-Funktionen interagieren.
    • formeller Parameter initializer_list


      <br/>initializer_list<T> lst; //默认初始化,T类型元素的空列表 <br/>initializer_list<T> lst{a,b,c...}; <br/>//lst的元素数量和初始值一样多;lst的元素是对应初始值的副本;列表中的元素是const <br/>lst2(lst) <br/>lst2 = lst //拷贝或复制一个initializer_list对象不会拷贝列表中的元素;拷贝后,原始列表和副本元素共享 <br/>lst.size() //列表中元素的数量 <br/>lst.begin() //返回指向lst中首元素的指针 <br/>lst.end() //返回指向lst中尾元素下一位置的指针 <br/>

Der Typ wird in der Header-Datei mit demselben definiert name

  • stellt die folgenden Operationen bereit:

    </p>initializer_list<T> //Standardinitialisierung, leere Liste von T-Typ-Elementen</li>initializer_list<T> ; lst{a ,b,c...}; <li>//Die Anzahl der Elemente von lst ist so viele wie die Elemente von lst sind Kopien der entsprechenden Elemente in der Liste const <p>lst2(lst) <strong> lst2 = lst //Beim Kopieren oder Kopieren eines initializer_list-Objekts werden die Elemente in der Liste nicht kopiert; die ursprüngliche Liste und die kopierten Elemente teilen sich</strong>lst.size() //Die Anzahl der Elemente in der Liste</p>lst.begin( ) //Gibt einen Zeiger auf das erste Element in lst zurück </li>lst.end() //Gibt einen Zeiger auf die nächste Position des letzten Elements in zurück lst </ul>

    • Rückgabetyp und Rückgabeanweisung

      <🎜><🎜><🎜>Referenz gibt L-Wert zurück, andere Rückgabetypen erhalten R-Wert. <🎜><🎜><🎜><🎜><🎜>Rückgabewert der Listeninitialisierung<🎜>: Der neue C++11-Standard legt fest, dass Funktionen eine Liste von Werten zurückgeben können, die von geschweiften Klammern umgeben sind. <🎜><🎜><🎜><🎜>Der Rückgabewert der Hauptfunktion main<🎜><🎜><🎜><🎜>Die Hauptfunktion darf keinen Rückgabewert haben (wenn nicht, fügt der Compiler implizit ein Rückkehr 0)< 🎜>
    • 返回0表示执行成功,其他值依机器而定。

    • 为了使返回值与机器无关,cstdlib头文件定义了两个预处理变量,分别表示成功和失败:
      <br/>return EXIT_FAILURE; <br/>return EXIT_SUCCESS; <br/>//因为它们是预处理变量,所以既不能在前面加上std::,也不能在using声明里出现。 <br/>

    返回数组指针

    1. 使用类型别名
      <br/>typedef int arrT[10]; //arrT是一个类型别名,它表示的类型是含有10个整数的数组 <br/>using arrT = int[10]; //与上一句等价 <br/>arrT* func(int i); //func返回一个指向含有10个整数的数组的指针 <br/>

    2. 声明一个返回数组指针的函数,形式如下
      <br/>Type (*function(parameter_list)) [dimension] <br/>//Type表示返回的数组指针指向的数组元素类型 <br/>//dimension表示数组的大小 <br/>//例如: <br/>int (*func(int i)) [10]; <br/>

    3. 使用尾置返回类型(C++11)
      <br/>auto func(int i) -> int(*)[10]; <br/>

    4. 使用decltype
      <br/>int odd[] = {1,3,5,7,9}; <br/>int even[] = {0,2,4,6,8}; <br/>decltype(odd) *arrPtr(int i) <br/>{ <br/> return (i % 2) ? &odd : &even; //返回一个指向数组的指针 <br/>} <br/>

    函数重载

    如果同一作用域内的几个函数名字相同但形参列表不同,我们称之为重载(overloaded)函数

    • 不允许两个函数除了返回类型外其他所有要素都相同。

    • 重载与作用域:一旦在当前作用域中找到了所需的名字,编译器就会忽略掉外层作用域中的同名实体。

    特殊用途语言特性

    介绍三种函数相关的语言特性:默认实参、内联函数、constexpr函数。

    默认实参

    • 调用包含默认实参的函数时,可以包含该实参,也可以省略该实参。

    • 一旦某个形参被赋予了默认值,它后面所有的形参都必须有默认值。

    内联函数(inline)

    调用函数一般比求等价表达式的值要慢,内联函数可避免函数调用的开销。
    - 将函数指定为内联函数,通常就是将它在每个调用点上“内联地”展开。

    constexpr函数

    • 函数的返回类型和所有的形参类型都得是字面值类型。

    • 函数中必须有且只有一条return语句。

    • constexpr函数被隐式地指定为内联函数。

    内联函数和constexpr函数通常定义在头文件中

    调试帮助

    程序可以包含一些用于调试的代码,但这些代码只在开发程序时使用。当应用程序编写完成准备发布时,要先屏蔽掉调试代码。这种方法用到两项预处理功能:assert和NDEBUG。

    assert预处理宏

    #include <cassert>assert(expr);//首先对expr求值,//如果表达式为假(即0),assert输出信息并终止程序的执行。//如果表达式为真(即非0),assert什么也不做。//例如:对一个文本进行操作的程序可能要求所给定单词的长度都大于某个阈值。assert(word.size() > threshold;
    Nach dem Login kopieren

    NDEBUG预处理变量

    • assert的行为依赖于一个名为NDEBUG的预处理变量的状态。如果定义了NDEBUG,则assert什么也不做。默认状态下没有定义NDEBUG,此时assert将运行执行时检查。

      • 使用#define语句定义NDEBUG,从而关闭调试状态。

      • 很多编译器都提供了命令行选项使我们可以定义预处理变量。
        <br/>$ CC -D NDEBUG main.C #微软编译器中用 /D <br/>

    • 这只是调试程序的辅助手段,不能代替真正的逻辑检查,也不能代替程序本应该包含的错误检查。

    • 除了assert以外,也能使用NDEBUG编写自己的条件调试代码:

    //如果定义了NDEBUG,#ifndef和#endif之间的代码将被忽略void print(const int ia[], aize_t size)
    {    #ifndef NDEBUG
            //_ _func_ _是编译器定义的一个局部静态变量,用于存放函数的名字,它是const char的一个静态数组。
            cerr << _ _func_ _ << "array size is " << size << endl;    #endif}
    Nach dem Login kopieren

    除了_ _ func _ _之外,还有其它四个名字:

    _ _FILE_ _ 存放文件名的字符串字面值
    _ _LINE_ _ 存放当前行号的整型字面值
    _ _TIME_ _ 存放文件编译时间的字符串字面值
    _ _DATA_ _ 存放文件编译日期的字符串字面值
    Nach dem Login kopieren

    函数指针

    bool lengthCompare(const string &, const string &);//pf指向一个函数,该函数的参数是两个const string的引用,返回值是bool类型。注意圆括号必不可少bool (*pf) (const string &, const string &);    //未初始化
    Nach dem Login kopieren

    当我们把函数名作为值使用时,该函数自动地转换成指针

    pf = lengthCompare;     //pf指向名为lengthCompare的函数pf = &lengthCompare;    //等价赋值语句,&是可选的
    Nach dem Login kopieren

    调用该函数:

    //此三个调用等价bool b1 = pf("hello", "goodbye");bool b2 = (*pf)("hello", "goodbye");bool b3 = lengthCompare("hello", "goodbye");
    Nach dem Login kopieren

    参考:C++Primer第五版

    相关文章:

    第四章C++:表达式概念-运算符的应用

    Kapitel 5 C++: Einführung in Anweisungen

Das obige ist der detaillierte Inhalt vonKapitel 6 C++: Funktionsgrundlagen und Anwendungen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie implementiert man das Strategy Design Pattern in C++? Wie implementiert man das Strategy Design Pattern in C++? Jun 06, 2024 pm 04:16 PM

Die Schritte zum Implementieren des Strategiemusters in C++ lauten wie folgt: Definieren Sie die Strategieschnittstelle und deklarieren Sie die Methoden, die ausgeführt werden müssen. Erstellen Sie spezifische Strategieklassen, implementieren Sie jeweils die Schnittstelle und stellen Sie verschiedene Algorithmen bereit. Verwenden Sie eine Kontextklasse, um einen Verweis auf eine konkrete Strategieklasse zu speichern und Operationen darüber auszuführen.

Wie implementiert man eine verschachtelte Ausnahmebehandlung in C++? Wie implementiert man eine verschachtelte Ausnahmebehandlung in C++? Jun 05, 2024 pm 09:15 PM

Die Behandlung verschachtelter Ausnahmen wird in C++ durch verschachtelte Try-Catch-Blöcke implementiert, sodass neue Ausnahmen innerhalb des Ausnahmehandlers ausgelöst werden können. Die verschachtelten Try-Catch-Schritte lauten wie folgt: 1. Der äußere Try-Catch-Block behandelt alle Ausnahmen, einschließlich der vom inneren Ausnahmehandler ausgelösten. 2. Der innere Try-Catch-Block behandelt bestimmte Arten von Ausnahmen, und wenn eine Ausnahme außerhalb des Gültigkeitsbereichs auftritt, wird die Kontrolle an den externen Ausnahmehandler übergeben.

Wie verwende ich die C++-Vorlagenvererbung? Wie verwende ich die C++-Vorlagenvererbung? Jun 06, 2024 am 10:33 AM

Durch die Vererbung von C++-Vorlagen können von Vorlagen abgeleitete Klassen den Code und die Funktionalität der Basisklassenvorlage wiederverwenden. Dies eignet sich zum Erstellen von Klassen mit derselben Kernlogik, aber unterschiedlichen spezifischen Verhaltensweisen. Die Syntax der Vorlagenvererbung lautet: templateclassDerived:publicBase{}. Beispiel: templateclassBase{};templateclassDerived:publicBase{};. Praktischer Fall: Erstellt die abgeleitete Klasse Derived, erbt die Zählfunktion der Basisklasse Base und fügt die Methode printCount hinzu, um die aktuelle Zählung zu drucken.

Warum tritt bei der Installation einer Erweiterung mit PECL in einer Docker -Umgebung ein Fehler auf? Wie löst ich es? Warum tritt bei der Installation einer Erweiterung mit PECL in einer Docker -Umgebung ein Fehler auf? Wie löst ich es? Apr 01, 2025 pm 03:06 PM

Ursachen und Lösungen für Fehler Bei der Verwendung von PECL zur Installation von Erweiterungen in der Docker -Umgebung, wenn die Docker -Umgebung verwendet wird, begegnen wir häufig auf einige Kopfschmerzen ...

Was ist die Rolle von CHAR in C -Saiten? Was ist die Rolle von CHAR in C -Saiten? Apr 03, 2025 pm 03:15 PM

In C wird der Zeichenentyp in Saiten verwendet: 1. Speichern Sie ein einzelnes Zeichen; 2. Verwenden Sie ein Array, um eine Zeichenfolge darzustellen und mit einem Null -Terminator zu enden. 3. Durch eine Saitenbetriebsfunktion arbeiten; 4. Lesen oder geben Sie eine Zeichenfolge von der Tastatur aus.

Wie gehe ich mit Thread-übergreifenden C++-Ausnahmen um? Wie gehe ich mit Thread-übergreifenden C++-Ausnahmen um? Jun 06, 2024 am 10:44 AM

In Multithread-C++ wird die Ausnahmebehandlung über die Mechanismen std::promise und std::future implementiert: Verwenden Sie das Promise-Objekt, um die Ausnahme in dem Thread aufzuzeichnen, der die Ausnahme auslöst. Verwenden Sie ein zukünftiges Objekt, um in dem Thread, der die Ausnahme empfängt, nach Ausnahmen zu suchen. Praktische Fälle zeigen, wie man Versprechen und Futures verwendet, um Ausnahmen in verschiedenen Threads abzufangen und zu behandeln.

Speichernutzungs- und Optimierungsstrategien für den lokalen C++-Thread-Speicher Speichernutzungs- und Optimierungsstrategien für den lokalen C++-Thread-Speicher Jun 05, 2024 pm 06:49 PM

TLS stellt jedem Thread eine private Kopie der Daten zur Verfügung, die im Thread-Stack-Bereich gespeichert wird, und die Speichernutzung variiert je nach Anzahl der Threads und der Datenmenge. Zu den Optimierungsstrategien gehören die dynamische Zuweisung von Speicher mithilfe threadspezifischer Schlüssel, die Verwendung intelligenter Zeiger zur Verhinderung von Lecks und die Partitionierung von Daten zur Platzersparnis. Beispielsweise kann eine Anwendung TLS-Speicher dynamisch zuweisen, um Fehlermeldungen nur für Sitzungen mit Fehlermeldungen zu speichern.

Vier Möglichkeiten zur Implementierung von Multithreading in C -Sprache Vier Möglichkeiten zur Implementierung von Multithreading in C -Sprache Apr 03, 2025 pm 03:00 PM

Multithreading in der Sprache kann die Programmeffizienz erheblich verbessern. Es gibt vier Hauptmethoden, um Multithreading in C -Sprache zu implementieren: Erstellen Sie unabhängige Prozesse: Erstellen Sie mehrere unabhängig laufende Prozesse. Jeder Prozess hat seinen eigenen Speicherplatz. Pseudo-MultitHhreading: Erstellen Sie mehrere Ausführungsströme in einem Prozess, der denselben Speicherplatz freigibt und abwechselnd ausführt. Multi-Thread-Bibliothek: Verwenden Sie Multi-Thread-Bibliotheken wie PThreads, um Threads zu erstellen und zu verwalten, wodurch reichhaltige Funktionen der Thread-Betriebsfunktionen bereitgestellt werden. Coroutine: Eine leichte Multi-Thread-Implementierung, die Aufgaben in kleine Unteraufgaben unterteilt und sie wiederum ausführt.

See all articles