Eine Inline-Funktion
Warum benötigt C++ Inline-Funktionen? Was ist der Wert einer Inline-Funktion?
Wir wissen bereits, dass wir const anstelle der Makrodefinition für eine Konstante verwenden können, wie zum Beispiel const int A=3; #define A 3
Können wir also auch eine solche erreichen? ein Makro-Ersatzeffekt.
Bitte beachten Sie:
#define MYFUNC(a, b) ((a) < (b) ? (a) :(b)) // 宏替换的表示 inline int myfunc(int a, int b) //函数表示 { returna < b ? a : b; }
Dies ist eine Inline-Funktion. Beachten Sie die Anweisungen
Hinweis 1:
müssen inline int myfunc(int a, int b) und die Implementierung des Funktionskörpers zusammen geschrieben werden
Hinweis 2
Der C++-Compiler kann eine Funktion inline kompilieren
Die vom C++-Compiler inline kompilierte Funktion wird als Inline-Funktion bezeichnet
Inline-Funktionen sind im endgültig generierten Code nicht definiert
Der C++-Compiler fügt den Funktionskörper direkt an der Stelle ein, an der die Funktion aufgerufen wird
Inline-Funktionen haben keine gewöhnlichen zusätzlichen Funktionen Overhead beim Aufruf (Push, Jump, Return) – Existenzwert
Hinweis 3: Der C++-Compiler lässt möglicherweise nicht unbedingt Inlining-Anfragen für Funktionen zu!
Erklärung 4
Inline-Funktion ist eine spezielle Funktion, die die Eigenschaften gewöhnlicher Funktionen aufweist (Parameterprüfung, Rückgabetyp usw.)
Inline-Funktion ist eine spezielle Funktion für Der Compiler Eine Anfrage, daher kann der Compiler diese Anfrage ablehnen
Inline-Funktionen werden vom Compiler verarbeitet und der kompilierte Funktionskörper wird direkt an der aufrufenden Stelle eingefügt
Makrocode-Snippets werden vom Prozessor vorverarbeitet , einfache Textersetzung, ohne Kompilierungsprozess
Hinweis 5:
Moderne C++-Compiler können eine Kompilierungsoptimierung durchführen, sodass einige Funktionen möglicherweise auch ohne Inline-Deklaration kompiliert werden Inline durch den Compiler
Darüber hinaus bieten einige moderne C++-Compiler eine erweiterte Syntax, die das Inline-Einfügen von Funktionen erzwingen kann
Zum Beispiel: __attribute__((always_inline) in g++ )) Attribut
Hinweis 6:
Einschränkungen der Inline-Kompilierung in C++:
darf keine Form einer Schleifenanweisung enthalten
Es darf nicht zu viele bedingte Beurteilungen geben Anweisungen
Der Funktionskörper darf nicht zu groß sein
Die Adresse der Funktion kann nicht ausgeführt werden
Die Inline-Deklaration der Funktion muss vor der aufrufenden Anweisung stehen
Die Einschränkungen des Compilers für Inline-Funktionen sind nicht absolut. Der Vorteil von Inline-Funktionen gegenüber gewöhnlichen Funktionen besteht darin, dass sie den Aufwand für das Schieben des Stapels, das Springen und die Rückkehr beim Aufruf der Funktion einsparen.
Wenn daher der Ausführungsaufwand des Funktionskörpers viel größer ist als der Aufwand für das Schieben, Springen und Zurückkehren des Stapels, ist Inlining bedeutungslos.
Schlussfolgerung:
1) Inline-Funktionen fügen den Funktionskörper direkt an der Stelle ein, an der die Funktion während der Kompilierung aufgerufen wird
2) Inline ist einfach eine Anfrage, der Compiler lässt diese Anfrage möglicherweise nicht unbedingt zu
3) Inline-Funktionen sparen den Overhead des Stapelschiebens, Springens und Zurückgebens beim Aufrufen gewöhnlicher Funktionen
Zwei Funktionen Standard Parameter
In C++ können Sie einen Standardwert für den Parameter angeben, wenn die Funktion deklariert wird (Sie müssen mich entsprechend dem Wert aufrufen, den ich Ihnen zur Verfügung stelle)
Wenn die Funktion aufgerufen wird, Wenn der Wert dieses Parameters nicht angegeben ist, ersetzt der Compiler automatisch
void myPrint(int x = 3) { printf("x:%d", x); }
Regeln für Funktionsstandardparameter
Nur Parameter am Ende der Parameterliste kann Standardparameterwerte bereitstellen
Sobald Sie beginnen, Standardparameterwerte in einem Funktionsaufruf zu verwenden, müssen alle Parameter nach diesem Parameter Standardparameterwerte verwenden
void printAB(int x = 3) { printf("x:%d\n",x); }
Wenn in der Standardparameterregel Standardparameter angezeigt werden, müssen die auf der rechten Seite Standardparameter haben
void printABC(int a, int b, int x = 3, inty=4, int z = 5) { printf("x:%d\n",x); } int main62(int argc, char *argv[]) { printAB(2); printAB(); system("pause"); return0; }
3. Funktionsplatzhalterparameter (zuerst eine Grube belegen)
Platzhalterparameter haben nur Parametertypdeklaration ohne Parameternamendeklaration
Platzhalterparameter können im Allgemeinen nicht innerhalb des Funktionskörpers verwendet werden
int func(int a, int b, int ) { returna + b; } int main01() { //func(1, 2); //可以吗?错误 printf("func(1,2, 3) = %d\n", func(1, 2, 3)); getchar(); return0; }
4. Standardparameter und Platzhalterparameter (Kombination)
können in Kombination mit Platzhalterparametern und Standardparametern verwendet werden. Bedeutung: Hinterlassen Sie Hinweise für eine zukünftige Programmerweiterung. Kompatibel mit unregelmäßigen Schreibmethoden, die in C-Sprachprogrammen auftreten können
int func2(int a, int b, int = 0) { return a + b; } void main() { //如果默认参数和占位参数在一起,都能调用起来 func2(1,2); func2(1,2, 3); system("pause"); }
结论://如果默认参数和占位参数在一起,都能调用起来
五.函数重载(重点)
1 )函数重载概念
函数重载(FunctionOverload)
用同一个函数名定义不同的函数
当函数名和不同的参数搭配时函数的含义不同
2 )函数重载的判断标准
函数重载至少满足下面的一个条件:
参数个数不同
参数类型不同
参数顺序不同
3 )函数返回值不是函数重载的判断标准
4)编译器调用重载函数的准则
将所有同名函数作为候选者
尝试寻找可行的候选函数
精确匹配实参
通过默认参数能够匹配实参
通过默认类型转换匹配实参
匹配失败
最终寻找到的可行候选函数不唯一,则出现二义性,编译失败。
无法匹配所有候选者,函数未定义,编译失败。
5)函数重载的注意事项
重载函数在本质上是相互独立的不同函数(静态链编)
重载函数的函数类型是不同的
函数返回值不能作为函数重载的依据
函数重载是由函数名和参数列表决定的。
六. 函数重载与函数指针的结合
函数重载与函数指针
当使用重载函数名对函数指针进行赋值时
根据重载规则挑选与函数指针参数列表一致的候选者
严格匹配候选者的函数类型与函数指针的函数类型
//函数指针 基础的语法
//1声明一个函数类型
typedef void (myTypeFunc)(int a,int b) ; //int
//myTypeFunc *myfuncp = NULL; //定义一个函数指针 这个指针指向函数的入口地址
//声明一个函数指针类型
typedef void (*myPTypeFunc)(int a,int b) ; //声明了一个指针的数据类型
//myPTypeFunc fp = NULL; //通过 函数指针类型 定义了 一个函数指针 ,
//定义一个函数指针 变量
void (*myVarPFunc)(int a, int b);
//
待补充!
以上就是C++复习要点总结之二——函数的内容,更多相关内容请关注PHP中文网(www.php.cn)!