1. 程式人生 > >《C++語言程式設計基礎》學習類與物件之多檔案結構和預編譯命令​​​​​​​

《C++語言程式設計基礎》學習類與物件之多檔案結構和預編譯命令​​​​​​​

C++程式的一般組織結構: 一個工程可以劃分為多個原始檔,例如: 類宣告檔案(.h檔案) 類實現檔案(.cpp檔案) 類的使用檔案(main()所在的.cpp檔案) 利用工程來組合各個檔案。Point.h

class Point { //類的定義
public:          //外部介面
	Point(int x = 0, int y = 0) : x(x), y(y) { count++; }
	Point(const Point &p);
	~Point() { count--; }
	int getX() const { return x; }
	int getY() const { return y; }
	static void showCount();          //靜態函式成員
private:         //私有資料成員
	int x, y;
	static int count; //靜態資料成員
};

Point.cpp

//實現類的定義和初始化
#include"Point.h"
#include<iostream>
using namespace std;
int Point::count = 0;  //使用類名定義並初始化靜態資料成員
Point::Point(const Point &p) : x(p.x), y(p.y) {
	count++;
}
void Point::showCount() {
	cout << "  Object count = " << count << endl;
}

main.cpp

#include"Point.h"
#include<iostream>
using namespace std;
int main() {
	Point a(4, 5);      //定義物件a,其建構函式使count增1
	cout << "Point A: " << a.getX() << ", " << a.getY();
	Point::showCount();      //輸出物件個數
	Point b(a);         //定義物件b,其建構函式回使count增1
	cout << "Point B: " << b.getX() << ", " << b.getY();
	Point::showCount();      //輸出物件個數
	return 0;
}

外部變數: 如果一個變數除了在定義它的原始檔中可以使用外,還能被其它檔案使用,那麼就稱這個變數是外部變數。外部變數是指不在本程式檔案中定義的變數 檔案作用域中定義的變數,預設情況下都是外部變數,但在其它檔案中如果需要使用這一變數,需要用extern關鍵字加以宣告外部函式: 在所有類之外宣告的函式(也就是非成員函式),都是具有檔案作用域的。 這樣的函式都可以在不同的編譯單元中被呼叫,只要在呼叫之前進行引用性宣告(即宣告函式原型)即可。也可以在宣告函式原型或定義函式時用extern修飾,其效果與不加修飾的預設狀態是一樣的。 將變數和函式限制在編譯單元內

標準C++庫 標準C++類庫是一個極為靈活並可擴充套件的可重用軟體模組的集合。標準C++類與元件在邏輯上分為6種類型: 輸入/輸出類 容器類與抽象資料型別 儲存管理類 演算法 錯誤處理 執行環境支援編譯預處理:

預處理在編譯前進行  每條預處理指令必須單獨佔用一行  預處理指令可以出現在程式的任何位置

#include 包含指令 將一個原始檔嵌入到當前原始檔中該點處。 #include<檔名>              –  按標準方式搜尋,檔案位於C++系統目錄的include子目錄下 #include"檔名"             –  首先在當前目錄中搜索,若沒有,再按標準方式搜尋。#define 巨集定義指令              定義符號常量,很多情況下已被const定義語句取代。              定義帶引數巨集,已被行內函數取代。 #undef              刪除由#define定義的巨集,使之不再起作用。

條件編譯指令——#if 和 #endif       #if  常量表達式               //當“ 常量表達式”非零時編譯            程式正文        #endif

條件編譯指令——#else       #if   常量表達式                //當“ 常量表達式”非零時編譯             程式正文1       #else                //當“ 常量表達式”為零時編譯              程式正文2        #endif

條件編譯指令——#elif        #if 常量表達式1              程式正文1  //當“ 常量表達式1”非零時編譯       #elif 常量表達式2              程式正文2  //當“ 常量表達式2”非零時編譯       #else               程式正文3  //其他情況下編譯       #endif

條件編譯指令       #ifdef 識別符號                程式段1       #else                程式段2       #endif 如果“識別符號”經#defined定義過,且未經undef刪除,則編譯程式段1;其中經defined定義過,不要求賦值 否則編譯程式段2。

#ifndef 識別符號           程式段1#else           程式段2#endif 如果“識別符號”未被定義過,則編譯程式段1; 否則編譯程式段2。

如果沒有被定義過某個識別符號,程式可能被多次包含,造成一些類、函式、常量等被重複定義的問題。