久違了,重學C++,上一次學C++還是2009年讀大一下學期的時候,輪回,發現C++是挺重要的,就像很多事情一樣,很多年后才發現是如此重要,就像作者所說的那樣,環保高效緩解全球變暖,很負責任的一門語言,有始有終,善始善終,我申請我釋放,別人申請的我釋放不了,想起了一句古話,解鈴還須系鈴人,這也是一種生活的態度。戀愛何嘗不是,負責任到底。就像毛爺爺說的,一切不以結婚為目的的戀愛都是耍流氓。好了,不耍流氓了,言歸正傳。
本文介紹Cin、Cout、函數重載和默認參數。
1.cin,cout輸入輸出,endl表示換行,getchar()等待鍵盤輸入,如果敲回車就會讀取鍵盤輸入
#include <iostream>
using namespace std;
int main(){
cout << "Hello World!" << endl;
cout << "please type a number:" << endl;
int age;
cin >> age;
cout << "age is:" << age << endl;
getchar();
return 0;
}
//輸出
Hello World!
please type a number:
20
age is:20
Program ended with exit code: 0
2.C語言不支持函數重載,C++支持函數重載
I.方法名相同,參數個數不相同
#include <iostream>
using namespace std;
int sum(int v1,int v2){
return v1+v2;
}
int sum(int v1,int v2,int v3){
return v1 + v2 + v3;
}
int main(int argc, const char * argv[]) {
cout << sum(10, 20) << endl;
cout << sum(10, 20, 30) << endl;
return 0;
}
II.方法名相同,參數類型不同
void func(int v1,double v2){
cout << "func(int v1,double v2)" << endl;
}
void func(double v1,int v2){
cout << "func(double v1,int v2)" << endl;
}
int main(int argc, const char * argv[]) {
func(10, 10.5);
func(10.5, 10);
return 0;
}
//輸出
func(int v1,double v2)
func(double v1,int v2)
注意:返回值類型不同,不能構成重載,容易產生歧義和二義性,編譯報錯
int funct(){
return 0;
}
double funct(){
return 0;
}
參數的隱式轉換,可能會產生二義性,會編譯報錯,不知道10是轉換為long類型還是double類型
//display_int
void display(int a){
cout << "display(int a)" << endl;
}
//display_long
void display(long a){
cout << "display(long a)" << endl;
}
//display_double
void display(double a){
cout << "display(double a)" << endl;
}
int main(int argc, const char * argv[]) {
display(10);
}
本質
采用了name mangling或者叫name decoration技術
C++編譯器默認會對符號名,比如函數名進行改變修飾,編譯器將三個函數生成了不同的函數名,所以可以共存,不同的編譯器(MSVC,g++)有不同的生成規則
C語言編譯器會在函數名前面加下劃線_,會生成三個相同名字的函數名,產生沖突了,不支持函數重載
3.默認參數
C++允許函數設置默認參數,在調用時可以根據情況省略實參。規則如下:
默認參數只能按照右到左的順序,若從左到右會編譯報錯,產生二義性
void display(int a = 10, int b){
cout << "a is " << a << endl;
}
int main(int argc, const char * argv[]) {
display(30,40);
return 0;
}
//編譯報錯
如果函數同時有聲明、實現,默認參數只能放在函數聲明中
默認參數的值可以是常量、全局符號(全局變量、函數名)
void func(){
cout << "func()" << endl;
}
int age = 33;
void test(){
cout << "test()" << endl;
}
void display(int a=11,int b = 22,int c = age,void(*func)() = test){
cout << "a is" << a << endl;
cout << "b is" << b << endl;
cout << "c is" << c << endl;
func();
}
int main(int argc, const char * argv[]) {
display();
return 0;
}
//輸出
a is11
b is22
c is33
test()
如果函數的實參經常是同一個值, 可以考慮使用默認參數
函數重載、默認參數可能會產生沖突、二義性(建議優先選擇使用默認參數)
void display(int a){
cout << "a is " << a << endl;
}
void display(int a, int b = 20){
cout << "a is " << a << endl;
}
int main(int argc, const char * argv[]) {
display(10);
return 0;
}
//編譯報錯,編譯器不知道要調用哪個