計算機圖形學基礎教程--個人筆記--第二章MFC繪圖基礎

參考教材:計算機圖形學基礎教程(Visual C++版)(第二版)

面向對象程序設計基礎(Visual C++)

類的定義
格式:

class 類名
{
public:
	成員變量和成員函數的聲明;
private:
	成員變量和成員函數的聲明;
protected:
	成員變量和成員函數的聲明;
}
//一般將類的聲明與成員函數分開定義,在類內聲明成員函數,
在類外定義成員函數。成員函數名前必須使用類名和作用域運
算符::來指定歸屬,否則該函數將被認爲是不屬於任何類的普
通函數

權限控制符:public、private、protected
public表示公有成員,其成員可以被類內和類外的函數自由訪問;
private表示私有成員,只有類自己的成員函數或友元函數可以訪問,不加訪問權限控制符的成員都默認爲私有成員;
protected表示保護成員,除類自己的成員函數、友元函數外,派生類的成員函數也可以訪問

類成員函數的定義
格式

類型說明符 類名::成員函數名(<參數表列>)
{
	函數體;
}

對象的定義
格式:

類名 對象列表(<參數表列>);

構造函數與析構函數
**都沒有數據類型和返回值,且不需要用戶顯式調用,由系統創建和撤銷
**構造函數與析構函數事負責對象的創建和撤銷的特殊成員函數。
**構造函數的作用是創建對象時對成員變量進行初始化,析構函數的作用是撤銷對象時清理對象佔用的內存空間。
**構造函數的名稱與類名相同,析構函數的名稱是由構造函數名稱加上位取反運算符“~”構成。
**構造函數可以有參數,能夠重載,析構函數沒有參數,不能重載
**一個類可以有多個構造函數,但只能由一個析構函數
**只要類內定義了一個構造函數,不管這個構造函數是否帶有參數,C++就不在提供默認構造函數
習慣用大寫C字母開始的標識符作爲類名,這也是MFC的類命名規則

上機步驟

在VC++中使用 Win32 Console Application方式調試程序
在這裏插入圖片描述
在這裏插入圖片描述

#include <iostream.h>
class CRectangle						//定義長方形類
{
public:
	CRectangle();						//聲明默認構造函數
	CRectangle(int width,int height);	//聲明帶參構造函數
	~CRectangle();						//聲明析構函數
	double perimeter();					//聲明計算周長成員函數
	double area();						//聲明計算面積成員函數
private:
	int width;							//聲明長方形的寬度成員變量
	int height;							//聲明長方形的高度成員變量
};
CRectangle::CRectangle()				//定義默認構造函數
{
	width = 10;
	height = 5;
	cout<<"建立默認對象"<<endl;
}
CRectangle::CRectangle(int width,int height)//定義帶參構造函數
{
	this->width = width;
	this->height = height;
}
CRectangle::~CRectangle()				//定義析構函數
{
	cout<<"撤銷對象"<<endl;
}
double CRectangle::perimeter()			//定義計算周長成員函數
{
	return 2*(width+height);
}
double CRectangle::area()				//定義計算面積成員函數
{
	return width*height;
}
void main()								//主函數
{
	CRectangle Rect1,Rect2(30,20),*pRect=&Rect2;		//定義靜態對象和指向靜態對象的指針
	//使用對象輸出周長和麪積
	cout<<"Rect1的周長爲:"<<Rect1.perimeter()<<endl;	//使用對象輸出Rect1的周長
	cout<<"Rect1的面積爲:"<<Rect1.area()<<endl;		//使用對象輸出Rect1的面積
	cout<<"Rect2的周長爲:"<<Rect2.perimeter()<<endl;	//使用對象輸出Rect2的周長
	cout<<"Rect2的面積爲:"<<Rect2.area()<<endl;		//使用對象輸出Rect2的面積
	//使用對象指針輸出Rect2的周長和麪積
	cout<<"Rect2的周長爲:"<<pRect->perimeter()<<endl;	//使用指向對象的指針輸出Rect2的周長
	cout<<"Rect2的面積爲:"<<pRect->area()<<endl;		//使用指向對象的指針輸出Rect2的周長
}

對象的動態建立與釋放

C++程序的內存空間通常分爲4個區
全局數據區:全局變量、靜態數據、常量
代碼區:所有類成員函數,非成員函數
棧區:爲運行函數而分配的局部變量、函數參數、返回數據、返回地址等
堆區(自由存儲區):其他空間
操作堆區內存時,如果分配了內存,就有責任回收,否則運行的程序會造成內存泄漏
靜態對象,佔用的存儲空間不能隨時釋放,只有在主函數結束時才調用析構函數予以撤銷
動態存儲分配,在程序運行時,系統根據運行時的要求進行內存分配,這種方式稱爲動態存儲分配;在堆區中進行;對象生命週期結束時,需要顯示釋放所佔用的內存空間

建立對象格式:
類名 *指針變量名 = new 類名(初始化式);
釋放對象格式:
delete指向該對象的指針變量名;

new在堆區動態分配指定大小的內存空間後,返回一個指向該對象的指針,即所分配的存儲空間的起始地址
靜態對象可以使用對象名,也可以使用指向對象的指針來訪問對象
使用new運算符建立的動態對象時無名對象,不能使用對象名訪問,只能使用指針訪問。
動態對象使用完畢後,要使用delete運算符釋放堆區所佔用的內存空間,也就是撤銷該對象,稱動態內存釋放。

建立長方形類CRectangle動態對象:
CRectangle *pRect = new CRectangle;
釋放動態對象:
delete pRect;//此時釋放了指針所指向的對象的內存空間,但指針pRect本身並沒有撤銷,還需要將其置空
創建帶參動態對象:
CRectangle *pRect = new CRectangle(40,10);

一維對象數組動態內存的分配與釋放
一維對象數組的內存分配格式:
類名 *指針變量名 = new 類名[下標表達式];
一維對象數組的內存釋放格式:
delete [] 指向該數組的指針變量名;//括號不能丟,括號內無內容
包含兩個元素的CRectangle類一維動態對象數組:
CRectangle *pRect = new CRectangle[2];
delete []pRect;

二維對象數組動態內存的分配與釋放
二維數組可以堪稱一種特殊的一維數組,他的元素又是一維數組
CRetangle R[2][3];
可以看成一個一維數組,它有2個元素,每個元素又是包含3個元素的一維數組。
R是二維數組的首地址,稱爲行指針;R[0],R[1]是2個一維數組的第0列元素的地址,稱爲列指針。

二維對象數組的內存分配格式:
類名 *指針變量名 = new 類名[行下標表達式];
for(int i=0;i<行下標表達式;i++)
{
指針變量名[i] = new 類名[列下標表達式];
}
二維對象數組的內存釋放格式:
for(int i=0;i<行下表表達式;i++)
{
delete []指針變量名[i];//釋放先列後行
}
delete []指針變量名;
***由堆區創建的對象數組,只能調用默認的構造函數,不能調用其他任何構造函數。如果沒有默認的構造函數,則不能創建對象數組。

繼承與派生

格式:
class 派生類名: [繼承方式]基類名
{
派生類新增加的成員;
};
繼承方式:公有繼承public、私有繼承private(默認)和保護繼承protected
派生類成員包括從基類繼承過來的成員函數和成員變量,及新增的成員
派生類構造函數的定義
格式:
派生類構造函數名(總參數表列):基類構造函數名(參數表列)
{派生類中新增成員變量初始化語句}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章