return0;
}
构造函数和析构函数
(1)如何初始化类的成员数据?
类有一个特殊的成员函数,称为构造函数。
构造函数可以根据需要带有参数,但它不能有返回值——甚至连返回空值都不行。
构造函数是一个与类同名的类方法。
在声明构造函数的同时,还需要声明一个析构函数。
构造函数创建并初始化类的对象;析构函数在对象被撤消后清除并释放所分配的内存。
析构函数必须与类同名,其前面有一个波浪号“~”。
析构函数没有参数,没有返回值。
默认构造函数和析构函数
如果在声明类时没有同时声明构造函数和析构函数,编译器会自动创建一个(即默认的)。
默认的构造函数和析构函数没有参数,也不能进行任何操作。
使用构造函数和析构函数
所有类对象都必须被构造和析构,在适当的时候将调用这些不进行任何操作的函数。
Rectanglert;//不带参数
Rectanglerect(100,100,200,150);//带有4个参数
(2)成员函数const
将一个类的方法声明为const,必须保证该方法不会改变该类的任何一个成员变量的值。
把类方法声明为常量,需要在函数声明的括号之后分号之前放置关键字const。
(3)用其他类作为成员数据的类
例2、声明一个类然后把它用作另一个类的成员数据
#include
constfloat_size_r=30.f;
usingnamespacestd;
classVertex
{
public:
Vertex(){}
Vertex(floatx,floaty,floatz){_vx=x;_vy=y;_vz=z;}
voidsetX(floatvx){_vx=vx;}
voidsetY(floatvy){_vy=vy;}
voidsetZ(floatvz){_vz=vz;}
floatgetX()const{return_vx;}
floatgetY()const{return_vy;}
floatgetZ()const{return_vz;}
private:
float_vx;
float_vy;
float_vz;
};
classRectangular
{
public:
Rectangular(){}
Rectangular(float_vertex[8][3]);
~Rectangular(){}
voidSetVertex_1(Vertexvertex);
voidSetVertex_2(Vertexvertex);
voidSetVertex_3(Vertexvertex);
voidSetVertex_4(Vertexvertex);
voidSetVertex_5(Vertexvertex);
voidSetVertex_6(Vertexvertex);
voidSetVertex_7(Vertexvertex);
voidSetVertex_8(Vertexvertex);
VertexGetVertex_1()const;
VertexGetVertex_2()const;
VertexGetVertex_3()const;
VertexGetVertex_4()const;
VertexGetVertex_5()const;
VertexGetVertex_6()const;
VertexGetVertex_7()const;
VertexGetVertex_8()const;
private:
VertexVertex_1;
VertexVertex_2;
VertexVertex_3;
VertexVertex_4;
VertexVertex_5;
VertexVertex_6;
VertexVertex_7;
VertexVertex_8;
};
VertexGetVertexData(floatx,floaty,floatz)
{
Vertext;
t.setX(x);
t.setY(y);
t.setZ(z);
returnt;
}
Rectangular:
:
Rectangular(float_vertex[8][3])
{
Vertex_1=GetVertexData(_vertex[0][0],_vertex[0][1],_vertex[0][2]);
Vertex_2=GetVertexData(_vertex[1][0],_vertex[1][1],_vertex[1][2]);
Vertex_3=GetVertexData(_vertex[2][0],_vertex[2][1],_vertex[2][2]);
Vertex_4=GetVertexData(_vertex[3][0],_vertex[3][1],_vertex[3][2]);
Vertex_5=GetVertexData(_vertex[4][0],_vertex[4][1],_vertex[4][2]);
Vertex_6=GetVertexData(_vertex[5][0],_vertex[5][1],_vertex[5][2]);
Vertex_7=GetVertexData(_vertex[6][0],_vertex[6][1],_vertex[6][2]);
Vertex_8=GetVertexData(_vertex[7][0],_vertex[7][1],_vertex[7][2]);
}
voidRectangular:
:
SetVertex_1(Vertexvertex){Vertex_1=vertex;}
voidRectangular:
:
SetVertex_2(Vertexvertex){Vertex_2=vertex;}
voidRectangular:
:
SetVertex_3(Vertexvertex){Vertex_3=vertex;}
voidRectangular:
:
SetVertex_4(Vertexvertex){Vertex_4=vertex;}
voidRectangular:
:
SetVertex_5(Vertexvertex){Vertex_5=vertex;}
voidRectangular:
:
SetVertex_6(Vertexvertex){Vertex_6=vertex;}
voidRectangular:
:
SetVertex_7(Vertexvertex){Vertex_7=vertex;}
voidRectangular:
:
SetVertex_8(Vertexvertex){Vertex_8=vertex;}
VertexRectangular:
:
GetVertex_1()const{returnVertex_1;}
VertexRectangular:
:
GetVertex_2()const{returnVertex_2;}
VertexRectangular:
:
GetVertex_3()const{returnVertex_3;}
VertexRectangular:
:
GetVertex_4()const{returnVertex_4;}
VertexRectangular:
:
GetVertex_5()const{returnVertex_5;}
VertexRectangular:
:
GetVertex_6()const{returnVertex_6;}
VertexRectangular:
:
GetVertex_7()const{returnVertex_7;}
VertexRectangular:
:
GetVertex_8()const{returnVertex_8;}
voidoutVertexData(Vertext)
{
cout<<"x="<cout<<"y="<cout<<"z="<}
intmain()
{
floatv[8][3]={
{-_size_r,-_size_r,-_size_r},{-_size_r,_size_r,-_size_r},
{_size_r,_size_r,-_size_r},{_size_r,-_size_r,-_size_r},
{_size_r,-_size_r,_size_r},{_size_r,_size_r,_size_r},
{-_size_r,_size_r,_size_r},{-_size_r,-_size_r,_size_r}};
Rectangularrect(v);
cout<<"3DRectangularVertexData"<cout<<"Vertex_1";
outVertexData(rect.GetVertex_1());
cout<<"Vertex_2";
outVertexData(rect.GetVertex_2());
cout<<"Vertex_3";
outVertexData(rect.GetVertex_3());
cout<<"Vertex_4";
outVertexData(rect.GetVertex_4());
cout<<"Vertex_5";
outVertexData(rect.GetVertex_5());
cout<<"Vertex_6";
outVertexData(rect.GetVertex_6());
cout<<"Vertex_7";
outVertexData(rect.GetVertex_7());
cout<<"Vertex_8";
outVertexData(rect.GetVertex_8());
Rectangularrt;
Vertexvt;
vt.setX(50);
vt.setY(0);
vt.setZ(50);
rt.SetVertex_1(vt);
cout<<"(rt)Vertex_1";
outVertexData(rt.GetVertex_1());
cout<<"(rect)Vertex_1";
outVertexData(rect.GetVertex_1());
Vertexvtm(100,-100,100);
rt.SetVertex_2(vtm);
cout<<"(rtm)Vertex_2";
outVertexData(rt.GetVertex_2());
cout<<"(rect)Vertex_2";
outVertexData(rect.GetVertex_2());
return0;
}
图1、程序输出结果
下面建立一个实用的类(用于屏幕绘图)
#include
#include
typedefHBRUSHBrush;
typedefHPENPen;
typedefCOLORREFColor;
typedefHFONTFont;
typedefvoidGRAPHV;
Fontg_font=CreateFont(-16,0,0,0,400,0,0,0,GB2312_CHARSET,0,0,0,FF_MODERN,"宋体");
classGRAPHGDI
{
public:
GRAPHGDI(){}
GRAPHGDI(HDChdc){g_hdc=hdc;}
~GRAPHGDI(){}
GRAPHVsethdc(HDChdc)
{
g_hdc=hdc;
}
GRAPHVcolor(intr,intg,intb)
{
if(r>255)r=255;if(r<0)r=0;
if(g>255)g=255;if(g<0)g=0;
if(b>255)b=255;if(b<0)b=0;
g_color=RGB(r,g,b);
}
GRAPHVmakebrush()
{
g_brush=CreateSolidBrush(g_color);
SelectObject(g_hdc,g_brush);
}
GRAPHVfreebrush()
{
DeleteObject(g_brush);
}
GRAPHVmakepen()
{
g_pen=CreatePen(PS_SOLID,1,g_color);
SelectObject(g_hdc,g_pen);
}
GRAPHVfreepen()
{
DeleteObject(g_pen);
}
GRAPHVline(intx1,inty1,intx2,inty2)
{
POINTp[2];
p[0].x=x1;p[0].y=y1;
p[1].x=x2;p[1].y=y2;
makepen();
Polyline(g_hdc,p,2);
freepen();
}
GRAPHVrectangle(intx,inty,intw,inth)
{
POINTp[5];
p[0].x=x;p[0].y=y;
p[1].x=x+w;p[1].y=y;
p[2].x=x+w;p[2].y=y+h;
p[3].x=x;p[3].y=y+h;
p[4].x=x;p[4].y=y;
makepen();
Polyline(g_hdc,p,5);
freepen();
}
GRAPHVfillrectangle(intx,inty,intw,inth)
{
makebrush();
makepen();
Rectangle(g_hdc,x,y,x+w,y+h);
freebrush();
freepen();
}
GRAPHVcircle(intx,inty,intr)
{
makepen();
Arc(g_hdc,x-r,y-r,x+r,y+r,x+r,y,x+r,y);
freepen();
}
GRAPHVfillcircle(intx,inty,intr)
{
makebrush();
makepen();
Chord(g_hdc,x-r,y-r,x+r,y+r,x+r,y,x+r,y);
freebrush();
freepen();
}
GRAPHVarc(intx1,inty1,intx2,inty2,intx3,inty3,intx4,inty4)
{
makepen();
Arc(g_hdc,x1,y1,x2,y2,x3,y3,x4,y4);
freepen();
}
GRAPHVellipse(intx,inty,intxr,intyr)
{
makepen();
Arc(g_hdc,x-xr,y-yr,x+xr,y+yr,x+xr,y,x+xr,y);
freepen();
}
GRAPHVfillellipse(intx,inty,intxr,intyr)
{
makebrush();
makepen();
Ellipse(g_hdc,x-xr,y-yr,x+xr,y+yr);
freebrush();
freepen();
}
GRAPHVputpixel(intx,inty,Colorcr)
{
SetPixelV(g_hdc,x,y,cr);
}
GRAPHVbezierline(intpx[4],intpy[4])
{
POINTp[4];
for(inti=0;i<4;i++)
{
p[i].x=px[i];
p[i].y=py[i];
}
makepen();
PolyBezier(g_hdc,p,4);
freepen();
}
GRAPHVroundrect(intx1,inty1,intx2,inty2,intx3,inty3)
{
makebrush();
makepen();
RoundRect(g_hdc,x1,y1,x2,y2,x3,y3);
freebrush();
freepen();
}
GRAPHVclear(intx,inty,intw,inth,intr,intg,intb)
{
Brushbr=CreateSolidBrush(RGB(r,g,b));
Penp=CreatePen(PS_SOLID,1,RGB(r,g,b));
SelectObject(g_hdc,br);
SelectObject(g_hdc,p);
Rectangle(g_hdc,x,y,w,h);
DeleteObject(br);
DeleteObject(p);
}
GRAPHVfont(intsize_f,char*style)
{
g_font=CreateFont(-size_f,0,0,0,400,0,0,0,
GB2312_CHARSET,0,0,0,FF_MODERN,style);
}
GRAPHVdrawtext(intx,inty,char*text)
{
SelectObject(g_hdc,g_font);
SetTextColor(g_hdc,g_color);
SetBkMode(g_hdc,TRANSPARENT);
TextOut(g_hdc,x,y,text,strlen(text));
DeleteObject(g_font);
}
private:
HDCg_hdc;
Colorg_color;
Brushg_brush;
Peng_pen;
};
把它保存为“graphics.h”文件
举例运用:
(VC6环境)
#include"e:
\学习编程C++\graphics.h"
//全局变量
//窗口句柄
HWNDhwnd;
HDChdc;
HDCcdc;
HBITMAPhbmp;
//窗口类名
char*InitWinClassName="win32class";
//窗口标题名称
char*InitWinName="框架程序";
intWidth=500;
intHeight=500;
//窗口信息处理回调
LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);
//初始化窗口
voidInitWindow(HINSTANCE,int,int,int);
//信息循环
voidMessageLoop(voidRe