天天看點

C++之特殊函數:重載、預設參數值和内聯函數

文章目錄

      • 1. 變量的作用域
      • 2. 重載函數
      • 3. 帶有預設值的函數
      • 4. 内聯函數

該文為中國大學MOOC上北京郵電大學崔毅東和楊談老師主講的《C++程式設計(面向對象進階)》筆記整理

1. 變量的作用域

  1. 作用域的分類
  • 全局作用域:全局變量
  • 局部作用域:局部分類

    如果外部代碼塊和内嵌代碼塊有同名變量,那麼會産生同名覆寫,此時遵循"就近原則"

  1. 一進制作用域解析運算符

    當局部變量與全局變量相同時,可使用 :: 通路全局變量,該運算符被稱為一進制作用域解析運算符

    #include<iostream>
    int i = 10;
    int main() {
    	int i = 5;
    	for (int i = 0; i < 4; i++) {
    		std::cout << i << std::endl;  // 通路的是 for 循環中的 i
    		std::cout << ::i << std::endl;  // 通路的是全局變量 i,而不是 for 前面的 i
    	}
    	return 0;
    }
               

2. 重載函數

重載函數是在同一個名字空間中存在兩個或多個具有相同名字的函數所構成的文法現象

調用重構函數的語句,是編譯器在編譯期确定的

編譯器确定重構函數的依據是函數參數的類型、個數和次序,無法根據函數的傳回值判斷

如果編譯器無法判定,就會報告二義性錯誤

#include<iostream>
auto max(int a, int b) {
	return a > b ? a : b;
}
auto max(double a, double b) {
	return a > b ? a : b;
}
int main() {
	std::cout << max(4,2) << std::endl;   // 調用第一個 max
	std::cout << max(4.5, 2.2) << std::endl;   // 調用第二個 max
	return 0;
}
           

3. 帶有預設值的函數

函數的參數可以指定預設值

指定預設值時,要保證帶預設值的參數位于函數清單的右側

int max(int a,int b = 1,int c); // error
int max(int a,int b = 1,int c = 1);  // correct
           

調用帶有預設值的函數時,如果不指定帶有預設值的參數,則該參數自動被賦為預設值

#include<iostream>
auto max(int a, int b = 1) {
	return a > b ? a : b;
}
int main() {
	std::cout << max(4, 2) << std::endl;  // 傳入參數 b=2
	std::cout << max(5) << std::endl;   // 未對b傳參,b 預設為1
	return 0;
}
           

函數聲明有預設參數,函數實作時不需要帶預設參數

#include<iostream>
int max(int a, int b=5);
int main() {
	std::cout << max(2,6) << std::endl;
	std::cout << max(3) << std::endl;
	return 0;
}
int max(int a, int b ) {   // 如果此處給 b 賦預設值,報錯
	return a > b ? a : b;
}
           

函數重載時,不允許定義預設參數

#include<iostream>
void max(int a = 1) {
	std::cout<<a<<std::endl;
}
void max(double	a = 1.4) {
	std::cout << a << std::endl;
}
int main() {
	 max(3);
	 max();   // error,對重載函數的調用不明确
	return 0;
}
           

4. 内聯函數

  1. 普通函數的優缺點
    • 優點:易讀易維護
    • 缺點:調用時有開銷
      • 函數調用時:參數及部分 CPU 寄存器的内容進棧,控制流跳轉
      • 函數傳回時:傳回值及寄存器值出棧,控制流跳轉
  2. 使用内聯函數
    • 目的:減小函數調用開銷
    • 方法:代碼插入到調用處
    • 結果:程式變大
  3. 内聯函數的聲明

    在普通函數前面加上 inline 關鍵字

    inline int max(int a, int b) {
    	return a > b ? a : b;
    }
               
  4. 調用内聯函數

    和調用普通函數寫法相同

    int x = max(3,6);
    int y = max(0,8);
               
  5. 内聯展開

    編譯器實際在調用内聯函數的情況

    int x = (3 > 6 ? 3 : 6);
    int y = (0 > 8 ? 0 : 8);
               
  6. 内聯函數的使用

    常用場景:适用于頻繁調用的短函數

    inline 關鍵字,隻是對編譯器的一個請求,内聯函數是否展開,由編譯器決定

繼續閱讀