第一部分 ?C++編程知識
第一章 C++入門 —— 第一個C++程序
一、第一個C++程序代碼展示
//寫一個C++程序,實現在屏幕上打印 “hello world”
#include <iostream>
using namespace std;
int main()
{cout << "hello world" << endl;return 0;
}
二、main函數
????????main函數是程序的入口,C++的程序不管有多少行代碼,都是從main函數開始執行的,main函數也被叫做:主函數。main前面的int表示main函數執行結束的時候返回一個整型類型的值,而在main函數的最后寫return 0;正好前后呼應。
· main函數是程序的入口
· main函數有且僅有一個
· 一個項目中可以有多個.cpp文件,但是只能有一個main函數(因為程序的入口只能有一個)。
????????關于函數,這里不做過多描述,我們后面有專門的函數章節來講解。在這里需要知道的是,編寫一個C++程序,必須包含一個main函數,并且記住main函數的格式(與C語言的main函數完全相同)。
三、字符串
????????在C語言中(C++語言是完全兼容C語言的),使用單引號括起來一個字符,表示字符字面值,例如'A'、'1'、'@'等,它們在內存中以ASCII碼的形式存儲。例如,字符'A'的ASCII碼值是65,字符'a'的ASCII碼值是97。字符類型在C++語言中是char類型,它通常占用1個字節的內存空間。
????????使用雙引號括起來多個字符表示一個字符串,比如:"abcdef"?,?"hello world",字符串中可以有一個或者多個字符,也可以沒有任何字符,""表示空字符串。
????????上面代碼中的"hello world!"就是一個字符串。在C語言中往往用字符數組來表示一個字符串;在C++的STL中又引入了string類來表示字符串(C語言不支持),提供了一種更高效、更安全的辦法處理字符串,同時也支持更多對于字符串的操作,后期會詳細介紹。上述的代碼中字符串的內容可以根據需要變換成任意內容,可以自行嘗試。
四、頭文件
????????前面的代碼中,寫的#include?<iostream>,就是在包含頭文件,頭文件的名字叫:iostream,使用#include<?>的形式進行包含。iostream文件中的io指的是輸入(進入程序的信息,簡單理解就是可以給程序輸入數據——input)和輸出(從程序中輸出的信息,簡單理解就是程序會打印數據在屏幕上——output)。因此iostream即一個表示輸入輸出流的頭文件。
????????在C++程序中要完成輸入和輸出的操作會涉及到iostream文件中的多個定義,所以就要包含這個頭文件。比如:代碼中的cout是輸出流對象,就是用來完成數據輸出的,就需要包含頭文件。
????????我們可以把一個頭文件理解為一個工具箱,想要使用里面的工具,就需要包含這個頭文件。當然除了iostream這個頭文件之外,C++還有大量的頭文件。
????????C++的編譯器自帶了很多頭文件,每個頭文件都支持一組特定的工具。在代碼中如果使用了某個頭文件中的定義,也就是使用了對應的工具,就得包含對應的頭文件。
????????C++庫函數相關頭文件:https://zh.cppreference.com/w/cpp/header
????????關于C++語言中的頭文件,有以下需要注意的地方:
1、在C語言中頭文件的擴展名是?.h,但是C++中的用法發生了一些變化,對老式C語言的頭文件保留了擴展名?.h,但是C++自己的頭文件沒有擴展名。
C語言頭文件:https://zh.cppreference.com/w/c/header
2、有些C的頭文件被轉換成C++頭文件,這些文件名被重命名,去掉了?.h擴展名,并在文件名的前面加上了前綴c(表示來自C語言);例如:C語言中有關數學的頭文件名字是math.h,在C++中就是cmath。當然還得注意,有時頭文件的C語言版本和C++版本相同,而有時候,新版本做了一些修改。
????????C++語言中的頭文件命名約定:
頭文件類型 | 約定 | 實例 | 說明 |
C++語言舊式風格 | 以 .h結尾 | <iostream.h> | C++程序可以使用 但是一些新的IDE可能不再支持 |
C語言舊式風格 | 以 .h結尾 | <math.h> | C程序、C++程序均可使用 |
C++語言新式風格 | 沒有擴展名 | <iosream> | C++程序可以使用,使用namespace std |
轉換后的C | 加上前綴 但沒有擴展名 | <cmath> | C++程序可以使用,可能包含的不是C的特性 |
????????我們現在學習的編程風格便是C++語言新式風格,可能還會結合C語言中的頭文件,但是不推薦使用C++語言舊式風格了。
五、cin和cout的初識
????????cout?<<?"hello world!"?<<?endl;這句代碼在上面的程序中是最重要的代碼,其他所有的代碼都是為了編寫這句代碼。
????????代碼中的cout是標準輸出流對象(針對控制臺,也就是屏幕),其實還有標準輸入流對象(針對的是鍵盤)cin。
????????cout是告訴程序把后面雙引號中的內容打印到標準輸出設備(屏幕)上,雙引號中的內容是可以替換的。
#include <iostream>
using namespace std;
int main()
{int num = 0;//num其實是一塊空間,可以存放一個整數cin >> num; //輸入操作,輸入一個整數存放在num中cout << num << endl; // 輸出操作,將num中的數值打印在屏幕上 return 0;
}
????????上面這段代碼實現了由鍵盤輸入一個整數,再在屏幕上打印出來,接下來對cin和cout進行幾點說明:
1、cin和cout是全局的流對象,cin負責輸入數據,cout負責輸出數據。它們是C++標準輸入輸出庫的核心部分,通過這些流對象,可以很方便地實現數據的輸入和輸出操作。
2、endl是C++中一個特殊的操作符,效果是換行和刷新緩沖區,使用時必須包含iostream頭
文件。
3、<<?是流插入運算符,和cout配合使用,>>?是流提取運算符,和cin配合使用,兩者容易混淆,一定要仔細區分,不可混用。
4、使用C++輸入輸出更方便,不需要像C語言中的printf?/?scanf輸入輸出時那樣,需要手動控制格式。C++的輸入輸出可以自動識別變量類型。
????????接下來我們再使用一段代碼來展示在C++語言中輸入輸出一個浮點型(小數):
#include <iostream>
using namespace std;
int main(){float num = 0.0;cin >> num; cout << num << endl; return 0;
}
六、名字空間
????????using namespace std;這句代碼的意思是:使用名字空間std(名字空間也叫命名空間)。
????????為了理解什么是名字空間,名字空間要解決什么問題,先來看下面的一個例子:一個學校里學生可能有重名,假設這個學校有3個叫張三的同學,那么每次老師喊張三的時候,其他兩個張三就會誤會,是不是在喊自己,這就是因為這三個張三其實在同一個范圍(空間)內的,就會有名字的沖突。
????????但是如果這個學校的學生分為三個班,分別是1班、2班、3班,把三個張三分別安排在不同的班級,那么老師以后喊:1班的張三,那么2班、3班的張三就不會誤會了,這就很好的解決了名字沖突的問題。
????????其實這里的本質就是:將名字進行了隔離同時在使用名字之前先交待使用哪個班級的名字。
????????在C++中,變量、函數和類都是大量存在的,這些變量、函數和類的名稱如果都存在于全局作用域中,可能會導致很多沖突。比如,你定義了一個名為sort的函數,而標準庫中也有一個sort函數,如果沒有名字空間,編譯器就不知道你到底要調用哪一個。使用名字空間的目的是對標識符的名稱進行隔離,以避免命名沖突或名字污染,namespace關鍵字的出現就是針對這種問題的。
????????std是C++標準庫的名字空間名,C++將標準庫的定義實現都放到這個命名空間中,當我們需要使用標準庫中的內容時,就需要加上:using namespace std;當有了這句代碼的時候,表示名字空間std中信息都是可見和可用的,比如:cin、cout、endl等。
????????名字空間也是根據需要自己定義的,但是在算法競賽當中基本使用不到,這里就不加詳細介紹,大家可以自行拓展學習。
????????當然直接使用using namespace std;是一種簡單粗暴的做法,直接這樣使用,就意味著后續在std這個名字空間中的各種定義都可以直接使用,但是我們往往只是使用部分。所以名字空間其實也可以這樣使用:
#include <iostream>
int main()
{int num = 5;std::cout << num << std::endl;return 0;
}
????????上面代碼中的std::cout的意思就是使用std名字空間中的cout。采用std::cout這種寫法,如果頻繁使用,在算法競賽中比較麻煩,耽擱時間。因此在藍橋杯這樣的競賽中,我們還是建議直接使用using namespace std;的形式。
????????但是在企業中做軟件開發基本上都使用類似std::cout的寫法,這樣寫可以更好的避免名字沖突的問題,當然在通過后期更深入的技術學習中可以體會得到。
七、注釋
????????C++語言中主要有兩種注釋形式:單行注釋?//?和多行注釋?/*???*/?。
????????注釋是對代碼進行解釋的文字(對代碼進行解釋或者對代碼文檔進行必要的說明),要放在代碼中,但是又無需編譯(編譯器不會對注釋進行編譯)。注釋是給程序員自己看的,在編寫帶代碼的時候寫必要的注釋是非常好的習慣,方便自己理解的同時也方便別的程序員閱讀你的代碼,編譯器會忽略注釋,基于注釋是被編譯器忽略的這個特點,在代碼中有些代碼不再需要的時候也會使用注釋的方式屏蔽。
????????單行注釋:指的是當前行不參與編譯和運行。比如下面這段代碼中使用的均為單行注釋。
#include <iostream>
using namespace std;
int main()
{int num = 0;//num其實是一塊空間,可以存放一個整數cin >> num; //輸入操作,輸入一個整數存放在num中cout << num << endl; // 輸出操作,將num中的數值打印在屏幕上 return 0;
}
????????多行注釋:指的是被包含在內的多行不參與編譯和運行。比如下面這段代碼就是一個多行注釋。
/*
編寫人:劉博實
編寫時間:2025年08月01日
編寫內容:C++語言的第一個程序
*/
#include <iostream>
????????在DevC++中注釋和取消注釋的快捷鍵:Ctrl?+?/
【練習一】
????????編寫一個能夠輸出Hello,World!的程序。
· 輸出提示:使用英文標點符號,“Hello,World!”后面沒有空格,H和W為大寫字母。?
【參考答案】
#include <iostream>
using namespace std;
int main()
{cout << "Hello,World!" << endl;return 0;
}
【本題注意點】
????????1、仔細讀題、審題。
????????2、注意語法細節:main函數的寫法、大括號的匹配、中英文標點的使用、包含頭文件以及命名空間的寫法。
【練習二】
????????在屏幕輸出信息,輸出一架小飛機。請編寫程序輸出這架小飛機。
【參考答案】
#include <iostream>
using namespace std;
int main()
{cout << " ** " << endl;cout << " ** " << endl;cout << "************" << endl;cout << "************" << endl;cout << " * * " << endl;cout << " * * " << endl;return 0;
}
【本題注意點】
????????OJ題目輸出的結果有嚴格的檢查,代碼輸出的結果必須和題目要求統一才是可以的。所以在接下來的習題中,如果有要求在特定情況下的輸出,我們可以考慮將對應內容直接進行復制粘貼。
【練習三】
????????輸入三個整數,整數之間由一個空格分隔。把第二個輸入的整數輸出。
· 輸入格式:只有一行,共三個整數,整數之間由一個空格分隔。
· 輸出格式:只有一行,一個整數,即輸入的第二個整數。
【參考答案】
#include <iostream>
using namespace std;
int main()
{int num1 = 0;int num2 = 0;int num3 = 0;cin >> num1 >> num2 >> num3;cout << num2 << endl;return 0;
}
【本題注意點】
? ? ? ? 1、這里的三個整數,可以分三次讀入,也可以一次讀入,要獲取到第二個輸入值時才能輸出結果。
? ? ? ? 2、cin是支持連續讀入幾個數值的;cout也是支持連續輸出幾個數值的。
【練習四】
????????給定一個字符,用它構造一個底邊長5個字符,高3個字符的等腰字符三角形。
· 輸入格式:輸入只有一行,包含一個字符。
· 輸出格式:該字符構成的等腰三角形,底邊長5個字符,高3個字符。
· 說明/提示:對于100%的數據,輸入的字符是ASCII中的可見字符。
【參考答案】
#include <iostream>
using namespace std;
int main()
{char a = '0';cin >> a;cout << " " << a << endl;cout << " " << a << a << a << endl;cout << a << a << a << a << a << endl;return 0;
}
【本題注意點】
????????在接下來進行“數據類型”的學習時,會了解到ASCII碼表,ASCII碼表前32位其實都是不可見字符。而ASCII碼表總共包含的范圍是0~127。