c++复习1Word格式.docx
《c++复习1Word格式.docx》由会员分享,可在线阅读,更多相关《c++复习1Word格式.docx(20页珍藏版)》请在冰豆网上搜索。
(3)new可以为数组分配内存,但当释放时,也可以告诉delete数组有多少个元素。
delete[10]p;
3.类的静态成员特点,引用方式?
P92
静态成员是类中的成员,是类的一部分,在类外不可以访问,从而起到保护的作用,其次,静态成员有静态数据成员和静态成员函数之分,静态数据成员和静态变量相似,具有静态生存周期,是在类中声明的全局数据成员,能被同一个类的所有对象所共享。
而共有静态函数不仅可以通过类对象来访问,还可以通过“类名:
静态成员函数”的形式在程序中直接调用。
静态数据成员:
节省空间,对多个对象来说,静态数据成员只存储一处,供所有对象共享。
其值是可以修改的,步骤如下:
(1)在类中使用关键字static声明静态数据成员(形式上的虚函数)
(2)在类外为静态数据成员分配内存空间并初始化
说明:
(1)由于静态数据成员在类中所作的声明仅仅声明该成员是属于哪个类的,它是形式上的虚的成员,还必须在类的外部作实际定义才能被所有对象共享,正因如此,静态数据成员的实际定义和初始化本身不受public、private、protected等访问属性的限制。
(2)静态数据成员可以看成类中声明、类外定义的静态全局变量,因为它有静态生存周期,在程序中从实际定义开始产生,到程序结束时消失。
静态数据成员的内存空间同样不能在类的构造函数中创建或者是在析构函数中释放
(3)静态数据成员是类中的成员,它的访问属性同普通数据成员一样,可以为public、private和protected,当静态数据成员为public时,则在类外对该成员的访问和引用可有两种方式,一是通过对象来引用,二是直接引用
静态成员函数:
4.类的继承与派生?
P104-P112
继承
继承是指一个事物可以继承其父辈全部或部分的特性,同时本身还有自己的特性
类的继承分为单继承和多继承,如果一个类只有一个基类,则为单继承,否则为多继承,
单继承形式:
class<
派生类名>
[<
继承方式>
]<
基类名>
{
[<
派生类的成员>
]
}
多继承形式:
class<
继承方式1>
基类名1>
[<
继承方式2>
基类名2>
以上两种继承均有三种继承方式:
分别是public、private、protected
public:
共有继承的特点是基类的共有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员任然是私有的。
private:
私有继承的特点是基类的共有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问。
protected:
保护继承的特点是基类的所有共有成员和保护成员都成为保护成员,并且只能被它的派生类成员函数或友元访问,基类的私有成员仍然是私有的。
派生
当一个新类从一个已定义的类中派生后,新类不仅继承了原有类的属性和方法,并且还拥有自己新的属性和方法,成为类派生
在基类上建立的新类称为派生类,基类的构造函数和析构函数不能被派生类继承,当派生类的构造函数和析构函数被执行时,基类相应的构造函数和析构函数也会被执行;
派生类对象在建立时,先执行基类的构造函数,然后执行派生类的构造函数,但是对于析构函数来说,其顺序刚好相反,先执行派生类的析构函数,而后执行基类的析构函数。
5.什么是函数重载P37,如何区分重载函数
函数重载是指C++允许多个同名的函数存在,但同名的各个函数的参数必须有区别,要么形参的个数不同,要么形参的个数相同,但参数类型不同,
区分重载函数:
查看同名函数参数列表中参数的个数和参数的类型是否不同,进行区别。
6.构造函数,析构函数。
P83
构造函数:
是在创建对象时,使用给定的值将对象初始化,在对象建立时它会自动执行,变量和对象的初始化代码放在构造函数中。
类有一个函数体是空块,默认构造函数不进行任何操作。
1.构造函数的说明
(1)构造函数的约定使系统在生成类的对象时自动调用,同时,指定对象括号里的参数就是构造函数的实参。
(2)定义的构造函数不能指定其返回值的类型,也不能指定为void类型
(3)若要用类定义对象,则构造函数必须是共有型成员函数,否则类无法实例化。
若类仅用于派生其它类,则构造函数可定义为保护型成员函数。
2.默认构造函数的说明
(1)默认构造函数对数据成员初值的初始化还取决于对象的存储类型
(2)若类定义中指定了构造函数,则隐式的默认构造函数不存在
(3)在定义对象时,不能写成“类名对象名()”这是一个函数的声明的错误。
析构函数:
是用来释放一个对象,在对象删除前,用它来做一些内存释放登清理工作,每一个类值有一个析构函数,没有任何的参数,也不返回任何值,与构造函数的功能相反。
~类名(){}
7.什么是消息,VC中存在几种系统定义的消息分类。
P170
消息用于描述某个事件发生的信息
消息分类以下3种:
窗口消息:
这类消息主要是指由WM_开头的除WM_COMMAND之外的消息
控件的通知消息:
当控件的状态发生改变时,控件就会向其父窗口发送WM_COMMAND通知消息
命令消息:
命令消息主要包括由用户交互对象(菜单、工具条的按钮)发送的WM_COMMAND通知消息。
命令消息的处理方式与其他两种消息不同,它能够被多种对象接收、处理,这些对象包括文档类、文档模板类、应用程序本身及窗口和视类等;
而窗口消息和控件的通知消息是有窗口对象接收并处理的,这里的窗口对象时指从窗口类CWnd中派生的类的对象,它包括CFrameWnd·
·
以及这些类的派生对象等。
8.MFC类的基本层次结构,使用VC++的AppWizard创建的典型SDI应用程序的步骤及4个MFC基类
MFC类的基本层次结构:
使用VC++的AppWizard创建的典型SDI应用程序的步骤:
(1)选择“文件”——>
“新建”,在弹出的“新建”对话框中,在“工程”标签页面中选择“MFCAppWizard(exe)的项目类型”,在“工程名称”编辑框中输入工程名,然后在“位置”选择框中选择文件存放的位置,点击确定,进入下一个页面。
(2)
在页面中选择要创建的应用程序的类型,
选择是否需要“文档/查看体系结构的支持”,
选择资源所使用的语言
(3)单击“下一步”,从该页面中可选择是否在程序中加入数据库的支持
(4)单击“下一步”,允许在程序中加入复合文档、自动化、ActiveX控件的支持。
(5)单击“下一步”,前几项依次确定对浮动工具条打印与预览及通信等特性的支持。
最后两项是最近文件列表数目的设置和一个“高级”按钮。
单击“高级”按钮将弹出一个对话框,允许对文档及其扩展名、窗口风格进行修改。
保留默认选项
(6)单击“下一步‘,选择喜欢的风格,选择是否生成源文件备注,选择是否使用MFC库,一般保留默认
(7)单击“下一步”,对MFCAppWizard提供的默认类名、基类名、各个源文件名进行修改,单击“完成”,然后单击“确定”
(8)编译运行
注:
简化答法,选择“文件”——>
“新建”,在弹出的“新建”对话框中,在“工程”标签页面中选择“MFCAppWizard(exe)的项目类型”,在“工程名称”编辑框中输入工程名,然后在“位置”选择框中选择文件存放的位置,点击“完成”,然后点击“确定”开始创建。
4个MFC基类:
应用程序类、应用程序文档类、应用程序视图类、框架窗口类
9.常用控件的用途:
类名,常用成员函数。
静态控件,按钮、编辑框、列表框、组合框、滚动条P193翻书吧,没法总结
滚动条:
是CSrollBar类的控件,它有一个独立的窗口,两端有两个箭头按钮,中间有一个可移动的滚动块,具有直接的输入焦点,分为垂直滚动条和水平滚动条两种类型。
10.工具栏、菜单和加速键,第六章
11.如何创建快捷菜单
(1)定义:
快捷菜单也称为浮动式弹出菜单,即按下鼠标右键时,就会相应地弹出一个菜单。
(2)用CMenu:
TrackPopupMenu和资源编辑器可以创建这样的菜单。
具体操作步骤如下:
①用Ctrl+R进入资源编辑器,新建一个菜单资源;
②在视图类或其他接收鼠标右键单击的窗口类中添加WM_CONTEXTMENU消息控制函数;
编辑代码如下:
CMenumenu;
//菜单项目是属于CMenu类的
menu.LoadMenu(IDR_MENU1);
//加载菜单资源
menu.GetSubMenu(0)->
TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,
point.x,point.y,this);
12.GDI相关概念P318
Windows环境下的图形组件,介于应用程序与绘图设备驱动之间,为应用程序提供了一套与具体设备无关的绘图程序接口。
在选择GDI对象进行绘图时,应遵循下列步骤:
1)在堆栈定义一个GDI对象,然后用相应的函数创建此GDI对象。
2)将构造的GDI对象选入当前设备环境中,但不要忘记将原来的GDI对象保存起来
3)绘图结束后恢复当前设备环境中原来的GDI对象
4)由于GDI对象在堆栈中创建,当程序结束后,会自动删除程序创建的GDI对象。
补充P327
13.什么是this指针?
它有何作用?
P104
this指针是一个仅能被类的非静态成员函数访问的特殊指针;
当类实例化时,this指针指向对象自己;
而在类的声明时,指向类本身;
可以提升成员函数操作的效率,而且能简化运算符重载代码。
注另外答案:
一个类可以同时有很多对象存在,许多不同的对象可以调用相同的成员函数,编译系统为了知道当前是那个对象在调用成员函数,因此定义了this指针,this指针其实就是指向当前对象的指针。
15.简述消息循环的处理过程。
(书上没讲)
概念补充:
消息循环
Windows应用程序的运行以消息为核心。
Windows将产生的消息放入应用程序的消息队列中。
消息循环就是循环提取队列中的消息,并将其传递给窗口函数的相应处理过程
16.在派生类中能否直接访问基类中的私有成员?
在派生类中如何实现访问基类中的私有成员?
在派生类中是不能直接访问基类中的私有成员的,
要在派生类中访问基类中的私有成员,只能通过基类所提供的public或
protected封装的成员函数进行。
17.WizardBar工具栏的作用是什么
WizardBar工具栏可以对ClassView和ClassWizard中的命令进行快速访问,使类和成员函数的操作更加方便,WizardBar会自动跟踪用户程序的上下文。
补充:
用mfc建立工具栏的步骤:
1)、先使用vc++6.0工作平台中的资源编辑器打开资源,打开toolbar中工具栏的位图资源,然后根据自己的需要建立和修改工具栏
2)、在程序中建立一个CToolBar对象
3)、调用CToolBar类的Create()成员函数,建立窗口的工具栏,该函数同时将工具栏子窗口与CToolBar对象连接在一起;
4)、调用CToolBar类的LoadBitmap()成员函数,装入工具栏命令按钮组的图形位图资源。
5)、调用CToolBar类的SetButtons()成员函数,设定工具栏中的命令按钮风格,并赋予每个命令按钮在位图资源中图形。
18.什么是虚函数?
为什么要定义虚函数?
在声明派生类时,在基类的引用权限前面加上virtual,就将基类声明成了虚基类,即:
class派生类名:
virtual[引用权限]基类名
虚基类的引入主要是针对多重派生的,是为了消除派生类的二义性使用的。
通过虚基类派生出来的新类,同一个成员变量在不同的派生类中都只有一个复制,当通过普通基类派生的新类,同一个成员变量,在不同的派生类中的副本是不一样的。
19.简述VisualC++创建一个MFCODBC数据库应用程序的步骤?
P334
(1)用access或其他数据库工具构造一个数据库
(2)在windows中为刚才构造的数据库定义一个ODBC数据源
(3)在创建数据库处理的文档应用程序中选择数据源
(4)设计界面,并使控件与数据表字段关联
20.什么是控件?
根据控件的性质可以将控件分为哪几类?
定义:
控件是系统内部定义的能完成特定功能的一些组件,控件能够放置在一个对话框中,提供应用程序与用户交互的某种功能的类,
根据控件的特性和功能,一般可以将其分为3类:
Windows通用控件、ActiveX控件以及MFC新增控件,Windows通用控件一般都是从CWnd派生而来的。
21.状态栏的作用是什么?
状态栏的窗格分为几类?
如何添加和减少相应的窗格?
⑴状态栏是一条位于应用程序的主窗口底部的水平条,可以分割成几个窗格,用来显示应用程序的当前状态信息或提示信息。
⑵状态栏窗格分为“信息行窗格”和“指示器窗口”。
⑶要增加一个信息行窗格,则只需在状态栏数组中适当的位置增加一个ID_SEPARATOR标识即可;
要增加指示器窗格,则在状态栏数组的适当位置增加一个在“字符串表”中定义过的资源ID。
若要减少窗格,只需减少数组元素即可。
22、简述创建基于对话框应用程序的过程?
⑴创建对话框资源;
⑵增加控件并设置控件属性;
⑶设计对话框类;
⑷模式或非模式方式显示对话框
阅读程序题
1.
classtest
private:
intnum;
public:
test(int);
voidPrint();
};
test:
test(intn)
{num=n;
}
voidtest:
Print()
{cout<
num<
endl;
#include<
iostream.h>
voidmain()
{testT(10);
T.print();
结果:
10
2.
#include<
classA
{friendAfun1(A&
pt,intn);
public:
A(intx=0,inty=0)
{xPos=x;
yPos=y;
}
voidPrint()
{cout<
"
Point("
<
xPos<
"
yPos<
)"
endl;
private:
intxPos,yPos;
Afun1(A&
pt,intn)
{pt.xPos+=n++;
pt.yPos+=n;
returnpt;
intmain()
{Apt(5,8);
pt.Print();
fun1(pt,2);
return0;
Point(5,8)
Point(7,10)
3.
classPerson
friendclassFriendClass;
doublebonus;
charname[50];
Person(char*,double);
Person:
Person(char*s,doubled)
strcpy(name,s);
bonus=d;
classFriendClass
voidprint(Person&
)const;
voidFriendClass:
print(Person&
r)const
cout<
"
我知道Person类的一切"
endl
<
name="
r.name
,bonus="
r.bonus<
Personp("
小王"
28000);
FriendClassf;
f.print(p);
我知道Persion类的一切
name=小王,bonus=28000.0
4.
#include<
classSquare
{private:
doublelength,area;
Square(double);
doublegetArea()const;
Square:
Square(doubled)
{length=d;
area=length*length;
doubleSquare:
getArea()const
{returnarea;
{Squares(5);
Square*p=&
s;
Square&
ref=s;
s.getArea()<
ref.getArea()<
endl;
p->
getArea()<
结果是:
25.0
5.#include<
classCData
staticvoidAdd(inta)
if(pCur>
=data+20)
cout<
内存空间不足,无法添加!
else
{
*pCur=a;
pCur++;
staticvoidPrint(void);
staticvoidSort(void);
staticintdata[20];
//声明静态内存空间
staticint*pCur;
//声明静态指针成员
intCData:
data[20];
//实际定义,默认的初值为0
int*CData:
pCur=data;
//实际定义,设初值为data数组的首地址
voidCData:
Print(void)//类外定义的静态成员函数
for(inti=0;
i<
(pCur-data);
i++)
data[i]<
;
Sort(void)//类外定义的静态成员函数
intn=pCur-data;
for(inti=0;
n-1;
i++)
for(intj=i+1;
j<
n;
j++)
if(data[i]>
data[j])
{
inttemp=data[i];
data[i]=data[j];
data[j]=temp;
}
CData:
Add(20);
CData:
Add(40);
Add(-50);
Add(7);
Add(13);
Print();
Sort();
20,40,-50,7,13,
-50,7,13,20,40
6、classPerson
{private:
stringname;
Person();
Person(string);
~Person();
Person()
默认构造函数正在执行,创建无名对象。
Person(strings):
name(s)
{cout<
带参构造函数person()正在执行,创建对象:
name<
~Person()
~Person正在执行,析构对象:
{Person*AA=newPerson("
张三"
);
Person*BB=newPerson();
deleteBB;
Person*ptr=&
Person();
deleteAA;
张三
默认构造函数正在执行,创建无名对象
7.
string.h>
classCName
CName()
{strName=NULL;
}
CName(char*str){
strName=(char*)newchar[strlen(str)+1];
//因字符串后面还有一个结束符,因此内存空间的大小要多开辟1个内存单元
st