輕輕鬆鬆從C一路走到C 系列文章之一

2021-04-14 00:32:19 字數 3504 閱讀 8007

摘要

c++技術固然是很時髦的,許多c使用者都想在盡可能短的時間內為自己貼上c++的標籤。介紹c++的書很多,但只有那些已經僥倖入門的使用者才偶爾去翻翻,仍有不少在c++門口徘徊的流浪漢。

本文只針對c使用者,最好是一位很不錯的老使用者(譬如他在遇到最簡單的問題時都嘗試著使用指標),通過一些c和更好的c++(本文用的是borland c++3.1版本)例程介紹有關c++的一些知識,讓讀者朋友們「淺入深出」,輕輕鬆鬆c to c++!

一、標籤!標籤!

快快為你的程式貼上c++的標籤,讓你看起來很像個合格的c++使用者……

1.注釋(comment)

c++的注釋允許採取兩種形式。第一種是傳統c採用的/*和*/,另一種新採用的則是//,它表示從//至行尾皆為注釋部分。讀者朋友完全可以通過//使你的**帶上c++的氣息,如test0l:

//test01.cpp

#include //i'm a c++user!

//…and c is out of date.

void main()

hello-world!

如果你嘗試著在test0l. exe中找到這些高階的注釋,很簡單,它們不會在那裡的。

2. cincout

你可能從test0l中嗅出什麼味兒來了,在c++中,其次的貴族是cout,而不是很老土的printf ( )。左移操作符』<<』的含義被重寫,稱作「輸出操作符」或「插入操作符」。你可以使用』<<』將一大堆的資料像糖葫蘆一樣串起來,然後再用cout輸出:

cout << "ascii code of "<< 'a' << " is:" <<97; 

ascii code of a is:97

如何來輸出乙個位址的值呢?在c中可以通過格式控制符」%p」來實現,如:

printf ("%p,&i);

類似地,c++也是這樣:

cout << & i;

但對字串就不同啦!因為:

char * string="waterloo bridge";

cout << string; //prints 『waterloo bridge'

只會輸出string的內容。但方法還是有的,如採取強制型別轉換:

cout<<(void *)string;

cin採取的操作符是』>>』,稱作「輸入操作符」或「提取操作符」。在標頭檔案iostream.h中有cin cout的原型定義,cin語句的書寫格式與cout的完全一樣:

cin>>i; //ok

cin>>&i; //error. illegal structure operation

看到了?別再傻傻地送乙個scanf()常用的』&』位址符給它。

c++另外提供了乙個操縱運算元endl,它的功能和』/n』完全一樣,如test0l中的cout語句可改版為:

cout << 」hello world!」<

3.即時宣告

這是筆者杜撰的乙個術語,它的原文為declarations mixed with statements,意即允許變數的宣告與語句的混合使用。傳統c程式提倡使用者將宣告和語句分開,如下形式:

int i=100;

float f; //declarations

i++;

f=1.0/i; //statements

而c++拋棄這點可讀性,允許使用者採取更自由的書寫形式:

int i=100;

i++;

float f =1. 0/i;

即時宣告常見於for迴圈語句中:

for(int i = 0; i < 16; i++)

for(int j = 0; j < 16; j++)

putpixel(j i color[i][j]);

這種形式允許在語句段中任點宣告新的變數並不失時機地使用它(而不必在所有的宣告結束之後)。

特別地,c++強化了資料型別的類概念,對於以上出現的」int i=1 j=2;」完全可以寫成:

int i(1) j (2);

再如:

char * stringl("youth studio.」);

char string2("computer fan.「);

這不屬於「即時宣告」的範疇,但這些特性足以讓你的**與先前愚昧的c產品區別開來。

4.作用域(scope)及其訪問操作符(scope qualifier operator)

即時宣告使

c語言的作用域的概念尤顯重要,例如以下語句包含著一條錯誤,因為ch變數在if塊外失去了作用域。

if(ok)

char ch='!';

else

ch='?'; //error. access outside condition

作用域對應於某一變數的生存週期,它通常表現為以下五種:

塊作用域

開始於宣告點,結束於塊尾,塊是由{}括起的一段區域

函式作用域

函式作用域只有語句標號,標號名可以和goto語句一起在函式體任何地方

函式原型作用域

在函式原型中的參量說明表中宣告的識別符號具有函式原型作用域

檔案作用域

在所有塊和類的外部宣告的識別符號(全域性變數)具有檔案作用域

類作用域

類的成員具有類作用域

具有不同作用域的變數可以同名,如test02:

//test02.cpp

#include int i=0;

void main()

cout<

編譯器並未給出錯誤資訊。

作用域與可見性並不是同一概念,具有作用域不一定具有可見性,而具有可見性一定具有作用域。

在test02中,float i的使用使全域性int i失去可見性,這種情形被稱作隱藏(override)。但這並不意味著int i失去了作用域,在main()函式執行過程中,int i始終存在。

有一種辦法來引用這丟了名份的全域性i,即使用c++提供的作用域訪問操作符::,它表示引用的變數具有檔案作用域,如下例程:

//test03.cpp

#include enum ;

char i = boy;

void main()

cout << "i am a " << (i ? "girl." : "boy.");

} i=0.01

i am a girl.

在上例中,通過::操作符,第8行語句偷偷地改寫了i所屬的性別。更妙的是,::之前還可以加上某些類的名稱,它表示引用的變數是該類的成員。

5. new delete

許多c使用者肯定不會忘記alloc()和free()函式族,它們曾經為動態

記憶體分配與釋放的操作做出了很大的貢獻,如: 

輕輕鬆鬆編譯核心

輕輕鬆鬆編譯核心 徐永久發表於 2002年09月10日 22 31。曾經重新編譯核心是一件多麼複雜的事情,很多人都會有這樣的恐懼感。然而,看完本文以後,希望你會感到一身輕鬆,原來核心的編譯可以如此簡單。一 公升級核心的原因 公升級的原因有很多,例如新的硬體驅動,去除核心 bug 一般而言新核心會比舊...

輕輕鬆鬆打包MeeGo的QT程式

打包meego的qt程式是程式設計師的快樂時光,看到自己的成果馬上要發布了,多少天開發的勞累,多少天的抓耳撓腮的痛苦,都在此時化為美麗的故事。rpm包是meego最為常用的安裝包,本篇部落格以rpm包為基礎,講述如何在這快樂時光中,輕輕鬆鬆打包meego的qt程式。小結 rpm打包方法和工具有很多,...

linux環境之 輕輕鬆鬆背單詞

a.sudo apt get install libgtk2.0 0 libgtk2.0 dev libesd0 dev esound2 安裝應用程式 a.tar jzvf reciteword 0.8.4.tar.bz2 b.configure prefix usr local c.sudo ma...