1.C++關鍵字
c++的關鍵字比我們的c語言的關鍵字多,c++包容C語言并對C語言進行了補充,但是我們對關鍵字的學習是在我們后面逐漸學習的。這里我們的只是提供一個表格對齊了解一下。
2.命名空間
我們c++出現了命名空間的概念,用關鍵字namespace來定義。他主要是補充了C語言的變量名字重復的問題。C/C++中,變量、函數和后面要學到的類都是大量存在的,這些變量、函數和類的名稱將都存 在于全局作用域中,可能會導致很多沖突。使用命名空間的目的是對標識符的名稱進行本地化, 以避免命名沖突或名字污染。
命名空間的定義:
namespace + 空間名字+{
//可以定義我們變量,函數結構體。
}
例如:
namespace zs{int a;int Add(int a,int b)
{return a+b;
}}
我們在寫項目的時候的一般用項目名字的簡寫來命名空間。
我們的命名空間還可以嵌套。
如:
//test.cppnamespace N1
{int a;int b;int Add(int left, int right){return left + right;}namespace N2{int c;int d;int Sub(int left, int right){return left - right;}}
}
?同一個工程中允許存在多個相同名稱的命名空間,編譯器最后會合成同一個命名空間中。
?一個工程中的test.h和上面test.cpp中兩個N1會被合并成一個
// test.h
namespace N1
{int Mul(int left, int right){return left * right;}
}
?我們的命名空間是一個新的作用域,他比我們的C語言的 多了一個作用域(全局作用域和局部作用域)。我們的命名空間中的所有內容都局限于該命名空間中
命名空間的使用:
namespace bit
{// 命名空間中可以定義變量/函數/類型int a = 0;int b = 1;int Add(int left, int right){return left + right;}struct Node{struct Node* next;int val;};
}
int main()
{// 編譯報錯:error C2065: “a”: 未聲明的標識符printf("%d\n", a);return 0;
}
?我們這里的a 是沒有定義的,因為這里的命名空間是一個私有的域,,如果我們不進行的命名空間展開的話,我們是沒辦法訪問這塊空間的,所以這里我們是找不到的a的。
但是在做項目的時候,我們的命名空間全部展開的話是不太好的:
命名空間可以解決命名沖突問題,因為它們允許在不同的作用域中定義相同名字的實體。如果命名空間被展開,那么原本被隔離的命名空間中的實體可能會與外部的實體發生沖突。
所以我們可以只展開我們要用到的。在我們平時寫作業時我們可以全部展開的,就像我們展開我們的我們c++提供的標準庫。
命名空間的使用有三種方式:
1 加命名空間名稱及作用域限定符(::)
int main()
{printf("%d\n", N::a);return 0; ? ?
}
2 使用using將命名空間中某個成員引入
只展開了我們要用的。
using N::b;
int main()
{printf("%d\n", N::a);printf("%d\n", b);return 0; ? ?
}
3 使用using namespace 命名空間名稱 引入
這里是全部展開
using namespce N;
int main()
{printf("%d\n", N::a);printf("%d\n", b);Add(10, 20);return 0; ? ?
}
在我們這里我們如果我們的全局變量和局部比那里那個都有的同一個變量,我們是采取就近原則,局部優先,再是全局,如果我們的命名空間也有的話,并且我們的全局變量也同樣存在,我們也展開我們的命名空間的話,(局部變量沒有),那這里就會導致我們的報錯不會通過,訪問沖突了。
3.C++輸入&輸出
先看一個例子:
#include<iostream>
// std是C++標準庫的命名空間名,C++將標準庫的定義實現都放到這個命名空間中
using namespace std;
int main()
{
cout<<"Hello world!!!"<<endl;
return 0;
}
?說明:
1. 使用cout標準輸出對象(控制臺)和cin標準輸入對象(鍵盤)時,必須包含< iostream >頭文件 以及按命名空間使用方法使用std。
2. cout和cin是全局的流對象,endl是特殊的C++符號,表示換行輸出,他們都包含在包含< iostream >頭文件中。
3. 是流插入運算符,>>是流提取運算符。
4. 使用C++輸入輸出更方便,不需要像printf/scanf輸入輸出時那樣,需要手動控制格式。 C++的輸入輸出可以自動識別變量類型。
5. 實際上cout和cin分別是ostream和istream類型的對象,>>和也涉及運算符重載等知識。
#include <iostream>
using namespace std;int main()
{int a;double b;char c;// 可以自動識別變量的類型cin>>a;cin>>b>>c;cout<<a<<endl;cout<<b<<" "<<c<<endl;return 0;
}
?我們這里的有里的一個優點是可以進行這里會自動識別變量類型。
endl是可以進行換行的,我們也可以這樣:cout<<b<<" "<<"\n"<<endl;
using namespace std展開,標準庫就全部暴露出來了,如果我們定義跟庫重名的類型/對 象/函數,就存在沖突問題。該問題在日常練習中很少出現,但是項目開發中代碼較多、規模 大,就很容易出現。所以建議在項目開發中使用,像std::cout這樣使用時指定命名空間 + using std::cout展開常用的庫對象/類型等方式。
4. 缺省參數
定義:
缺省參數是聲明或定義函數時為函數的參數指定一個缺省值。在調用該函數時,如果沒有指定實 參則采用該形參的缺省值,否則使用指定的實參。我們的缺省參數其實就是給了一個默認的值,
void Func(int a = 0)
{cout<<a<<endl;
}
int main()
{Func(); ? ? // 沒有傳參時,使用參數的默認值Func(10); ? // 傳參時,使用指定的實參return 0;
}
?我們使用缺省參數的時候可以不傳參數,使用默認參數。
缺省參數分類
1 全缺省
void Func(int a = 10, int b = 20, int c = 30){cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;cout<<"c = "<<c<<endl;}
2 半缺省
void Func(int a , int b = 20, int c = 30){cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;cout<<"c = "<<c<<endl;}
? ?注意: 1. 半缺省參數必須從右往左依次來給出,不能間隔著給
? ?2. 缺省參數不能在函數聲明和定義中同時出現 ?
//a.hvoid Func(int a = 10);// a.cppvoid Func(int a = 20){}// 注意:如果生命與定義位置同時出現,恰巧兩個位置提供的值不同,那編譯器就無法確定到底該
用那個缺省值
函數缺省這一功能對于我們不知道一個參數要傳什么時,我們可以不傳,,還是很方便。
5. 函數重載
函數的重載是指:是函數的一種特殊情況,C++允許在同一作用域中聲明幾個功能類似的同名函數,這 些同名函數的形參列表(參數個數 或 類型 或 類型順序)不同,常用來處理實現功能類似數據類型 不同的問題。不能是返回值不同,因為我們的返回值可以不進行接受,南無我們就不知道是哪一個函數了,
例子:
#include<iostream>
using namespace std;
// 1、參數類型不同
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;
}
// 2、參數個數不同
void f()
{cout << "f()" << endl;
}
void f(int a)
{cout << "f(int a)" << endl;
}
// 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;
}
int main()
{Add(10, 20);Add(10.1, 20.2);f();f(10);f(10, 'a');f('a', 10);return 0;
}
?