8 kleine Features, die von C++ im Vergleich zur C-Sprache hinzugefügt wurden (detaillierte Erklärung)

8 kleine Features, die von C++ im Vergleich zur C-Sprache hinzugefügt wurden (detaillierte Erklärung)



1. Namensraum

Der Namensraum c++ soll die Fallstricke der Sprache C ausgleichen: Wenn wir beispielsweise eine Variable definieren: rand , treten folgende Probleme auf!
Bildbeschreibung hier einfügen
C++ behebt dieses Manko, zum Ausgleich steht das Schlüsselwort in Anführungszeichen: namespace

Verwenden Sie es wie folgt (Beispiel):

#include<stdio.h>
#include<stdlib.h>
namespace ming
{
    
    
	int rand = 0;
}
int main()
{
    
    
	printf("%p\n", rand);
	printf("%p\n", ming::rand);
	return 0;
}

Namensraumdefinition und -verwendung
Bildbeschreibung hier einfügen
1. Namensräume können auch verschachtelt werden !
2. Wenn die Namen der Namespaces im selben Projekt identisch sind, synthetisiert der Compiler sie automatisch in denselben Namespace.
Wenn Sie bequemer sein möchten, können Sie direkt den Namensraum std deklarieren !
3. Versuchen Sie im Projekt nicht, using namespace std zu verwenden . 4. Verwenden Sie den Namensraum std
für die tägliche Praxis. 5. Projektieren Sie den Zugriff auf den angegebenen Namensraum und erweitern Sie ihn


Zweitens, C++-Eingabe und -Ausgabe

Da scanf und printf in der C-Sprache den Typ der Dateneingabe und -ausgabe angeben müssen, was mühsam ist, führt C ++
cin und cout ein
Bildbeschreibung hier einfügen
und die Anzahl der Stellen nach dem Dezimalpunkt, können Sie scanf direkt in der Sprache C verwenden ( C++ ist mit der Sprache C kompatibel ).


3. Standardparameter

Der Standardparameter entspricht einem Reserverad. Wenn die Funktion Parameter übergibt und kein Parameter vorhanden ist, wird der Standardparameter verwendet. Wenn ein Parameter vorhanden ist, wird der Standardparameter nicht verwendet!
Bildbeschreibung hier einfügen


Wenn mehrere Parameter übergeben werden müssen, folgen Sie dem Prinzip der Parameterübergabe von links nach rechts ~!
Bildbeschreibung hier einfügen


Die folgenden sind Semi-Standardwerte, und der Semi-Standard-Standardparameter ist der erste. Zu diesem Zeitpunkt dürfen Sie den Parameter nicht übergeben! Prinzip: kontinuierliche Vorgabe von rechts nach links, kein Intervall
Bildbeschreibung hier einfügen


Die tatsächliche Anwendung von Standardparametern ist das Problem, die Größe der Kapazität nicht zu kennen, wenn einige Arrays in einigen Datenstrukturen initialisiert werden
Bildbeschreibung hier einfügen


4. Funktionsüberladung

In der C-Sprache erlauben wir nicht, dass eine Funktion mit demselben Namen verschiedene Funktionen definiert, und C++ gleicht diesen Mangel aus, indem es das Überladen von Funktionen einführt .
C++ erlaubt es, mehrere gleichnamige Funktionen mit ähnlichen Funktionen im gleichen Scope zu deklarieren, wobei die formalen Parameterlisten dieser gleichnamigen Funktionen unterschiedlich sind (Anzahl oder Typ der Parameter oder die Reihenfolge der Typen ), was oft verwendet wird um das Problem unterschiedlicher Datentypen zu behandeln, die ähnliche Funktionen implementieren.
Bildbeschreibung hier einfügen


Bildbeschreibung hier einfügen


Warum unterstützt C++ das Überladen von Funktionen, aber die Sprache C unterstützt das Überladen von Funktionen nicht? – "C++ unterstützt das Prinzip der Funktionsüberladung - das Prinzip der Namensänderung : C++ verwendet den geänderten Namen, um im Link zu finden, und derselbe Funktionsname kann gefunden werden. Die C-Sprache verwendet direkt den Funktionsnamen, um denselben Funktionsnamen während zu finden Kompilierung Kompilierte und generierte Symboltabellen sind nicht zu unterscheiden, sodass C++ überladend funktionieren kann, aber die C-Sprache nicht überladend funktionieren kann


Wie ruft die C-Sprache die C++-Bibliothek auf, und wie ruft C++ die C-Sprachbibliothek auf? –" Extren 'C' wird hier referenziert

C++ ruft den Code der C-Sprachbibliothek auf: wie folgt (Beispiel):

// C++ 调用 C语言 的库
extern "C"
{
    
    
     #include<Stack.h>
}

extern "C" teilt dem C++-Compiler mit, dass diese Funktionen von der C-Bibliothek implementiert werden, und Sie verwenden die C-Regeln, um sie zu verknüpfen und zu finden!


C-Sprache ruft C++-Bibliothekscode auf: wie folgt (Beispiel):

// C语言 调用 C++ 的库
#ifdef _cplusplus

extern "C"
{
    
    
#endif // _cplusplus
	void StackInit(ST* ps);
	// ....
#ifdef // _cplusplus
}
#endif // _cplusplus

5. Zitat

Merkmale der Referenz :
1. Die Referenz muss initialisiert werden, wenn sie definiert wird!
Bildbeschreibung hier einfügen

2. Eine Variable kann mehrfach referenziert werden!
Bildbeschreibung hier einfügen

3. Referenz Sobald auf eine Entität verwiesen wird, kann keine andere Entität mehr referenziert werden!
Bildbeschreibung hier einfügen


Referenzierte Nutzungsszenarien
1. Parameter erstellen - -a. Parameter ausgeben, b. Parameter an große Objekte übergeben, um die Effizienz zu verbessern.
Dies spiegelt sich gut in der Austauschfunktion wider!
Bildbeschreibung hier einfügen
Und wenn wir bestimmte Datenstrukturen definieren, ist es auch sehr praktisch, Referenzen zu verwenden!

Der Code lautet wie folgt (Beispiel):

void SLPushBack(SL& s , int x)
{
    
    }

2. Machen Sie den Rückgabewert - -a. Rückgabeobjekt vom Ausgabetyp, der Aufrufer kann das Rückgabeobjekt ändern. b. Reduzieren Sie das Kopieren und verbessern Sie die Effizienz. Warum ist die
Bildbeschreibung hier einfügen
Rückgabe per Referenz schneller als die Rückgabe per Wert?


Bildbeschreibung hier einfügen


Bildbeschreibung hier einfügenFazit: Es ist falsch, das obige Programm zu verwenden, um per Referenz zurückzukehren, und das Ergebnis ist nicht garantiert!

Bildbeschreibung hier einfügen

Nur das folgende Szenario verwendet Pass-by-Reference-Rückgabe: wie folgt (Beispiel):

int& Count()
{
    
    
	static int n = 0;
	n++;
	//......
	return n;
}
int main()
{
    
    
	int& ret = Count();
	cout << ret << endl;
	cout << ret << endl;
	return 0;
}

Beispiel für die Rückgabe durch Referenz:
Wenn wir Daten schreiben, um die oberste Position in der dynamischen Sequenztabelle zu ändern, verwenden wir die Suchfunktion + Änderungsfunktion, was sehr mühsam ist! Also verwenden wir Pass-by-Reference zur Optimierung

Der ursprüngliche Datencode zum Ändern der oberen Position: wie folgt (Beispiel):

// 顺序表中在指定位置插入一个数据
void SeqListInsert(SeqList* ps, int pos, SLDataType x)
{
    
    
	assert(pos <= ps->size && pos >= 0);
	SeqLisrCheckCapacity(ps);
	int end = ps->size - 1;
	while (end >= pos)
	{
    
    
		ps->a[end + 1] = ps->a[end];
		end--;
	}
	ps->a[pos] = x;
	ps->size++;
}

Übergeben Sie nun den Datencode, der die oberste Position in der Rückgabe modifiziert, per Referenz: wie folgt (Beispiel):

// 顺序表中在指定位置插入一个数据
int& SLAt(SL& s, int pos)
{
    
    
	assert(pos >= 0 && pos <= s.size);
	return s.a[pos];
}

Bildbeschreibung hier einfügen


Zu beachten ist: Bei der Verwendung von Referenzen kann die Autorität nicht erweitert, aber die Autorität reduziert werden!
Bildbeschreibung hier einfügen


Wenn die Referenz den Typ ändert, fügen Sie auch const hinzu, um die Erweiterung der Berechtigungen zu verhindern!
Bildbeschreibung hier einfügen


Achten Sie beim Übergeben von Parametern an Funktionen:
Bildbeschreibung hier einfügen


Unterschiede zwischen Verweisen und Verweisen:
Verweise und Verweise haben grundsätzlich einen ähnlichen Zweck, hier unterscheiden wir die beiden nach zwei Aspekten: 1. Verwendungsszenarien, 2. grammatikalische Merkmale und zugrunde liegende Prinzipien.

1. 引用在定义时必须初始化,指针没有要求
2. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体
3. 没有NULL引用,但有NULL指针
4.sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)
5. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
6. 有多级指针,但是没有多级引用
7. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
8. 引用比指针使用起来相对更安全

Bildbeschreibung hier einfügen


6. Inline-Funktionen

Beim Heap-Sortieren und schnellen Sortieren, das Sie zuvor gelernt haben, rufen Sie beim Sortieren von 10w-Daten die Swap-Funktion viele Male auf, und es entsteht viel Overhead, um Funktionen auf den Stack zu schieben.
Kurze Funktionen (1~10 Zeilen), häufige Aufrufe (100.000 Mal) Um dieses Phänomen zu lösen, führt die C-Sprache Makrofunktionen ein, C++ führt Inline-Inline-Funktionen ein!

Die Entwickler von C++ stellten jedoch fest, dass Makros in der Sprache C sehr unpraktisch sind.Die spezifischen Vor- und Nachteile sind wie folgt:

宏的优点:a.复用性变强、b.宏函数提高效率,减少栈帧建立
宏的缺点:a.可读性差;b.没有类型的安全检查;c.不方便调试

Bildbeschreibung hier einfügen


C++ führt Inline-Funktionen ein, fügen Sie Inline vor der Funktion hinzu, und es wird selektiv erweitert, wenn die Hauptfunktion aufgerufen wird!
Bildbeschreibung hier einfügen


Wenn die Funktion zu oft aufgerufen wird, entscheidet sich der Compiler dafür, nicht zu expandieren!
Bildbeschreibung hier einfügen
Bildbeschreibung hier einfügen

Die Eigenschaften von Inline: wie folgt (Beispiel):

1.inline是一种以空间换时间的做法,省去函数栈帧额外开销。所以代码很长或者有循环/递归的函数不适宜使用内联函数。
2.inline对于编译器而言只是一个建议,编译器会自动优化。如果定义为inline的函数体内有函数内部实现代码指令长度比较长10行左右,不同编译器不同)/递归等,编译器优化时会忽略掉内联。
3.inline不建议声明和定义分离,分离会导致链接错误,因为inline被展开,就没有函数地址了,链接就会找不到。

Sieben, Schlüsselwort auto

Auto ist für uns derzeit einfach zu verstehen und wird in Zukunft kontinuierlich verbessert.
Wir verwenden derzeit das Schlüsselwort auto, um: 1. Verwenden Sie auto, um das Array zu durchlaufen! 2. Wenn der Typ relativ lang ist, wird auto automatisch abgeleitet

1. Autotraversal-Array-Methode: wie folgt (Beispiel):

// auto遍历数组
int main()
{
    
    
	// 旧版的遍历a数组 low
	int a[] = {
    
     1,2,3,4,5,6,7,8,9,10 };
	for (int i = 0; i < sizeof(a) / sizeof(int); i++)
	{
    
    
		cout << a[i] << " ";
	}
	cout << endl;

	// 运用范围for(auto关键字)自动依次取a的数据,赋值给e
	for (auto e : a)
	{
    
    
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

2. Wenn der Typ relativ lang ist, wird auto ihn automatisch ableiten!
Bildbeschreibung hier einfügen


Beachten Sie hier: auto erkennt automatisch den Datentyp, was verwendet werden kann, um übergebene Parameter hervorzuheben!
Bildbeschreibung hier einfügen


Acht, der Nullwert des Zeigers nullptr

In der C-Sprache ist der Nullzeiger NULL 0, also wird es einige Probleme geben!
Bildbeschreibung hier einfügen
Hier wird NULL fälschlicherweise mit 0 verwechselt, das ist der Typ int. Um dieses Problem zu lösen, hat der Vater von C++ das Schlüsselwort nullptr eingeführt.
Bildbeschreibung hier einfügen


Zusammenfassen

Darüber werde ich heute sprechen.Dieser Artikel stellt kurz einige neue Features von C++ im Vergleich zur C-Sprache vor. Standardparameter, Funktionsüberladung, Referenzen und mehr!
Wenn mein Blog für Sie hilfreich ist, denken Sie daran, ihn dreimal zu unterstützen. Vielen Dank für Ihre Unterstützung!
Bildbeschreibung hier einfügen

おすすめ

転載: blog.csdn.net/2201_75587702/article/details/130456644