计算机图形学基础教程--个人笔记--第二章MFC绘图基础

参考教材:计算机图形学基础教程(Visual C++版)(第二版)
面向对象程序设计基础(Visual C++) 类的定义
格式:

class 类名 { public: 成员变量和成员函数的声明; private: 成员变量和成员函数的声明; protected: 成员变量和成员函数的声明; } //一般将类的声明与成员函数分开定义,在类内声明成员函数, 在类外定义成员函数。成员函数名前必须使用类名和作用域运 算符::来指定归属,否则该函数将被认为是不属于任何类的普 通函数

权限控制符:public、private、protected
public表示公有成员,其成员可以被类内和类外的函数自由访问;
private表示私有成员,只有类自己的成员函数或友元函数可以访问,不加访问权限控制符的成员都默认为私有成员;
protected表示保护成员,除类自己的成员函数、友元函数外,派生类的成员函数也可以访问
类成员函数的定义
格式
类型说明符 类名::成员函数名(<参数表列>) { 函数体; }

对象的定义
格式:
类名 对象列表(<参数表列>);

构造函数与析构函数
**都没有数据类型和返回值,且不需要用户显式调用,由系统创建和撤销
**构造函数与析构函数事负责对象的创建和撤销的特殊成员函数。
**构造函数的作用是创建对象时对成员变量进行初始化,析构函数的作用是撤销对象时清理对象占用的内存空间。
**构造函数的名称与类名相同,析构函数的名称是由构造函数名称加上位取反运算符“~”构成。
**构造函数可以有参数,能够重载,析构函数没有参数,不能重载
**一个类可以有多个构造函数,但只能由一个析构函数
**只要类内定义了一个构造函数,不管这个构造函数是否带有参数,C++就不在提供默认构造函数
习惯用大写C字母开始的标识符作为类名,这也是MFC的类命名规则
上机步骤 在VC++中使用 Win32 Console Application方式调试程序
计算机图形学基础教程--个人笔记--第二章MFC绘图基础
文章图片

计算机图形学基础教程--个人笔记--第二章MFC绘图基础
文章图片

#include 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<<"建立默认对象"<width = width; this->height = height; } CRectangle::~CRectangle()//定义析构函数 { cout<<"撤销对象"<perimeter()<area()<

对象的动态建立与释放 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
派生类成员包括从基类继承过来的成员函数和成员变量,及新增的成员
派生类构造函数的定义
格式:
派生类构造函数名(总参数表列):基类构造函数名(参数表列)
{派生类中新增成员变量初始化语句}
动态创建CRectangle类二维对象数组
void main()//动态创建CRetangle类二维对象数组,假设数组2*3 { int RowIndex=2,ColIndex=3; //设置二维数组行下标和列下标 CRectangle **pRect; //创建二维动态数组 pRect=new CRectangle * [RowIndex]; //设置行 for(int i=0; i

创建一个桶类,成员变量ScanLine为扫描线的位置,pNext为指向下一节点的指针
#include class CBucket//定义桶类 { public: int ScanLine; //声明扫描线位置 CBucket *pNext; //声明指向下一桶的结点的指针 }; void main() { CBucket *pHead=new CBucket,*pCurrentB; //定义桶结点的头指针和桶结点的当前指针 pCurrentB=pHead; //当前指针为桶结点的头指针,开始给第一个结点赋值 pCurrentB->ScanLine=1; //当前结点的扫描线是1 cout<<"第一个节点的扫描线位置是:"//输出当前指针的扫描线位置 pNext=new CBucket; //为当前指针的pNext指针新建结点 pCurrentB=pCurrentB->pNext; //将当前指针指向新建结点 pCurrentB->ScanLine=2; //当前结点的扫描线是2 cout<<"第二个节点的扫描线位置是:"//输出当前指针的扫描线位置 pNext=NULL; //只构造两个结点,第二个结点的pNext指针置空 delete pHead; //释放头指针所指向的内存空间 delete pCurrentB; //释放当前指针所指向的内存空间 pHead=NULL; //头指针置空 pCurrentB=NULL; //当前指针置空 }

从已有长方形类CRectangle继承出长方体类CCuboid
#include class CRectangle//定义长方形类,基类 { public: CRectangle(); //声明默认构造函数 CRectangle(int width,int height); //声明带参构造函数 ~CRectangle(); //声明析构函数 double perimeter(); //声明计算周长成员函数 double area(); //声明计算面积成员函数 protected: int width; //声明长方形的宽度成员变量 int height; //声明长方形的高度成员变量 }; CRectangle::CRectangle()//定义默认构造函数 { cout<<"建立默认对象"<width = width; this->height = height; cout<<"建立基类对象"<length=length; cout<<"创建派生类对象"<

MFC上机操作步骤 【计算机图形学基础教程--个人笔记--第二章MFC绘图基础】新建
计算机图形学基础教程--个人笔记--第二章MFC绘图基础
文章图片

单文档
计算机图形学基础教程--个人笔记--第二章MFC绘图基础
文章图片

目录结构
计算机图形学基础教程--个人笔记--第二章MFC绘图基础
文章图片
计算机图形学基础教程--个人笔记--第二章MFC绘图基础
文章图片
计算机图形学基础教程--个人笔记--第二章MFC绘图基础
文章图片

    推荐阅读