Heim  >  Artikel  >  Backend-Entwicklung  >  Zusammenfassung der wichtigsten Punkte der C++-Überprüfung 2 – Funktion

Zusammenfassung der wichtigsten Punkte der C++-Überprüfung 2 – Funktion

黄舟
黄舟Original
2017-01-16 11:18:331179Durchsuche

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)!


Stellungnahme:
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