第一篇:c++作业
P179 5.9.2(11)
1.意图
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
2.动机
对一些类来说,只有一个实例是很重要的。虽然系统中可以有许多打印机,但却只应该有一个打印假脱机(printer spooler),只应该有一个文件系统和一个窗口管理器。一个数字滤波器只能有一个A / D转换器。一个会计系统只能专用于一个公司。
我们怎么样才能保证一个类只有一个实例并且这个实例易于被访问呢?一个全局变量使得一个对象可以被访问,但它不能防止你实例化多个对象。一个更好的办法是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建(通过截取创建新对象的请求),并且它可以提供一个访问该实例的方法。这就是Singleton模式。
3.适用性
在下面的情况下可以使用Singleton模式.当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
4.结构
5.参与者
Singleton
定义一个GetInstance操作,允许客户访问它的唯一实例。GetInstance是一个类操作(即Smalltalk中的一个类方法和C++中的一个静态成员函数)。可能负责创建它自己的唯一实例。
6.协作
客户只能通过Singleton的GetInstance操作访问一个Singleton的实例。
7.效果
Singleton模式有许多优点:
1)对唯一实例的受控访问因为Singleton类封装它的唯一实例,所以它可以严格的控制客户怎样以及何时访问它。
2)缩小名空间Singleton模式是对全局变量的一种改进。它避免了那些存储唯一实例的全局变量污染名空间。
3)允许对操作和表示的精化Singleton类可以有子类,而且用这个扩展类的实例来配置一个应用是很容易的。你可以用你所需要的类的实例在运行时刻配置应用。
4)允许可变数目的实例这个模式使得你易于改变你的想法,并允许Singleton类的多个实例。此外,你可以用相同的方法来控制应用所使用的实例的数目。只有允许访问Singleton实例的操作需要改变。
5)比类操作更灵活另一种封装单件功能的方式是使用类操作(即C++中的静态成员函数或者是Smalltalk中的类方法)。但这两种语言技术都难以改变设计以允许一个类有多个实例。
此外,C++中的静态成员函数不是虚函数,因此子类不能多态的重定义它们。
8.实现
class Singleton
{
static std::auto_ptr
protected:
//prevent user making our any instance by manually
//构造函数是保护类型的。
Singleton(){}
public:
~Singleton(){}
//Return this singleton class' instance pointer
static Singleton* Instance()
{
if(!m_pInstance.get())
{
m_pInstance = std::auto_ptr
}
return m_pInstance.get();
}
};
怎样来使用它呢?不要试图从这个类派生你的单件子类,那样的结果是不妥当的,如果你需要多个单件子类,还是使用下面的宏定义更为妥当:
#define DEFINE_SINGLETON(cls)
private:
static std::auto_ptr
protected:
cls(){}
public:
~cls(){}
static cls* Instance(){
if(!m_pInstance.get()){
m_pInstance = std::auto_ptr
}
return m_pInstance.get();
}
#define IMPLEMENT_SINGLETON(cls)
std::auto_ptr
假定你需要实现一个单件类YY,这样书写:
class YY
{
DEFINE_SINGLETON(YY);
public:
//your interfaces here...};
在cpp文件中,书写:
IMPLEMENT_SINGLETON(YY);
需要引入这个类的实例的时候,使用这样的语句:
YY* pYY = YY::Instance();
这,就是全部。
如果需要定义其他的单件类,重复上面的定义,就可以了。
当想集中管理一个应用程序所需的所有配置时,可以声明一个CToolsOptions的类,其中包含配置属性集合。对于这个类的实例,显然是一个实例就够了;当编写绘图程序时,考虑绘制矩形,圆形等分别使用CGraphTool派生的工具类,每个派生类负责处理具体的绘制动作和相关的UI相应逻辑。这些工具类典型的在被用户选择工具栏的图元按钮时被选中。依照这种模式,你应该对所有的图元工具从事注册工作,使得绘图程序了解运行时刻可以使用那些图元工具。同样的,负责管理注册信息的这个管理器也只需
P2467.6.2(1)
必须把它作为类成员函数的运算符有:
(),[],->和任何赋值运算符,重载这些运算符时必须把操作符函数声明为类的成员函数
什么时候定义类成员操作符重载,什么时候定义非类成员操作符重载?
答:(1)如果一个重载操作符是类成员,那么只有当跟它一起使用的左操作数是该类对象时,它才会被调用,如果该操作符的左操作数必须是其他类型,那么重载操作符必须是非类成员操作符重载。
(2)C++要求,赋值(=),下标([ ]),调用(())和成员访问箭头(->)操作符必须被指定为类成员操作符,否则错误。
第二篇:C++数据结构 大作业课程设计
C++/数据结构 大作业/课程设计——【校园导游咨询】【停车场管理】娃娃们可以收着以后用 绝对纯手工打造 内含类模块/一维指针数组(谨以此程序供大家参考。运行结果后面有贴图)
目录
【1】校园导游咨询 程序设计源代码 及 截图 【2】停车场管理——方案一 程序设计源代码 及 截图 【3】停车场管理——方案二 程序设计源代码 及 截图
【1】【【校园导游咨询】】
######
(ps:该校园导游咨询系统没有输入值,所有信息是都在class MGraph的构造函数中传输的,且校园景点信息皆为【【上海电力学院】】景点信息。请大家注意,直接从文章copy到visual stutio中会出现中文字符,注意删除,推荐大家在一行语句的分号后面,点出光标,按一下delete键,然后按一下enter键,完成visual stutio的自动对齐,这样程序看起来一目了然,更易于操作和更改)【问题描述】
设计一个校园导游程序,为来访的客人提供各种信息查询服务。【基本要求】
(1)设计你所在学校的校园平面图,所含景点不少于10个。以图中顶点表示校内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。(2)为来访客人提供图中任意景点相关信息的查询。
(3)为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一个最短的简单路径。【选作内容】
(6)扩充每个景点的邻接景点的方向等信息,使得路径查询结果能提供详尽的导向信息。**************************【以下为类的定义】******************************** #include
class direction;template
{ friend class MGraph
direction dir;//存放顶点方位信息的direction类的dir。};
class direction { public: int ln;//存放在方向图中的横坐标,表示东西 int col;//存放在方向图中的纵坐标,表示南北 };template
{ public: MGraph();
//构造函数,初始化具有n个顶点的图
void printvexname();//显示所有景点及景点代号
void printvexinf(int i);//显示代号为i景点的名称及信息
void printroad(int i,int j);//显示景点i~j的最短路径方案信息
void printdir(int i,int j);//显示景点i到j的方向信息,如“向东100m,向南200m” VertexNode
void Root(int p,int q);//递归寻找pq间的最短路径
int Path[MaxSize][MaxSize],Dist[MaxSize][MaxSize];//创建Path和Dist分别存放两点间最短路径的前驱节点,两点间最短路径长度
int Line[MaxSize];//Line存放路径 int kkk;//Line[]数组的标记
private: T vertex[MaxSize];//存放图中顶点的数组
int arc[MaxSize][MaxSize];//存放图中边的数组 };*************************【以下为类的实现 即类函数的定义】*********************************** template
//s[]为存放景点邻接矩阵信息的一维数组,根据其对称性可以用公式赋值给二维数组arc[][] { int s[]={0, 1,0, 0,2,0, 0,0,2,0, 0,0,2,3,0, 0,0,0,4,2,0, 0,0,0,0,2,3,0, 0,0,0,0,2,3,1,0, 0,0,2,0,2,0,0,2,0, 4,0,2,0,0,0,0,0,1,0, 0,0,0,0,0,0,0,0,0,2,0, 1,0,0,0,0,0,0,0,0,0,2,0, 0,0,0,0,0,0,0,0,0,3,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,2,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0, 0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0,2,0};int a[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17};char* b[]={“南门”,“实验楼”,“南图”,“大活”,“睿思楼”,“大礼堂”, “南4教”,“知行楼”,“国交楼”,“南3教”,“南2教”,“南1教”, “北图”,“北3教”,“北4教”,“北2教”,“北1教”,“北门”};char* c[]={“南校区正门”,“物理实验楼”,“南校区图书馆”,“大学生活动中心”, “教师办公楼、医务室及留学生公寓”,“大礼堂,用于举办各种文艺演出”,“南校区第4教学楼”,“实习基地,计算机房等”, “国际交流中心,教职工餐厅”,“南校区第3教学楼”,“南校区第2教学楼”,“南校区第1教学楼”, “北校区图书馆”,“北校区第3教学楼”,“北校区第4教学楼”,“北校区第2教学楼”, “北校区第1教学楼”,“北校区正门”};int d[]={8,6,4,4,1,0,0,1,3,4,6,8,4,3,2,3,5,8};int e[]={8,8,8,10,8,10,7,6,6,6,6,6,3,1,0,0,0,2};int i,j;vertexNum=18;arcNum=30;
for(i=0;i for(j=0;j cout<<“向东”< cout<<“向南”< if(Path[p][q]>0){ Root(p,Path[p][q]);Root(Path[p][q],q);} else { Line[kkk]=q;kkk++;} } template for(q=0;q Dist[p][q]=Dist[p][k]+Dist[k][q];Path[p][q]=k;} cout<<“n=======n”;cout<<“从”<”;printdir(i,item2);cout<<“-->”<”;printdir(item1-1,item1);cout<<“-->”< { int choice;cout<<“================”< 【2】【停车场管理系统【方案一 程序】】 ###### (ps:该程序有漏洞,若将要离开的车辆是停于便道上的,则对该车进行驶离操作时程序内部有错误数据,虽然做了函数完成这一功能,但因时间有限,没能及时查找更正,现在懒得改了。。大家将就看吧。不过运行是可以的)【问题描述】 设停车场是一个可停放n辆汽车的 长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车信放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场院,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。【基本要求】 以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表结构实现。【测试数据】 设n=2,输入数据为:(A,1,5),(A,2,15),(A,3,20),(A,4,25),(A,5,30),(D,2,35),(D,4,40),(E,0,0)。其中:A表示到达(Arrival);D表示离去(Departure);E表示输入结束(End)。**************************【以下为类的定义】************************************* #include const double price=30;//每小时的费用 //思想:(报告第四页) //我的系统界面,输入信息为:(到达/离开/退出);车牌号;时刻 //因此,我的停车场类分成车辆到达和车辆离开两个主要的函数实现。//车辆到达,有入栈和入队。车辆离开有出栈,出队和入栈操作。 //因此我又编写入栈的类,队的类。与parkingmanagement进行友元。 //**************************************类定义*********************************************** class car//车的信息类 { public: double time;//计费时间 int number;//车牌号 car *next;//存放car类型元素的数组初始地址 };class carstack//栈(停车场)的类 { friend class parkingmanagement;//parkingmanagement能访问carstack类中所有成员 public: carstack();//构造函数,栈的初始化 int empty();//判断栈是否为空 int full();//判断栈是否为满 car *s;//存放car类型栈元素的数组初始地址 int top;//栈顶指针 };class carqueue//队列(便道)的类 { friend class parkingmanagement;//parkingmanagement能访问carstack类中所有成员 public: carqueue();//构造函数,队列的初始化 int full();//判断队列是否为满 car *front,*rear;//存放car类型队列元素的数组初始地址 };class parkingmanagement { public: int pushstack(carstack &cs,int cnum,double ctime);//入栈,cs栈内进行调整,返回栈内位置 void popstack(carstack &cs,int cnum);//出栈,cs栈内进行调整,//根据车牌号把车弹出栈,将出栈car的number赋值给int popstacknumber()//将出栈car的time赋值给double popstacktime(),无返回值! int pushqueue(carqueue &cq,int cnum,double ctime);//入队,队内进行调整,返回队内位置 int popqueue(carqueue &cq);//出队,队内进行调整,返回汽车车牌号 void arrival(carstack &cs,carqueue &cq,int cnum,double ctime);//车辆到达,//根据输入的车牌号、到达时间,变更函数参数;并cout车位信息 void leave(carstack &cs,carqueue &cq,int cnum,double ctime);//车辆离开,//根据输入的车牌号找到汽车,并进行出栈操作、出队操作和入栈操作; //并cout停留时间和收费情况 void deletequeue(carqueue &cq,int i);//删除cq过道中第i辆车 int popstacknumber;//专门存放出栈的时候返回的车牌号 double popstacktime;//专门存放出栈的时候返回的时刻 };**********************************【以下为类的实现】************************************ carstack::carstack()//构造函数,栈的初始化 { top=-1;s=new car[Max];//创建car类型栈元素的数组 if(s==NULL){ cout<<“栈空间分配不成功!”< cs.top++;(cs.s[cs.top]).number=cnum;//将cnum赋给栈顶位置的车的车牌号,s是car类型栈元素的数组(cs.s[cs.top]).time=ctime;//将ctime赋给栈顶位置的车的入栈时间,s是car类型栈元素的数组 return(cs.top+1);//返回栈内位置加1,即停车场内车位从1号开始 } } void parkingmanagement::popstack(carstack &cs,int cnum)//出栈,cs栈内进行调整,//根据车牌号把车弹出栈,将出栈car的number赋值给int popstacknumber //将出栈car的time赋值给double popstacktime,无返回值!{ int i;car p;carstack stemp;//定义一个carstack类型的临时存放出栈元素的栈 for(i=0;i<=cs.top;i++)if((cs.s[i]).number==cnum)break;//当要出栈的车的车牌号=栈内的车牌号元素时,跳出循环 p=cs.s[i];//将要出栈的元素赋给car类型的p存放 while(cs.top>i)stemp.s[++(stemp.top)]=cs.s[(cs.top)--];//出栈的元素数组逐个赋给临时栈 popstacknumber=p.number;//将这个车牌号信息传给int popstacknumber()popstacktime=p.time;//将该车的时间信息传给double popstacktime()cs.top--;//栈顶指针回到原来位置 while(stemp.top>=0)cs.s[++(cs.top)]=stemp.s[(stemp.top)--];//临时栈出栈的元素逐个赋给原栈,完成先退再进的工作 } int parkingmanagement::pushqueue(carqueue &cq,int cnum,double ctime)//入队,队内进行调整,返回队内位置 { car *p,*countp;int count(1);//count用于记录车在过道上的位置信息,因队列为链式的,所以进行循环累加 p=new car;//创建一个car类型的指针 p->number=cnum;p->time=ctime;p->next=NULL;//首先将指向存放car类型元素的数组初始地址置空 if(cq.front==NULL)//第一次入队要判断头结点是否为空 { cq.front=cq.rear=p;} else {//尾插法插入元素 p->next=(cq.rear)->next;(cq.rear)->next=p;cq.rear=(cq.rear)->next;} countp=(cq.front)->next;while(countp!=NULL){ count++;countp=countp->next;}//count即车在过道上的位置,【从1开始计!!】 return count;} int parkingmanagement::popqueue(carqueue &cq)//出队,队内进行调整,返回汽车车牌号 { car p;p.number=((cq.front)->next)->number;//cq队里,从cq.front开始指向下一个元素的车牌号赋给car类型的车信息 p.time=((cq.front)->next)->time;//cq队里,从cq.front开始指向下一个元素的时刻 //赋给car类型的车信息 p.next=((cq.front)->next)->next;//cq队里,从cq.front开始指向下一个元素的指针 //赋给car类型的车信息的下一个元素的指针 return p.number;cq.front=(cq.front)->next;} void parkingmanagement::arrival(carstack &cs,carqueue &cq,int cnum,double ctime)//车辆到达,根据输入的车牌号、到达时间,变更函数参数;并cout车位信息 { int pos;if(!(cs.full()))//如果栈未满,车辆停入停车场 { int fl(0),i;//定义一个从0开始的标记fl for(i=0;i<=cs.top;i++){ if(cs.s[i].number==cnum)//如果到达的车的车牌号=栈内已有车辆的车牌号 { fl=1;//fl记1 break;} } if(fl==1)//如果到达的车的车牌号!=栈内已有车辆的车牌号 cout<<“输入错误!请重新输入!”< cout<<“该停车场还有空位,请到”< { pos=pushqueue(cq,cnum,ctime);//入队,返回车位信息 cout<<“该停车场已满,请将车停到便道”< { popstack(cs,cnum);//出栈操作 hour=ctime-popstacktime;//时间计算 outcarnum=popqueue(cq);//将便道上的第一辆车出队,入栈。并将其车牌号赋给outcarnum pstack=pushstack(cs,outcarnum,ctime);//将便道上的第一辆车,入栈 cout<<“该车在本停车场内停留时间为”< { p=cq.front;while(p!=NULL){ count++;//如果在过道中找到该车,则该车的位置为过道中的第count位置(count从1开始)p=p->next;if(p->number==cnum)//在过道中找到要出去的车,则在队列中删除该car。//后面的车辆依然顺序排列,补足空位 { deletequeue(cq,count);if(count>Max){ cout<<“您的车在便道上的位置为”< car *p,*q;int j(0);p=cq.front;while(p && j ######【3】【停车场管理系统【方案二 程序】】 (ps:本方案与方案一有同样的问题,就是在对 便道上的车 进行驶离操作时,数据错误,同样的理由,没有改正。如果有细心娃娃帮忙指点改正,在此感激啦~) *************************【以下为类定义】************************************ #include struct Node//过道停车的队列所需链式结点 { T carnum;//定义车牌号类型 Node friend class carStack;public: T carnum;//车号 int cartime;//停车时间 }; template int EnQueue(T cnum);//将元素x入队,并返回其在队内的位置(从1开始)T DeQueue();//将队头链式结点出队,并返回汽车车牌号 void deletequeue(int i);//将队内低i个元素删除,即便道上i位置的汽车驶离 bool Empty();//判断链队列是否为空 Node int Popcar(T outcnum,int outctime);//将第cnum辆车出栈,并返回其停车时间(hour)bool full();//判断栈是否为满?满则返回1 carinfo s=new Node front=rear=s;} else { rear->next=s;//将结点s插入到队尾 rear=s;} p=front;while(p!=NULL){ i++;p=p->next;}//i即车在过道上的位置,【从1开始计!!】 return i;} template front=front->next;//将队头元素所在结点摘链 } return p->carnum;delete p;//将出队进栈的车从队列里删除 } template template :top(-1){//建立一个最大尺寸为size的空栈 S=new carinfo { cerr<<“动态存储失败!”< template template void outputpark()//系统功能选择页面,输入泊车信息 { cout<<“========================”< { cs.Pushcar(carnum,cartime);cout<<“请驶入停车场的”< Node 1类和对象之间的关系 类是对某一类对象的抽象;对象是某一种类的实例、类的定义方法 class类名{ private:私有数据成员和成员函数public:公有数据成员和成员函数 }; 类中成员的访问权限 对于public类成员来说,他们是共有的,能被外面的程序访问:@对于private类成员来说,他们是私有的,只能被类中的函数所使用,不能被外面的程序所访问。对象成员的访问方法 访问对象的成员变量,@成员函数和访问变量和函数的方法是一样的,只不过要在成员前面加上对象名和成员运算符“.”表示方式如下 <对象名>.<成员变量><对象名>.<成员函数>(<参数表>)运作有关,如创建窗口,绘制窗口,销毁窗口,通常,消息是从系统发到窗口,或从窗口发到系统。 命令消息:命令消息通常与处理用户请求有关,当用户单击一个菜单或工具栏时,命令消息就产生了。并发送到能处理该消息的类或函数。 控件消息:由控件产生的消息,例如,按钮的单击,列表框的选择等均产生此类消息,为的是向其父窗口通(通常是对话框)通知事件的发生。 6.使用一个对话框的一般过程: ①添加对话框资源; ②设置对话框的属性; ③添加和布局控件; ④创建对话框类; ⑤添加对话框代码; ⑥在程序中调用对话框。7模式对话框和无模式对话框 1.什么是类?类的定义格式?类的成员一般分为哪两部分?它们的区别如何? ⑴“类”是对具有共同的属性特征和行为特征的对象的概括和抽象。 ⑶类的成员一般分为数据成员和成员函数两部分。 ⑷数据成员一般用来表示对象属性特征,而成员函数一般表示了对象的可以进行的操作,即行为特征。 3.什么是对象?如何定义一个对象?对象的成员如何表示? ⑴对象是类的实例,是类的变量。⑵对象的定义:类名对象名称;或:类名 * 对象指针;⑶对象成员的表示:对象名称.成员名字;或: 对象指针→成员名字;9.如何对对象进行初始化? 对象的初始化都是通过构造函数进行的,只要在声明对象时,逐个添好构造函数的实运算符重载。(2)运行时的多态性:虚函数。即在程序执行之前,根据函数和参数无法确定应该调用哪个函数,必须在程序的执行过程中,根据执行情况动态的确定。第3章MFC基本应用程序的建立4.用AppWizard创建一个多文档应用程序项目(MDI)Ex_MDIHello,比较MDI与SDI有哪些区别? SDI应用程序由应用程序类(CWinApp)、框架窗口类(CFrameWnd)、文档类(CDocument)、视图类(CView)和文档模板类(CSinSleDocTemplate)共同作用。MDI应用程序与SDI应用程序的主要差别在于:MDI有CMDIFrameWnd和CMDIChildWnd两个框架窗口类,前一个派生CMainFrame类,负责菜单等界面元素的主框架窗口管理;后一个派生CChildFrame类,负责相应的文档及其视图的子框架窗口维护。而SDI由框架窗口类CFrameWnd派生CMainFrame类。辑文本的矩形窗口。编辑框属于CEdit类的键盘快捷键也称为加速键,加速键一般是几“窗口控件”,可以获得输入焦点。个按键的组合,用于激活特定的命令。12.什么是列表框和组合框?它们的通知消息用Ctrl+R进入资源编辑器,选择Accelerator有何异同? 的资源项,双击IDR_MAINFRAME,进行加列表框控件提供了文本项目的列表供用户选速键资源的添加。择,可以单选也可以多选。列表框是CListBox8.状态栏的作用是什么?状态栏的窗格分为类的;组合框可以看成是编辑框和列表框的几类?如何添加和减少相应的窗格? 组合,它提供了列表框,允许用户从中选择⑴状态栏是一条位于应用程序的主窗口底部项目;也提供了编辑框,允许用户直接输入,的水平条,可以分割成几个窗格,用来显示它是CCombobox类的。应用程序的当前状态信息或提示信息。这两个控件发送的都是通知消息⑵状态栏窗格分为“信息行窗格”和“指示器(WM_NOTIFY)。当列表框中发生了某个动窗口”。作,比如双击了列表框中某项时,列表框就⑶要增加一个信息行窗格,则只需在状态栏会向其父窗口发送一条通知消息;而在组合数组中适当的位置增加一个框的通知消息中,有的是列表框发出的,有ID_SEPARATOR标识即可;要增加指示器窗的是编辑框发出的。格,则在状态栏数组的适当位置增加一个在14.什么是滚动条、进展条、滑动条和旋转“字符串表”中定义过的资源ID。若要减少窗按钮控件? 格,只需减少数组元素即可。⑴滚动条:是CSrollBar类的控件,它有一个9.如何在状态栏的窗格显示文本? 构造函数和析构函数 ⑴模式对话框:所谓的模式对话框是指对话构造函数是类的成员函数,功能是在创建对框弹出时,用户必须向对话框进行相应的操象时,实用给定的值将对象初始化。它有以作,在退出对话框之前,其所在的应用程序下特点: 是不能往下执行的。 构造函数的名字必须与类名相同。 ⑵无模式对话框:无模式对话框是指对话框构造函数可以有任意的形参,但不能具有返弹出后,一直保留在屏幕上,用户可以在对回值。 话框所在的应用程序中进行其他的操作。定义对象时,编译系统会自动地调用构造函两种对话框在编辑器设计和使用 数。 ClassWizard进行编程时方法基本一致,但在构造函数可以重载 创建和退出对话框窗口时的方式不同。析构函数也是类的成员函数,功能是用于释在创建时,模式对话框是由系统自动分配内放一个对象,在对象删除前,用它来做一些存空间,因此在对话框退出时,对话框对象内存释放等清理工作,与构造函数功能相自动删除。而无模式对话框则需要用户来指反。,它有以下特点: 定内存,退出时还要自己删除对话框对象。析构函数名也应与类名相同,只是在函数名在退出时,两种对话框所用的终止函数不一前面加一个波浪符~。 样。模式对话框通过调用 析构函数不能带任何参数,也没有返回值。CDialog::EndDialog来终止,而无模式对话每个类有而且只能有一个析构函数。析构函框则是通过调用CWnd::DestroyWindow来终数不能重载。 止。 清理内存空间时,会自动地调用析构函数 8.静态控件的类型单继承和派生类的构造函数与析构函数 静态文本组框静态图片 基类的构造函数和析构函数不能被派生类继9.按钮的分类、消息 承 按钮控件是CButton类的控件。 派生类对象在建立时,先执行基类构造函数,按键按钮 单选按钮 复选框按钮(复选框的再执行派生类构造函数。析构函数执行顺序外形是在文本前有一个空心方框,当它被选与构造函数相反,先执行派生类析构函数,中时,复选框中就加上一个标记,通常再执行基类的析构函数。复选框只有选中和未选中两种状态,若复选两种多态性 框前面有一个是灰色,则这样的复选框编译时的多态性和运行时的多态性。编译时是三态复选框,它表示复选框的选择状态是的多态性是通过函数的重载或运算符的重载“不确定”。) 来实现的。运行时的多态性是通过虚函数来BN_CLICKED(单击按钮) 实现的,它是只在程序执行前,根据函数和BN_DOUBLE-CLICKED(双击按钮)参数还无法确定应该调用哪一个函数,必须10.updatedate函数 在程序的执行过程中,根据执行情况动态地UpdateData 函数只有一个TRUE或FALSE的确定。 参数。当调用UpdateData(FALSE)时,数据1.Windows的应用程序特点有哪些?由控件相关联的成员变量向控件传输,当调消息驱动机制 用UpdateData(TRUE)或不带参数的图形设备接口(GDI)UpdateData时,数据由控件向相关联的成员基于资源的程序设计 变量复制。 动态链接库 11、工具栏和菜单项的结合方法 进程和线程 将工具栏上按钮的ID设置成和菜单项ID一2.MFC的AppWizard(exe)提供了哪几种类型样即可。的应用程序? 12、状态栏的设定方法 (1)单文档界面的应用程序(SDI,single 用MFC AppWizard创建的单文档和多文档应document interface); 用程序框架中,有一个静态的indicators数(2)多文档界面的应用程序(MDI,multiple 组,它是在MainFrm.cpp文件中定义的,被documents interface); MFC用作状态栏的定义(3)基于对话框的应用程序(dialog 1.添加和减少相应的窗格.based)。 要增加一个信息行窗格,则只需在状态栏数3.MFC应用程序项目组织:dsp 项目文件 dsw 组中适当的位置增加一个ID_SEPARATOR标识项目工作区文件 cppC++文件,C++头文件 即可;要增加指示器窗格,则在状态栏数组工作区窗口的标签页面:Classview页 的适当位置增加一个在“字符串表”中定义ResourceView页和Fileview页 过的资源ID。若要减少窗格,只需减少数组4.MFC程序类结构 元素即可。 对话框类CAboutDlg 应用程序类2.如何在状态栏的窗格显示文本?(3种)CEx_SDIHelloApp应用程序文档类1.)调用CWnd::SetWindowText更新信息行CEx_SDIHelloDoc 窗格(或窗格0)中的文本 应用程序视图类CEx_SDIHelloView2.)手动处理状态栏的CMainFrame类(用于负责主框架窗口的显示ON_UPDATE_COMMADND_UI更新消息,并在处理和管理) 函数中调用CCmdUI::SetPaneText函数。5.消息的分类有哪些: 3.可以调用CStatusBar::SetPaneText函数标准(窗口)消息:窗口消息一般与窗口内部更新任何窗格中的文本.(通用)参。 20.派生类是如何定义的?它有哪些特点?⑴定义派生类的一般形式为: class派生类名:[引用权限] 基类名{派生类新增的数据成员 派生类新增的成员函数}; ⑵派生类继承了基类的所有数据成员和成员函数,并增加新的成员。 21.派生类的继承方式有哪些?它们各有哪些特点? ①当引用权限为public时,称为“公用派生类”。在公用派生类中,基类的public成员和protected成员仍然成为派生类中的public成员和protected成员;然而基类中的私有成员却成为了派生类中的“不可访问的成员”,不能被派生类使用。 ②当引用权限为private时,称为“私有派生类”。在私有派生类中,基类的公用成员和保护成员成为了派生类中的私有成员,基类的私有成员成为派生类“不可访问的成员”。③从以上两点可以看出,基类中的私有成员在派生类中都成为了“不可访问的成员”。因此在继承中经常使用另外一种封装字protected,被protected封装的成员称为“保护成员”,保护成员和私有成员相似,不能被外界引用,但它却可以被派生类的成员函数引用。 22.在定义派生类的过程中,如何对基类的数据成员进行初始化? 基类的数据成员初始化往往是通过基类的构造函数进行的,但是在么在建立派生类的对象时,是不会自动执行基类的构造函数,因而就会使基类中成员变量未初始化。所以在设计派生类的构造函数时,不仅要考虑派生类所增加的成员变量初始化,还应当考虑基类的成员变量初始化。在执行派生类的构造函数时,应当调用基类的构造函数。 因此考虑到基类成员变量初始化后,派生类的构造函数一般形式为: 派生类构造函数名(参数表):基类构造函数名(参数表) 23.在派生类中能否直接访问基类中的私有成员?在派生类中如何实现访问基类中的私有成员? 在派生类中是不能直接访问基类中的私有成员的,要在派生类中访问基类中的私有成员,只能通过基类所提供的public或protected封装的成员函数进行。 24.什么是虚基类?它的作用如何? 在声明派生类时,在基类的引用权限前面加上virtual,就将基类声明成了虚基类,即:class 派生类名:virtual [引用权限]基类名虚基类的引入主要是针对多重派生的,是为了消除派生类的二义性使用的。通过虚基类派生出来的新类,同一个成员变量在不同的派生类中都只有一个复制,当通过普通基类派生的新类,同一个成员变量,在不同的派生类中的副本是不一样的。 25.多态性:不同类型的对象接收相同的信息时产生不同的行为。例如函数重载。 分类:(1)编译时的多态性:函数重载或第4章对话框及常用控件 1.什么是对话框?它分为哪两类?这两类对话框有哪些不同? (2)对话框是CDialog类的派生类,它的主要功能是输出信息和接收用户的输入。对话框是一个特殊类型的窗口,任何对窗口的操作都可以在对话框中进行。对话框与控件是密不可分的,在每个对话框内一般都有一些控件,对话框依靠这些控件与用户进行交互。2.什么是对话框模板、对话框资源和对话框类? ⑴对话框模板:MFC Develop Studio提供的对话框模板是用来创建用户对话框资源,用对话框模板创建的基本界面上,包括一个OK(确定)按钮和一个Cancel(取消)按钮等。可以移动、修改、删除这些控件,或者是增加新的控件到对话框模板,构成应用程序所需的对话框资源。 ⑵对话框资源:对话框资源是一个用户输入或取得数据的图形界面。这个图形界面是使用 对话框编辑器在对话框模板上创建的,程序员可以在对话框模板上增加并编辑控件,生成对话框资源。当应用程序运行时,就可以得到一个对话框。⑶对话框对象 MFC使用CDialog类来描述对话框,它是CWnd类的派生类。在CWnd类的基础上增加了数据交换的功能。当创建一个新的对话框资源后,使用ClassWizard可以创建一个对话框类的派生类。对话框对象实现了对话框和应用程序之间的通信。在应用程序中定义一个对话框对象后,在对话框关闭后,可以通过访问对话框对象的成员变量获得用户的输入数据。 4.什么是控件?根据控件的性质可以将控件分为几类? 控件是系统内部定义的能完成特定功能的一些组件,控件能够放置在一个对话框中,提供应用程序与用户交互的某种功能的类,根据控件的特性和功能,一般可以将其分为3类:Windows通用控件、ActiveX控件以及MFC新增控件,Windows通用控件一般都是从CWnd派生而来的。6.什么是DDV/DDX技术?如何使用这种技术? 为了能方便地操作一个控件,MFC采用了独特的DDX(Dynamic Data Exchange,动态数据交换)和DDV(Dynamic Data verify,动态数据交换)技术。DDX将数据成员变量与对话类模板内的控件相连接,这样使得数据在控件之间很容易传输。DDV用于数据的校验,它能自动校验数据成员变量数值的范围,并给出警告。 7.什么是控件的通知消息?它在编程中起哪些作用? 当控件状态发生改变时,控件就会向其父窗口发送消息,这就是控件的通知消息。控件的通知消息可以是一条WM_COMMAND消息,也可以是一条WM_NOTIFY消息。9.什么是编辑框控件?它有哪些功能? 编辑框是一个允许用户从键盘输入数据和编独立的窗口,两端有两个箭头按钮,中间有一个可移动的滚动块,具有直接的输入焦点,分为垂直滚动条和水平滚动条两种类型。⑵进展条:用于说明一个操作的进度,在操作过程中不断地从左到右填充进展条,可以让用户看到还有多少任务要完成。⑶滑动条:由滑动块和可选的刻度线组成的,它是CSliderCtrl 类的。⑷旋转按钮控件:是CSpinButtonCtrl类的,由一对箭头按钮组成,它通常与一个相伴的控件一起使用。15.什么是旋转按钮的“伙伴”控件?如何设置? 与旋转按钮控件一起使用的控件称为“伙伴(buddy)控件”,单击旋转按钮控件的箭头按钮,可以增大或减小其伙伴控件中某个值。伙伴(buddy)控件的设置有两种方法: ①SetBuddy:设置旋转控件的伙伴窗口。②在对话框中用Ctrl+D进行设置 16.在MFC中,通用对话框有哪些?如何在程序中使用它们? Windows提供了一组标准用户界面对话框,它们都有相应的MFC库中的类来支持,所有这些通用对话框类都是从一个公共的基类CCommonDialog派生而来的。 17.如果消息对话框只有“是”和“否”两个按钮,则如何设置MessageBox函数的参数?答:可以将MessageBox函数中的参数nType设置为MB_YESNO。 消息对话框用于显示信息有两种类型AfxMessageBox和MessageBox,前者为全程函数,MessageBox只能在控件对话框,窗口等一些窗口类中使用 1.菜单有哪些常见的规则?P221 为了使Windows程序更容易操作,菜单的显示都遵循下列一些规则: ⑴若单击某菜单项后,将弹出一个对话框,那么在该菜单项文本后有“…”。 ⑵若某项菜单有子菜单,那么在该菜单项文本后有。 ⑶若菜单项需要助记符,则用括号将带下画线的字母括起来。助记符与Alt构成一个组合键,当按住“Alt”键不放,再敲击该字母时,对应的菜单项就会被选中。 ⑷若某项菜单需要快捷键的支持,则一般将其列在相应菜单项文本之后。 2.什么是助记符?它是如何在菜单中定义的?菜单项的助记符是用括号和带下画线的字母括起来的符号,助记符与Alt构成一个组合键。 3.菜单项的消息有哪些? 菜单项产生的消息有:COMMAND 消息和UPDATE_COMMAND_UI消息。 4.若对同一个菜单用Class Wizard分别在视图类和主框架窗口类CMainFrame都处理其 COMMAND消息,并在它们的函数中添加相同的代码,则当用户选择该菜单后,会有什么样的结果?为什么? 命令消息处理的优先级别为:命令→视图类→文档类→文档模板类→框架窗口类→应用程序类。因此,视图类的消息处理函数会执行,而 5.什么是键盘快捷键?它是如何定义的? 可以调用CStatusBar::SetPaneText函数更新任何窗格中的文本。11.什么是命令更新消息?它的作用是什么? UPDATE_COMMAND_UI消息又称为“更新命令UI消息”,该消息映射函数中有一个CCmdUI类的对象pCmdUI,CCmdUI类中包含了一个指向菜单项或工具栏按钮的指针,于是利用该指针对菜单项或工具栏按钮的显示形式进修正 1.1.2.3.4.2.一、简答题(每小题5分,共20分)什么是类?什么是对象?对象与类的关系是什么?构造函数和析构函数的主要作用是什么?他们各有什么特性?派生类构造函数和析构函数的执行顺序是怎样的?什么是虚函数?虚函数与函数重载有哪些相同点和不同点? 二、选择题(每小题2分,共20分) 1.假设已经有定义char *const pName=”Student”;下面的语句正确的。 A.pName[3]=’t’;B.pName=”score”; C.pName=new char[5];D.pName=new char(‘p’); 2.在下面有关对构造函数的描述中,正确的A.构造函数可以带有返回值 B.构造函数的名字与类名完全相同 C.构造函数必须带有参数 4.构造函数必须定义,不能缺省 3.在下面有关析构函数特征的描述中,错误的。 A.一个类中只能定义一个析构函数 B.析构函数名与类名完全相同 C.析构函数不能指定返回类型 D.析构函数不能带有参数 4.假定AB为一个类,则执行“ABa(4), b[3] , * p[2];”语句时,自动调用该类构造函数的次数为。 A.3B.4C.6D.9 5.假定要对类AB定义加号操作符重载成员函数,实现两个AB类对象的加法,并返回相加结果,则该成员函数的声明语句为。 A.AB operator+(AB&a,AB&b)B.ABoperator+(AB&a) C.operator+(ABa)D.AB& operator+() 6.假设定义了函数模版: template T max(T x, T y){return(x>y)?x:y;} 并定义了:int i;char c;那么下列错误的调用该模版的是。 A.max(i,i);B.max(c,c); C.max(int(c),i);D.max(c,i); 7.模版的主要用途是为。 A.提高代码的运行效率 B.实现多态性 C.提高代码的重用性 D.加强类的封装性 8.下列说法错误的。 A.申明为指向基类对象的指针可以指向它的公有派生的对象,但不允许指向它的私有派生的对象 B.允许将一个声明为指向基类的指针指向其公有派生类的对象,但是不能将一个声明为指向派生类对象的指针指向其基类的一个对象。 C.声明为指向基类对象的指针,当其指向公有派生类对象时,只能用它来直接访问派生类中从基类继承来的成员,而不能直接访问公有派生类中定义的成员 D.以上说法都不对 9.现有程序如下: #include #include void main(){ int kk=1234; cout< cout< } 以上程序的运行结果是。 A.1234B.**1234C.**1234D.以上都不对 12341234**123 410.在公有继承的情况下,基类成员在派生类中的访问权 A.受限制B.保持不变C.受保护D.不受保护 1.1.三、填空题(每空1分,共10分)假定类AB中有一个公有属性的静态数据成员bb,在类外不通过对象名访问该成员bb的写法为(1)。 通常情况下,当创建派生类对象时,首先执行(2)的构造函数,随后再执行(3)的构造函数,当撤销派生类对象时,则先执行(4)的析构函数,随后再执行(5)的析构函数。 ios类中有几个成员函数可以用来对输入输出进行格式化控制,格式控 制主要是通过对(6)的操作来完成的。 所谓赋值兼容规则是指在需要基类对象的任何地方都可以使 用(7)来替代。 纯虚函数是一个在基类中说明却没定义的虚函数,但要求在它的派生类 中必须定义自己的版本,或重新说明为纯虚函数。那么,纯虚函数的定义形式为(8)。2.3.4.5.6.分别写出类AB的单目运算符”++”的前缀方式和后缀方式的友元函数重载一般形式:(9)、(10)。 2.四、写出下面程序的运行结果(每小题5分,共20分) 1、#include class Myclass{ public: Myclass(){} Myclass(int a, int b, int c); void GetNumber(); void GetSum(); private: int x,y,z; static int sum; }; int Myclass::sum=0; Myclass::Myclass(int a, int b, int c){ x=a;y=b;z=c; sum+=x+y+z; } void Myclass::GetNumber(){ cout<<“number=”< } void Myclass::GetSum(){ cout<<“sum=”< } void main(){ Myclass M(3,7,10); M.GetNumber(); M.GetSum(); Myclass N(14,9,11); N.GetNumber(); N.GetSum(); M.GetSum(); } 2、#include class TDate1{ public: TDate1(int y,int m, int d); ~TDate1(); void Print(); private: int year, month,day; }; TDate1::TDate1(int y,int m,int d){ year=y; month=m; day=d; cout<<“contructor called.n”; } TDate1::~TDate1(){ cout<<“Destructor called.n”; } void TDate1::Print(){ cout< } void main(){ TDate1 today(202_,7,1),tomorrow(202_,7,2); cout<<“today is ”; today.Print(); cout<<“tomorrow is ”; tomorrow.Print(); } 3、#include class Date{ public: Date(){ cout<<“Date called.”< } private: unsigned int year, month, day; }; class Employee{ public: Employee(){ cout<<“Employee called.”< } private: Date birthday; }; class Manager: public Employee{ public: Manager(){ cout<<“Manager called.”< } private: unsigned int allowance; }; int main(){ Manager susan; return 0; } 4、#include class complex{ public: complex(int r,int i):real(r),imag(i){} friend complex operator++(complex); friend complex operator--(complex &); void print(){ cout<<“(”< } private: int real,imag; }; complex operator++(complex o){ o.real++; o.imag++; return o; } complex operator--(complex &o){ o.real--; o.imag--; return o; } void main(){ complex obj(10,20),obj_b(30,40); ++obj; obj.print(); --obj_b; obj_b.print(); } 1.五、编程题(每小题10分,共30分) 1、构建一个类book,其中含有两个私有数据成员qu和price,建立一个有5个元素的对象数组,将qu初始化为1~5,将price初始化为qu的10倍。显示每个对象的qu*price。 2、编写一个程序,用成员函数重载运算符“+”和“-”将两个二维数组相加和相减,要求第一个二维数组由构造函数设置,另一个二维数组的值由键盘输入。 3、写一个函数模板,求数组中的最大元素。使得函数调用时,数组类型和返回类型可以是整数也可以是双精度类型。 1.一、简答题(每小题5分,共20分) 1.答:类就是相同的数据和相同的一组对象的集合,即,类是对具有相同数据结构和相同操作的一类对象的描述;对象是描述其属性的数据以及对这些数据施加的一组操作封装在一起构成的统一体,对象可以认为是:数据+操作;类和对象之间的关系是抽象和具体的关系。 2.答:构造函数主要用于为对象分配空间,进行初始化。构造函数除了具有一般成员函数的特征外,还具有一些特殊的性质:(1)构造函数的名字必须与类名相同(2)构造函数可以有任意类型的参数,但不能指定返回类型。它有隐含的返回值,该值由系统内部使用。(3)构造函数是特殊的成员函数,函数体可写在类体内,也可写在类体外。(4)构造函数可以重载,即一个类中可以定义多个参数个数或参数类型不同的构造函数。(5)构造函数被声明为公有函数,但它不能像其他成员函数那样被显式地调用,它是在定义对象的同时被调用的。 析构函数也是一种特殊的成员函数。它执行与构造函数相反的操作,通常用于撤消对象时的一些清理任务,如释放分配给对象的内存空间等。析构函数有以下一些特点:(1)析构函数与构造函数名字相同,但它前面必须加一个波浪号(~);(2)析构函数没有参数,也没有返回值,而且不能重载。因此在一个类中只能有一个析构函数;(3)当撤消对象时,编译系统会自动地调用析构函数。 答:略.详见教材P151.4.答:略.详见教材P192.二、选择题(每小题2分,共20分) 1~10.ABBBBCCDBB 1.三、填空题(每空1分,共10分) (1)AB::bb(2)基类(3)派生类(4)派生类(5)基类(6)状态标志字(7)公有派生类对象(8)virtual 函数类型 函数名(参数表)=0;(9)AB operator++();(10)AB operator++(int); 1.四、写出下面程序的运行结果(每小题5分,共20分) 1.number=3,7,10 sum=20 number=14,9,11 sum=54 sum=54 2.contructor called.contructor called.today is 202_.7.1 tomorrow is 202_.7.2 Destructor called.Destructor called.3.Date called.Employee called.Manager called.4.(10,20) (29,39) 四要素+交易成功图+物流图+好评图+收款说明 日期+主持人yy名+会员YY名+商家旺旺 每接一个单子需要发三个截图,一个待收货截图,一个未付款的截图,一个已付款的截图,未付款的截图发给主持人,已付款的截图跟资料发给主持人 【一个淘宝账号.一天只能拍3单.一个星期7单.一个月20单.且账号必须满月且有心.】 【怎么具体刷单子】按照主持人得口令来操作,抢麦的形式,然后麦序一个一个来。按照主持人给的关键字在淘宝首页搜索,找到指定的商家店铺,先货比三家,之后点图片进店,进去游览3-5个宝贝,页面拉至最低,图片全部显示出来。看成交记录还有好评。游览5-8分钟,游览差不多跟主持人说下,主持人会指定你拍的宝贝。找到那个宝贝,先浏览,之前浏览过的可以直接去假聊,然后跟商家假聊【千万不要说你谁给他刷信誉的,就聊些价格质量】。记得双收藏【收藏宝贝还有店铺】。拍下宝贝按照主持人要求的改地址。最后将未付款截图发主持, 主持确认拍正确了会给你红包卡号和验证码。付款后将旺旺号+支付宝账号+真实姓名+YY号+付款截图发给主持。【还有最重要一步,就是发货后注意查看物流,4-6确认收货给店铺五星带十字好评,】然后发:【旺旺号+佣金账号+真实姓名+YY号+确认收货截图+物流信息截图+好评截图发到主持人截图群那里,】【没有那个主持截图群的发给主持本人,】【押款单子发给主持本人。】不懂的可以问培训或者培训主持。】 收款说明:日期+主持人yy名+会员YY名+商家旺旺+编号第三篇:c++
第四篇:C++
第五篇:c++