计算机图形学基础教程--个人笔记--第二章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
派生类成员包括从基类继承过来的成员函数和成员变量,及新增的成员
派生类构造函数的定义
格式:
派生类构造函数名(总参数表列):基类构造函数名(参数表列)
{派生类中新增成员变量初始化语句}

动态创建CRectangle类二维对象数组

void main()//动态创建CRetangle类二维对象数组,假设数组2*3
{
	int RowIndex=2,ColIndex=3;//设置二维数组行下标和列下标
	CRectangle **pRect;//创建二维动态数组
	pRect=new CRectangle * [RowIndex];//设置行
	for(int i=0;i<RowIndex;i++)
	{
		pRect[i]=new CRectangle[ColIndex];//设置列
	}
	//输出周长和面积
	for(i=0;i<RowIndex;i++)
	{
		for(int j=0;j<ColIndex;j++)
		{
			cout<<"Rect["<<i<<","<<j<<"]的周长为"<<pRect[i][j].perimeter()<<",";
			cout<<"面积为"<<pRect[i][j].area()<<endl;
		}
	}
	//释放二维动态数组
	for(int k=0;k<RowIndex;k++)
	{
		delete []pRect[k];
		pRect[k]=NULL;
	}
	delete []pRect;
	pRect=NULL;
}

创建一个桶类,成员变量ScanLine为扫描线的位置,pNext为指向下一节点的指针

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

从已有长方形类CRectangle继承出长方体类CCuboid

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

void main()
{
	CCuboid *pCuboid=new CCuboid(3,2,1);
	cout<<"长方形的体积为:"<<pCuboid->volume()<<endl;
}

MFC上机操作步骤

新建
在这里插入图片描述
单文档
在这里插入图片描述
目录结构
在这里插入图片描述在这里插入图片描述在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值