01-Cin、Cout、函數重載和默認參數

《C++文章匯總》

久違了,重學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;
}
//編譯報錯,編譯器不知道要調用哪個
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容