第一章 C++語言概述
1.1 知識要點
1.C++語言的特點
(1)C++語言支持數據封裝 封裝是指把對象屬性和操作結合在一起,構成獨立的單元,它的內部信息對外界是隱蔽的,不允許外界直接存取對象的屬性,只能通過有限的接口與對象發生聯繫。類是數據封裝的工具,對象是封裝的實現。
(2)C++類中包含私有、公有和保護成員 類的訪問控制機制體現在類的成員中可以有公有成員、私有成員和保護成員。對於外界而言,只需要知道對象所表現的外部行爲,而不必瞭解內部實現細節。封裝體現了面向對象方法的“信息隱蔽和局部化原則”。
(3)C++語言中通過發送消息來處理對象 消息指對象之間在交互通訊中所傳送的信息。消息由三部分構成:消息名、接收消息的對象標識和參數。一個對象向另一個對象發送消息請求某項服務,接收消息的對象響應該消息,進行所要求的服務,並把操作的結果返回給請求服務的對象。
(4)C++語言中允許友元破壞封裝性
(5)C++語言允許函數名和運算符重載
(6)C++語言支持繼承性 繼承指子類(派生類)可以自動擁有父類(基類)的全部屬性和服務。父類和子類是一般與特殊的關係。在定義一個子類時,可以把父類所定義的內容做爲自己的內容,並加入若干新的內容
(7)C++語言支持動態聯編 多態性是指在基類中定義的屬性和服務被子類繼承後,可以具有不同的數據類型和表現出不同的行爲。當一個對象接收到一個請求進行某項服務的消息時,將根據對象所屬的類,動態地選用該類中定義的操作。
2.C++程序的組成
註釋部分(兩種風格)、編譯預處理部分(宏定義,文件包含和條件編譯、)、程序正文部分(類型定義、常變量定義、函數定義)。最終,程序源代碼由ASCII碼組成類似單詞或詞組的單元(詞法單元),可以用任意的文本編輯器編輯,源代碼中的空白(空格、Tab、回車換行)用來表示詞法單元的開始和結束,除這一功能外其餘空白將被忽略,但如果是字符串內部的空白(不含回車換行,或者說字符串內不能直接回車換行,需要使用轉義符)將作爲字符串的一部分輸出,不會忽略。
註釋:
1)一對符號“/ *”與“* /”之間的內容稱爲註釋。它可以佔多行,是從C語言中繼承來的一種註釋形式。
2)一行中符號“//”之後的內容也稱爲註釋。它只能佔一行,是C++語言特有的一種註釋形式。
編譯預處理命令:
C++的編譯預處理命令以“#”開頭。C++提供了三類編譯預處理命令:宏定義、文件包含和條件編譯。
程序主體:用函數組織過程,每個相對獨立的過程都要組織成一個函數;不同的程序由不同的函數按層次結構組織而成。一個C++程序至少且僅包含一個main()函數,也可以包含一個main()函數和若干個其他函數。其他函數可以是系統提供的庫函數(例如printf()和scanf()函數),也可以是用戶根據需要自己編制設計的函數
3.函數
C++的程序由若干個文件組成,文件名的後綴爲.cpp(c plus plus)。每個文件又是由函數組成,函數之間可以調用。在這些函數中只有一個函數是主函數main()。程序執行時,操作系統先調用主函數,主函數再依次調用其它函數完成設計任務。
4.程序的編輯、編譯、連接和運行
(1)編輯 編輯是將編寫好的C++源程序輸入到計算機中,生成磁盤文件的過程。
(2)編譯和連接過程
編譯器的功能是將程序的源代碼轉換成爲機器代碼的形式,稱爲目標代碼,然後,再將目標代碼進行連接,生成可執行文件。
編譯過程又可分爲三個子過程。
(1)預處理過程:對源程序編譯時,先進行預處理,如果源程序中有預處理命令,則先執行這些預處理命令,執行後再進行下面的編譯過程。
(2)編譯過程:編譯過程主要是進行詞法分析和語法分析的過程,又稱源程序分析。
1)詞法分析。2)語法分析。3)符號表。4)錯誤處理程序。5)生成目標代碼。
連接過程:這是編譯的最後一個過程,將用戶程序生成的多個目標代碼文件和系統提供的庫文件中的某些代碼連接在一起由連接器生成一個可執行文件,存儲這個可執行文件的擴展名爲.exe。
(3)運行 一個C++的源程序經過編譯和連接後生成了可執行文件。運行可執行文件可在編譯系統下選擇相關菜單項來實現,也可以採用其他方法。
1.2 典型例題分析與解答
例題1:顯示“I am a student”字符串,並通過簡單的程序瞭解和熟悉運用VC++開發環境進行編寫、編譯、調試、顯示結果的過程。
解答:該程序非常簡單,如下代碼所示,運用了cout輸出流對象代表標準輸出顯示器,<<代表後邊的字符串向顯示器輸出的方向。
#include <iostream.h>
void main()
{cout<<”I am a student”<<endl; }
編輯過程:
圖1-1 新建對話框
①編輯
編輯是將C++源程序輸入計算機的過程。在Visual C++6.0主界面下,點擊File菜單,選擇New菜單項,即可出現New對話框,如圖1-1所示。在彈出窗口中的Files標籤頁下,選擇C++ Source File。在選項卡右面的文件編輯框裏輸入文件名如“Exa”,在目錄編輯框裏輸入文件路徑,如“d:/test”。點擊確認按鈕。將出現編輯窗口,如圖1-2所示。
在圖1-2所示的右端編輯窗口裏輸入以下C++源程序並保存文件。
圖1-2 編輯窗口
②編譯
編譯是使用系統提供的編譯器將文本文件Exa.cpp生成機器語言的過程,結果爲Exa.obj,由於沒有得到系統分配的絕對地址,還不能直接運行,如圖1-3所示。選擇編譯菜單下的編譯 Exa.cpp,計算機將完成對當前源程序的編譯。按提示建立默認工程空間。編譯無錯時,將源程序Exa.cpp編譯爲目標文件Exa.obj。
圖1-3 編譯源程序
③連接
連接是將目標文件Exa.obj轉換爲可執行文件Exa.exe的過程。如圖1-4所示選擇編譯菜單下的構件 Exa.exe。連接無錯時,將目標文件Exa.obj連接爲Exa.exe。
圖1-4 源程序
④運行
運行是執行可執行文件Exa.exe,屏幕輸出運行結果。如圖1-5所示選擇編譯菜單下的執行 Exa.exe。
圖1-5 運行程序
運行結果如圖1-6所示:
圖1-6 運行結果
例題2:輸入一名學生的成績,判斷該成績的等級。
如>=60的,顯示“合格”,<60的顯示“不合格”。
程序:
#include<iostream.h> //輸入輸出流對象的頭文件
void main()
{ int score; //聲明成績變量,用來保存分數
cout<<”輸入成績:”; //提示用戶的信息
cin>>score; //從鍵盤上輸入分數傳遞給score
if( score>=60) //判斷該條件是否真或假
cout<<”合格”<<endl; //當score>=60是真的時候,運行該語句
else
cout<<”不合格”<<endl; //當score>=60是假的時候,運行該語句
}
分析:
(1) 首先該題目要求輸入一個分數,則事先聲明一個整型變量score。
(2) 其次從鍵盤上輸入該分數,應有輸入語句cin,並由上面定義的變量來保存分數。
(3) 然後根據分數來判斷等級,有兩種情況應該用if語句。
(4) 輸出的信息是根據不同條件顯示字符串,用到cout輸出流對象。
(5) 用到標準輸入輸出流對象,所以在程序前加相應頭文件。
例題3:面向對象的( )是一種信息隱蔽技術,目的在於將對象的使用者與設計者分開。不允許使用者直接存取對象的屬性,只能通過有限的接口與對象發生聯繫。
A.多態性 B.封裝性 C.繼承性 D.重用性
答案B
分析:封裝性是指把對象屬性和操作結合在一起,構成獨立的單元,其內部信息對外界是隱蔽的,不允許外界直接存取對象的屬性,只能通過有限的接口與對象發生聯繫。
若不清楚多態性的定義,誤選答案A。多態性是指當一個對象接收到一個請求進行某項服務的消息時,將根據對象所屬的類,動態地選用該類中定義的操作。若不清楚繼承性的定義,誤選答案C。繼承是指派生類可以自動擁有基類的全部屬性和服務。若不清楚重用性的定義,誤選答案D。重用性是多態性的一種表現形式。
例題4:C++源文件的擴展名爲( )。
A.cpp B.c C.txt D.exe
答案A
分析:C++源程序的擴展名爲cpp。C程序的擴展名爲c。文本文件的擴展名爲txt。源程序編譯後可執行文件的擴展名爲exe。
若不清楚C++源程序擴展名和C源程序擴展名的區別,誤選答案B。C++兼容C,當文件名保存爲c時,調用C編譯器;當文件名保存爲cpp時調用C++編譯器。若不清楚C++源程序擴展名和文本文件擴展名的區別,誤選答案C。C++源程序可以在文本編輯器裏編輯,但一定注意將其擴展名保存cpp,不能爲txt。若不清楚C++源程序和C++可執行文件的擴展名的區別,誤選答案D。C++源程序經過編譯、連接後得到可執行文件的擴展名爲exe。
例題5:C++的合法註釋是( )。
A./*This is a C program/* B.// This is a C program
C. “This is a C program” D.//This is a C program//
答案:B
分析:單行註釋常採用“//”,多行註釋採用“/*”和“*/”。單行註釋也可採用“/*”和“*/”,但答案A書寫格式錯誤,不能選答案A。註釋和字符串的區別,雙引號內的字符爲字符串。不能選答案C。單行註釋不需要結束符“//”,如果有,只能作爲註釋的一部分存在。也不能選答案D。
例題6:下面標識符中正確的是( )。
A._abc B.3ab C. int D.+ab
答案:A
分析:C++的標識符由字母、下劃線和數字組成,而且第一個字符不能爲數字。答案B第一個字符爲數字不能選B。標識符不能爲關鍵字,不能選答案C。答案D第一個字符不是字母或下劃線,也不能選。
例題7:分析下列該程序的錯誤。輸入數據格式爲:2,5(回車)。
main()
{ int sum=0;
int a,b;
cout<<"input a,b:";
cin>>a>>b;
sum=a+b;
cout<<sum<<endl;
}
本程序把輸入的兩個數據進行累加並輸出結果。輸入數據格式爲:2 5。
#include <iostream.h> // 編譯預處理命令,以“#”開頭。把系統已經定義好的輸入
//輸出功能包含到本程序中。
void main() // 程序的主函數
{ // 主函數開始
int sum=0; // 定義一個變量sum存放累加結果,並且賦初值爲0
int a,b; // 定義兩個變量,保存輸入值
cout<<"input a,b:"; // 提示輸入
cin>>a>>b; // 使用基本輸入設備cin輸入兩個變量值
sum=a+b; // 進行累加,結果保存到sum變量
cout<<sum<<endl; // 使用基本輸出設備cout輸出累加結果sum
}
分析:
(1)沒有使用編譯預處理命令:#include。iostream.h是系統定義的一個頭文件(h-head),設置了C++的I/O環境。cin、cout爲基本輸入、輸出設備,定義在iostream.h頭文件中。
(2)沒有main()函數的返回類型,系統提示警告。main()函數的返回類型常標註爲void。
(3)輸入數據時沒有使用空格分隔。輸入運算符“>>”要求輸入的多個數據用空格分隔。
1.3 教材習題分析與解答
1.參照例題,編寫一個能輸出以下信息的程序。
How are you.
Fine,thank you.
程序:
#include<iostream.h>
Void main()
{ Cout<<”How are you.”<<endl; //輸出字符串並換行。
Cout<<”Fine,thank you.”<<endl;
}
2.參照例題,編寫一個求兩個數78、45之差的程序。
程序:
#include <iostream.h>
void main()
{ int sum=0;
sum=78+45; //求和
cout<<"78+45= "<<sum<<endl;
}
3.參照例題,編寫一個求三個數14、25、16之和的程序。
#include <iostream.h>
void main()
{ int a,b,c,sum; //定義變量
cout<<"input three number:/n";
cin>>a>>b>>c; //從鍵盤輸入三個數給變量a和b、c
sum=a+b+c; //求和
cout<<"sum is "<<sum;
}
4.上機運行本章的三個例題,熟悉所用系統的上機方法與步驟。
略
5.上機運行本章習題1、2和3。
略
1.4 補充習題
1.下面的( )不是C++所包含的要素。
A.重載 B.對象 C.類 D.繼承
2.下列標識符中,( )是合法的。
A.goto B.Student C. 123 D.k-ld
3.在C++語言中,( )的陳述是正確的。
A.能使用關鍵字並區分大小寫 B.能使用關鍵字並不區分大小寫
C. 不能使用關鍵字並區分大小寫 D.不能使用關鍵字並不區分大小寫
4.C++語言中語句的結束符是( )。
A. , B. ; C. 。 D. 、
5.下面對於類的描述,( )是錯誤的。
A.類是抽象數據類型的實現 B.類是具有共同行爲的若干對象的統一描述體
C. 類是創建對象的模板 D.類就是C語言中的結構類型
6.寫一個程序輸出 Hello,C++!。
7.編譯下列程序,改正錯誤信息,分析輸出結果。
#include <iostream.h>
void main()
{ int x,y;
cout<<"input x:"<<endl;
cin>>x;
y=x*x;
cout<<"y=<<y<</n";
}
8.下列程序有何錯誤?
#include <stdio.h>
void main()
{ cout>>"Hello">>endl;}
9.關於C++和C語言的描述中,( )是錯誤的?
A.C是C++的一個子集 B. C程序在C++環境可以運行
C. C++程序在C環境可以運行 D. C++是面向對象的而C是面向過程的
10.給出下列程序的運行結果。
#include <iostream.h>
void main()
{
int a(2),b(3),c(4);
cout<<"c1="<<c<<endl;
c=a+b;
cout<<"c2="<<c<<endl;
}