前言
C++是一種通用的編程語言,被廣泛用于開發各種應用程序,包括系統軟件、游戲、手機應用和高性能計算等。它是C語言的擴展,添加了許多新特性和功能,并支持面向對象編程。C++可以在不同的平臺上編譯和運行,具有高效性、可移植性和靈活性等特點。它的語法和語義與C語言相似,但還包括了類、模板、異常處理和STL(標準模板庫)等特性。C++是一種強大而靈活的編程語言。簡單的說,C++就是C語言的plus版本,C++的出現就是建立在C語言之上的。
一.命名空間
命名空間(Namespace)是一種組織和管理代碼的方式,它將代碼分組并提供了唯一的標識符(名稱)來引用這些代碼。它的主要作用是避免命名沖突,讓不同模塊或代碼庫中的同名元素能夠被準確地引用。舉個例子:
#include<stdio.h>
#include <stdlib.h>
int rand = 10;
int main()
{// 編譯報錯:error C2365: “rand”: 重定義;以前的定義是“函數”printf("%d\n", rand);return 0;
}
如果我把這個代碼放到編譯器里編譯就會出現報錯,說的是我們的rand重定義了。那是因為在頭文件stdlib里我們有rand這個函數。這就是命名沖突了。
1.1namespace的價值
在C/C++中,變量、函數和類都是大量存在的,這些變量、函數和類的名稱都存在于全局作用域中,可能會導致很多沖突。使用命名空間的目的就是對標識符的名稱進行本地化,以避免命名沖突或名字污染,這時在我們的C++里面就引入了一個叫namespace的東西,在東西就可以很好的解決掉命名沖突的問題。
1.2namespace的定義
#include<stdio.h>
#include <stdlib.h>
namespace lwz
{//在命名空間里可以是變量、函數和類型int rand = 10;int Add(int a, int b){return a + b;}struct LNode{int* a;struct LNode* next;};
}
int main()
{// 這里默認是訪問的是全局的rand函數指針printf("%p\n", rand);// 這里指定lwz命名空間中的randprintf("%d\n",lwz::rand);return 0;
}
namespace a
{namespace b{int Add(int x, int y){return x + y;}}namespace c{int Add(int x, int y){return x + y;}}
}
int main()
{printf("%d\n", a::b::Add(1, 2));printf("%d\n", a::c::Add(2, 2));return 0;
}
這里我在命名空間a里嵌套了兩個命名空間b和c,在我們使用的時候,用::就可以訪問命名空間里的東西了。
1.3命名空間的使用
namespace lwz
{int a = 0;int b = 10;
}
int main()
{printf("%d\n", lwz::a);printf("%d\n", lwz::b);return 0;
}
namespace lwz
{int a = 0;int b = 10;
}
using namespace lwz;
int main()
{printf("%d\n", a);printf("%d\n", b);return 0;
}
using的作用就是展開我們的命名空間,可以理解為把lwz域里的東西拿到全局域里。當然也可以單獨的把命名空間里的某個特殊成員展開。
namespace lwz
{int a = 0;int b = 10;
}
using lwz::a;
int main()
{printf("%d\n", a);printf("%d\n", lwz::b);return 0;
}
二.輸入輸出
雖然C++是兼容C語言的,但是C++還是有自己的一套輸入輸出。我先簡單的寫一個輸入輸出:
#include<iostream>
using namespace std;
int main()
{int a = 0;double b=0.0;char c = 'a';std::cout << a << " " << b << " " << c <<std::endl;//我們在輸出時可以自動的識別變量的類型cin >> a >> b >> c;//輸入1 2.222 xcout << a << " " << b << " " << c << endl;//輸出1 2.222 xreturn 0;
}
三.缺省參數
? 缺省參數是聲明或定義函數時為函數的參數指定一個缺省值。在調用該函數時,如果沒有指定實參則采用該形參的缺省值,否則使用指定的實參,缺省參數分為全缺省和半缺省參數。(有些地方把缺省參數也叫默認參數)
#include<iostream>
using namespace std;
void Func(int a = 0)
{cout << a << endl;
}
int main()
{Func(); // 沒有傳參時,使用參數的默認值Func(10); // 傳參時,使用指定的實參return 0;
}
打印出的就是0? 10.
? 全缺省就是全部形參給缺省值,半缺省就是部分形參給缺省值。C++規定半缺省參數必須從右往左依次連續缺省,不能間隔跳躍給缺省值。
#include<iostream>
using namespace std;
void func1(int a=10, int b = 20, int c = 30)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl << endl;
}
void Func2(int a, int b = 10, int c = 20)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl << endl;
}
int main()
{func1();func1(1);func1(1, 2);func1(1, 2, 3);Func2(100);Func2(100, 200);Func2(100, 200,300);return 0;
}
值得注意的是,在半缺省里,函數不可以是void Func2(int a=10, int b, int c = 20)或者void Func2(int a=10, int b, int)。
? 帶缺省參數的函數調用,C++規定必須從左到右依次給實參,不能跳躍給實參。
這里也就剛好對應上面的那一條,半缺省參數必須是從右往左依次連續缺省。
#pragma once
#include <iostream>
#include <assert.h>
using namespace std;
typedef int STDataType;
typedef struct Stack
{STDataType* a;int top;int capacity;
}ST;
void STInit(ST* ps, int n = 4);
此時我們已經在Stack.h文件里已經有了缺省參數,然后是.cpp文件:
#include"Stack.h"
void STInit(ST* ps, int n=10)
{assert(ps && n > 0);ps->a = (STDataType*)malloc(n * sizeof(STDataType));ps->top = 0;ps->capacity = n;
}
如果繼續再函數定義這里還有缺省參數的話,就會導致重定義的問題出現。所以一定要是在函數聲明給缺省值。
四.函數重載
4.1參數類型不同
#include <iostream>
#include <assert.h>
using namespace std;
int Add(int left, int right)
{cout << "int Add(int left, int right)" << endl;return left + right;
}
double Add(double left, double right)
{cout << "double Add(double left, double right)" << endl;return left + right;
}
int main()
{Add(1, 2);Add(1.23, 2.13);return 0;
}
最終打印出“”
4.2參數個數不同
void f()
{cout << "f()" << endl;
}
void f(int a)
{cout << "f(int a)" << endl;
}
int main()
{f();f(10);return 0;
}
最后打印出:
?
4.3參數順序不同
這個實際上也是參數類型不同
void f(int a, char b)
{cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{cout << "f(char b, int a)" << endl;
}
最終打印出:
?
4.4其他情況?
值得注意的是,返回值不同不能作為重載條件,因為調用的時候也無法區分。
包括還有一種情況也會報錯:
void f1()
{
cout << "f()" << endl;
}
void f1(int a = 10)
{
cout << "f(int a)" << endl;
}
假如我調用的時候沒有參數,編譯器就不知道調用誰。
到這里我簡單的介紹了幾個簡單的C++的語法,也是C++入門必須要知道的東西,如有錯誤還請多多指出,感謝觀看。?