C轉戰C (一)開始的開始

2021-08-02 11:17:02 字數 3655 閱讀 5453

折騰了很長時間的c,突然要轉戰c++,迫不得已只能從頭學起。草草翻了一遍《c++ primer plus》,自以為有有這麼長時間寫c的經驗,用起來作為c超集的c++應該也是毫無難度,到了真正上手才發現簡直兩眼一抹黑,掙扎了一段時間後,終於決定踏踏實實地學好c++,於是才又抱起了大部頭《c++ primer plus》,一切從零開始。

iostream

新的main()標準

注釋 命名空間

using編譯指令

cout和cin

省略引數名

這一章基本介紹了c++設計的兩個重要思想:oop泛型程式設計,區別於典型的c式面向過程程式設計,c++的物件導向程式設計讓語言滿足問題要求的思想更適用於大型專案的設計開發,不過將c++研究透徹前這些討論並無意義,所以也就先暫且放下。

首先是一段相當於hello world!的**:

#include 

int main()

看到和c相同的東西簡直謝天謝地,在別人的源**裡找這種感覺可不容易。

首先是stdio.h換成了iostream,包含檔案從c的「.h」版本轉換成c++版本後,去掉了副檔名,而一些老的c庫檔案轉換成c++庫時在名稱前加上「c」表示來自c語言,如math.h變成了*cmath,而對於新版本的庫而言,更多的是加入了命名空間,關於命名空間等下再說。

main的函式頭看上去沒變,不過c++對省略的定義變了,在c++中空引數列表等效於void。

另一點要說的是void main()這樣的用法是非標準的,據說在部分系統上可能無法使用,雖然沒見過不可使用的情況,但最好還是注意點。

哦對了,在main()末尾省略return語句等效於return 0被寫進了標準(即使不寫編譯器也都會支援的吧?)。

注釋上c++支援兩種格式:「//」(c99標準c也支援)和「/* … */」,前者使當前行//以後的變為注釋,後者和c用法相同,大段大段的注釋。

乙個重大變化:命名空間,就是這一行:

using

namespace

std;

c++中為了區分同名函式加入了命名空間,例如當有a和b開發的兩個print()函式,那麼他們可以在封裝時將各自的函式封裝到各自的命名空間中,用「::」來指明。

那麼兩個函式使用時就會寫成:「a::print()」和「b::print()」,這樣就能清楚地區分所使用的函式版本了。

而c++標準中包含的庫函式都會放置在命名空間「std」中,所以可以寫如下**。

some

time.」;

std::cout << endl;

然而要是每個函式使用時都必須加上這麼個字首,程式設計師工作量可是成倍增加的,早就跟iso拼命了,所以才有了這麼個東西:using編譯指令,using編譯器指明在當前函式體內都是用該命名空間的函式。

using有兩種用法,一種是「using namespace std」這樣,說明函式體內全部使用std命名空間的名稱,這樣雖然省事但在構建大型專案時容易留下隱患,作者如是說.

於是還有另一種用法:「using std::cout」即指明函式體內cout全部使用std命名空間內的cout,看起來是一種穩妥的偷懶方法。

示例**中的《表示插入運算子而非左移,這是c++的新特性之一「過載」,過載使乙個符號在不同上下文語境中有了不同的含義,具體的過載用法將在以後的章節中說明。

在例子中,插入運算子《表示將其後的字串(與c中相同)傳送給cout,cout將字串顯示出來。

c++概念中,cout物件表示輸出流,而cout將插入運算子右側的字串插入到流中,也就是說不是cout顯示了字串而是將字串插入到流中。

唔,看起來流的概念在c++中似乎沒什麼變化,cout和printf()的工作看起來似乎也很相似。

c++定義了乙個控制符:endl,效果等同於轉義序列\n但不能在字串中使用,也就是說:

cout

<<"hello world"

《等於:

cout

<<"hello world\n";

等於:

cout

<<"hello world"

<<"\n";

endl的優勢在於確保將輸出立刻顯示在螢幕上,而\n顯然做不到這一點,經管如此並不意味著拋棄轉義序列,c程式設計師的老朋友仍然在新崗位發揮著重要作用。

在原始碼格式化(大概可以理解為原始碼中空格回車在不同位置的作用)中,空格、回車、分號發揮的作用和c完全一樣,只有c++11標準新增的原始字串(raw)可以包含回車,關於這個留到以後再說。

然後是一段新例程,我就不打了:),只說一下語句上c++和c的異同。

首先是宣告變數可以不用位於函式體開頭了,c++建議在首次使用變數前宣告,不過沒有強制性限制(c99標準c似乎也支援這種寫法)。

另乙個改動是新增了「引用宣告」,宣告編譯時可以使用在其他地方定義的變數,不是很理解為什麼,難道包含語句不是預先將各個檔案連在一起了嗎?具體還是等等看後面怎麼講吧。

賦值語句(「=」)沒變,一樣的從右往左,一樣的連續賦值。

值得一提的是cout比printf()聰明多了,可以自動識別傳遞給她的是什麼型別的變數並自動轉化為字串輸出,比如說給它乙個整形數字25時,會將整型的25轉化為字串「25」然後輸出,相當於printf的%s、%d這類東西,不得不說方便了不少,即使定義了新的資料型別也可以用《的過載使cout可以使用新的資料型別。

c++中有另乙個與cout相似的cin用於獲取輸入,並且也將自動進行型別轉換。例如:

c++

...

int a;

cin >> a;

...

『>>』是和』<<』對應的插入運算子,需要在其右側提供乙個變數接受傳遞過去的值。

cout的分成多行拼接輸出與printf類似,也就不在贅述。

然後!然後!然後!是c++的物件導向核心概念——類!

類是使用者定義的一種資料型別,描述資料格式和其用法(包括其可執行的所有操作),因此定義類需要描述它能夠表示什麼資訊和對資料執行什麼操作。由類建立的可操作的實體就是物件。

打個不恰當的比方:c中可以用struct定義結構體,但定義的整個資料結構並不能直接操作,而是要用該結構體建立乙個該結構體變數,在對其進行讀寫等操作,而定義的這個結構體就是類,建立的該結構體變數就是物件。

這個例子不是很恰當,但至少有助於理解類和物件的關係,而具體概念學著學著就會明白了。

定義是這麼說的:類描述了一種資料型別的全部屬性(包括可使用它執行的操作),物件是根據這些描述建立的實體。

另外,和函式一樣,類也可以放在庫中,在包含後使用,像ostream和istream這兩個類就放在iostream中一樣。

要讓特定物件執行類允許的操作,必須給該物件傳送一條訊息,c++提供了兩種方式:一是使用類方法(其實就是函式呼叫),另一種是使用運算子過載,想cout和cin這樣。

在函式上c++和c基本保持一致,網上查閱資料後發現一點小區別:當不需要使用形參時,只有c++可以省略引數名(c不可省略),這麼做有時會得到編譯器的警告,可能不是標準用法吧(msvc和gcc都支援)。

C 啃書(一)開始

int main 1 編譯 執行程式 原始檔 編譯 可執行檔案 執行 型別 元素 運算 2 hello world include using namespace std intmain iostream庫 istream和ostream 標準輸入輸出物件 cin istream cout,cerr...

寫在一開始

沒想到畢業9年後要把這個賬號找回來了。大學時在華工百步梯和電子設計比賽中度過了愉快的時光,但是畢業時貪圖享受來到乙個山溝溝裡蓋電廠。電廠蓋好了,但依然無法融入這個山溝溝。為了能回深圳跟女友和家人團聚,努力拼搏,集團深圳分公司想要我,但這裡卻不放。沒有辦法,動起了重新拾起程式設計,回深圳找工作的念頭。...

C primer 筆記(一) 開始

1.1 編寫乙個簡單的c 程式 乙個函式包含四個部分 1 返回型別 2 函式名 3 乙個圓括號包圍的形參列表 允許為空 4 函式體 main函式的返回值型別必須為int。1.2 初識輸入輸出 標準輸入輸出庫 iostream庫,包含兩個基礎型別 1 輸入流istream 2 輸出流ostream.標...