c++的重載 預設參數和命名空間詳解

来源:https://www.cnblogs.com/zhonglongbo/archive/2018/03/24/8641872.html
-Advertisement-
Play Games

參加了幾次筆試,發現有很多c++方面的問題被卡了。從現在開始進攻c++。之後會陸續更新c++學習筆記。 先說說我學習的書籍,大家如果有好的書籍推薦,感謝留言。 暫時是在看這些書自學。 1.C++介紹。 "c++介紹" C幾乎是C++的一個子集,所以C語言支持的語法在C++基本都支持並需要使用。C p ...


參加了幾次筆試,發現有很多c++方面的問題被卡了。從現在開始進攻c++。之後會陸續更新c++學習筆記。
先說說我學習的書籍,大家如果有好的書籍推薦,感謝留言。
c++書籍
暫時是在看這些書自學。

1.C++介紹。

c++介紹

C幾乎是C++的一個子集,所以C語言支持的語法在C++基本都支持並需要使用。C plus plus(C++),所以在C的基礎上又有了很多新的特性。

2.為什麼C++支持重載?C語言不支持--重點

先說說什麼是重載:C++ 允許多個函數擁有相同的名字,只要它們的參數列表不同就可以,這就是函數的重載(Function Overloading)。藉助重載,一個函數名可以有多種用途。
舉個例子


void Func( )
{
    int x = 0, y = 0;
    x = x + y;
}
void Func(int x, int y)
{
    int sum = x + y;
}

int main( )
{
    Func( );
    Func(4,5);
    return 0;
}

這就是函數重載。重載支持函數的參數列表不同。參數列表是指參數的類型和參數的個數。
參數的類型有點不好理解。舉個例子。

func(int x,int y);
func(int x,char y);
func(char x,int y);

上面三個函數相互構成重載。所以參數類型指的是兩個函數的得參數對應位置的類型。
再來說說為什麼C語言不支持重載,而c++支持
這個不許深入到底層去探個究竟,這裡我們要看底層彙編代碼(我們在linux平臺下查看彙編代碼,分別採用gcc和g++編譯)gcc一遍自帶,g++需要自己安裝,安裝只需輸入:
yum install gcc gcc-c++

下麵是執行過程:
重載底層實現
從圖中可以看出,C語言和c++在底層的函數解析規則不同,導致C語言不支持從重載。

3.預設參數

定義:就是在聲明函數的某個參數的時候為之指定一個預設值,在調用該函數的時候如果採用該預設值,你就無須指定該參數。
看個慄子:

int Add1(int a, int b)
{
    return a + b;
}

int Add2(int a, int b = 1)
{
    return a + b;
}


int main( )
{
    printf("%d\n",Add1(1, 2));
    printf("%d\n", Add2(1));
    printf("%d\n", Add2(1,2));
    system("pause");
    return 0;
}

看看結果
這裡寫圖片描述
函數在定義時給了預設值,調用時如果傳了參數就用實參,如果沒傳就用預設值。這個作用在後面學習類的構造函數很有用。
當然預設參數也有一定的規則:調用時你只能從最後一個參數開始進行省略,換句話說,如果你要省略一個參數,你必須省略它後面所有的參數,即:帶預設值的參數必須放在參數表的最後面。 預設值必須是常量。顯然,這限制了預設參數的數據類型,例如動態數組和界面類型的預設參數值只能是 nil;至於記錄類型,則根本不能用作預設參數。 預設參數必須通過值參或常參傳遞。

4.命名空間

以關鍵字namespace開始,其後接命名空間的名字:

namespace myname1
{
    int a = 1;
}

namespace myname2
{
    int a = 5;
}

命名空間的名字在其所在作用域中是唯一的,命名控制項可以在全局作用域或者其它作用域內部定義,但是不能在函數或者類的內部定義。
▶每個命名空間都是一個作用域:
這就不會出現C語言中的命名衝突問題。像上面的代碼有兩個變數a,但是不會出現命名衝突。
▶從命名空間外部使用命名空間成員:
myname1::a;
當我們使用該變數時要加上作用域限定符。
▶命名空間可以嵌套定義:

namespace myname2
{
    int a = 5;
    namespace myname3
    {
    int a = 10;
    }
}

這樣是可以的。
以上運行結果:
這裡寫圖片描述

註意:命名空間作用域不能以分號結束。

專欄鏈接:https://blog.csdn.net/column/mycolumn.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 看了很多關於捲積的介紹,一直感覺不怎麼理解,今天徹底研究下: 我們知道圖像是由像素構成的,圖像中的行和列一起構成了圖像矩陣,比如一個解析度800*400的圖像,同時也是一個大矩陣,這個矩陣有著400行和800列.假設有一個3*3的濾波小矩陣(捲積核), 在進行捲積運算的時候,我們便利整個圖像大矩陣中 ...
  • yum install gcc libffi-devel python-devel openssl-devel ...
  • 首發日期:2018-03-24 final關鍵字: final的作用:相當於使修飾的變數、方法或類“固定、最終化”,使得修飾的變數、方法、類不能再做改變【可以限制繼承的重寫】。 final可以修飾類、方法、變數。 final修飾的類不可以被繼承。 final修飾的方法不可以被覆蓋(重寫) final... ...
  • C++字元串string類 在C語言里,字元串是用字元數組來表示的,而對於應用層而言,會經常用到字元串,而繼續使用字元數組,就使得效率非常低. 所以在C++標準庫里,通過類string從新自定義了字元串。 頭文件: #include <string> string直接支持字元串連接 string直接 ...
  • 在使用vector容器的時候,需要將一個vector中的內容複製到另一個vector結尾,如何實現呢? 使用vector的insert方法 參數解釋: position:元素在容器中插入的位置,iteratior是一種成員類型,定義為指向元素的隨機訪問迭代器類型。 first,last:iterat ...
  • 在別人代碼里,經常看到std命名空間,比如使用std命名空間里的標準輸入輸出流對象cout: 其中cout相當於控制台輸出(console out),然後通過<<左移操作符,將每個字元列印出來. endl相當於就是'\n'換行. 接下來我們便通過上章學習的操作符重載,來實現上面功能 上面的操作符重載 ...
  • 項目背景 每個系統都有日誌,當系統出現問題時,需要通過日誌解決問題 當系統機器比較少時,登陸到伺服器上查看即可滿足 當系統機器規模巨大,登陸到機器上查看幾乎不現實 當然即使是機器規模不大,一個系統通常也會涉及到多種語言的開發,拿我們公司來說,底層是通過c++開發的,而也業務應用層是通過Python開 ...
  • 如果一個字元串去掉除字母和數字之外的所有字元後,正讀和逆讀都一樣,則這個字元串就是一個迴文。例如:“did Anna say as Anna did?”就是迴文。 編程:要求對輸入的字元串測試其是否為迴文。 1 class Palindrome{ 2 3 public static void mai ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...