当前位置:文档之家› C语言复习

C语言复习

1.函数指针:void (*f)() 函数返回指针:void* f() const指针:const int*

指向const的指针:int* const 指向const的const指针:const int* const

2.一般来说,函数的实参和实参的类型应该一致。

3.指针和引用的差别?

答:(1)在任何情况下都不能使用指向空值的引用(非空区别)。

(2)在使用引用之前不需要测试它的合法性。相反,指针则应该总是被测试,防止其为空(合法性区别)。

(3)指针与引用的另外一个重要的区别是指针可以被重新赋值以指向另一个不同的对象,但是引用则总是指向在初始化时被指定的对象,以后不能改变,但是指定的对象其内容
可以改变(可修改区别)。

4.int f(int x,int y)
{

return(x&y)+((x^y)>>1)

}

(729,271)=(729+271)/2=500

5.如何将a,b的值进行交换,并且不使用任何中间变量?

a=a^b
b=a^b
a=a^b

6写一个“标准宏”MIN,这个宏输入两个参数并返回较小的一个。

define MIN(A,B) ((A)<=(B)?(A):(B))

7.const用法说明要点?

(1)可以定义const常量。(2)const可以修饰函数的参数和返回值,甚至函数的定义体,被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。

8.const与define相比有什么不同?

答:const常量有数据类型,而宏常量没有数据类型,编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换的过程中会产生意料
不到的错误(边际效应).

9.以下代码为32位机器编译,数据是以4字节为对齐单位,这两个类的输出结果为什么不同?

class B class C

{ {
private: private:

bool m bTemp; int m nTemp;
int m_nTemp; bool m_bTemp;
bool m_nTemp2; bool m_bTemp2;
};
};

cout<sizeof(B)=12
cout<sizeof(C)=8

10.求解下面程序的输出结果。

class A5 int main()

{ {
public: cout<double d; return 0;
float a; }
int b;
char c; sizeof(A5)的大小是24.
A5();
~A5();
};

11.sizeof与strlen之间的区别?

char* ss="0123456789";----------->sizeof(ss)=4 //ss是指向字符串常量的字符指针
sizeof(*ss)=1 //*ss是第一个字符

char ss[]="0123456789"; --------->sizeof(ss)=11 //ss是数组,计算到"\0"的位置,因此是10+1=11

sizeof(*ss)=1 //*ss是第一个字符

char ss[100]="0123456789";-------->sizeof(ss)=100 //ss表示在内存中预分配的大小,100*1.
strlen(ss)=10 //用一个循环计算字符串的长度,直到"\0"为止

int ss[100]="0123456789";-------->sizeof(ss)=400 //ss表示在内存中的大小,100*4

12.class X
{
int i;
int j;
char k;
};
X x; cout<sizeof(X)=12 //内存补齐
cout<sizeof(x)=12 //理由同上

13.sizeof与strlen的总结?

答:1>sizeof是运算符,strlen是函数。2>sizeof可以用类型作参数,strlen只能用char*作参数,sizeof还可以用函数做参数。例:short f(); printf("%d\n",sizeof(f())); 输出的结果是sizeof(short),即2.

14.int **a[3][4]这个数组占据多大空间? sizeof问题,3*4*4=48.

15.以下代码的输出结果是多少?

class B
{
float f;
char p;
int adf[3];
}; cout<
16.一个空类占多大空间?多重继承的空类呢?

答:一个空类所占的空间为1,多重继承的空类所占的空间还是1.

17.内联函数和宏的差别是什么?

答:内联函数与普通函数相比,可以加快程序运行的速度,因为不需要中断调用,在编译的时候内联函数可以直接被镶嵌到目标代码中,而宏只是一个简单的替换。
宏并不是函数,只是在编译前将有关字符串替换成宏体。

内联函数要做参数类型检查,这是内联函数与宏相比的优势。inline一般只用于如下情况:(1)一个函数不断被重复调用。(2)函数只有简单的几行,且函数内不包括for,
while,switch语句。

18.float(**def)[10]--------->def是一个二维指针,它指向的是一个一维数组的指针,数组的元素都是float。

double*(*gh)[10]--------->gh是一个指针,它指向一个一维数组,数组元素都是double*.

Long (*fun)(int)--------->函数指针。

double(*f[10])()--------->f是一个数组,f有10个元素,元素都是函数的指针,指向的函数类型是没有参数且返回double的函数。

int*((*b)[10]);----------->跟int*(*b)[10]是一样的,是一维数组的指针。

19.空指针和迷途指针的区别是什么?

答:当delete一个指针的时候,实际上仅是让编译器释放内存,但指针本身依然存在,这时,它就是一个迷途指针。当使用以下语句时,可以把迷途指针改为空指针,Myptr=0;

20.下列程序的输出结果是什么?

#include

using namespace std;
main()
{
char* a[]={"hello","the","world"};
c

har**pa=a;
pa++;
cout<<*pa<}
*pa=the

21.句柄和指针的区别和联系是什么?

答:句柄是一个32位的整数,实际上是windows在内存中维护的一个对象(窗口等),内存物理地址列表的整数索引,句柄是一种指向指针的指针,Windows系统用句柄标记系统
的资源,隐藏系统的信息,指针则标记某个物理内存地址。

22.以下代码的输出结果是什么?

char var[10]

int test(char var[])
{
return sizeof(var)
}; //因为var[]等价于*var,已经退化成一个指针了,所以大小是4.

23.写出如下程序段的输出结果?
int a[]={1,2,3,4,5};
int*ptr=(int*)(&a+1);
printf("%d %d",*(a+1),*(ptr-1)); //*(a+1)=2 *(ptr-1)=5


24.C++中的空类默认产生哪些类成员函数?

答:对于一个空类,编译器默认产生4个成员函数:默认构造函数,析构函数,拷贝构造函数,赋值函数。

25.成员变量:哪一种成员变量可以在同一个类的所有实例之间共享?

答:必须使用静态成员变量在一个类的所有实例间共享数据.如果想限制对静态成员变量的访问,则必须把他们声明为保护型或私有型,不允许用静态成员变量去存放

某一个对象的数据,静态成员数据是在这个类的所有对象间共享的。

26.如果虚函数是非常有效的,我们是否可以把每个函数都声明为虚函数?

答:不行,这是因为虚函数是有代价的:由于每个虚函数的对象都必须维护一个V表,因此在使用虚函数的时候都会产生一个系统开销,如果仅是一个很小的类,且不想派生其他

类,那么根本没必要使用虚函数。

27.析构函数可以是内联函数吗?

答:析构函数可以是内联函数。

28.公有继承与私有继承的区别是什么?

答: 私有继承使父类的所有元素无法与子类联系。

29.C++中如何阻止一个类被实化?

答:使用抽象类,或者构造函数被声明为private。

30.一般在什么时候构造函数被声明为private?

答:比如要阻止编译器生成默认的拷贝构造函数的时候。

31.含有纯虚函数的类是不能实例化一个对象的,解决办法是把纯虚函数改为一般的虚函数。

32.什么是虚指针?

答:虚指针或虚函数指针是一个虚函数的实现细节,带有虚函数的类中的每一个对象都有一个虚指针指向该类的虚函数表。

33.虚函数的入口地址和普通函数有什么不同?

答:每个虚函数都在vtable中占了一个表项,保存着跳转到它的入口地址的指令(实际上就是保存了它的入口地址),当一个包含虚函数的对象被创建的时候,它在头部附加一个
指针,指向vtable中相应的位置,

34.虚函数的作用?

答:虚函数的作用是实现

多态,多态性是将就接口与实现进行分离,用形象的语言解释是实现以共同的方法,但因个体差异而采用不同的策略。

35.友元函数是可以直接访问类的私有成员的非成员函数,它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字
friend,友元不是成员函数,但是它可以访问类中的私有成员,友元的作用在于提高了程序的运行效率,但是它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成
员。

36.友元关系是不可以传递的,友元关系不能继承,友元关系不是互通的。

37.当一个类作为另一个类的友元时,这就意味着这个类的所有成员函数都是另一个类的友元函数。

38.整个类也可以是另一个类的友元,该友元也可以称做为友类。友类的每个成员函数都可以访问另一个类的所有成员。

39.一个普通函数可以是多个类的友元函数。

40.在类里声明一个普通函数,在前面加上friend修饰,那么这个函数就成了该类的友元,可以访问该类的一切成员。

41. 说明一个函数为一个类的友元函数则该函数可以访问此类的私有数据和方法。

42. C++使用虚拟继承(Virtual Inheritance),解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题,将共同基类设置为虚基类。这时从不同的

路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数名也只有一个映射。解决了二义性问题,也节省了内存,避免了数据不一致的问题。

43.static关键字至少有下列几个作用?

答:1>函数体内,static变量的作用范围为该函数体,其值在下次调用时仍维持上次的值,
2>在模块内的static全局变量可以被模块内所有函数访问,但不能被模块外其它函数访问。
3>在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内。
4>在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝。
5>在类中的static成员函数属于整个类所拥有,这个函数不接受this指针,因而只能访问类的static成员变量。

45.给出一个单链表,不知道节点N的值,怎样只遍历一次就可以求出中间节点?

答:设立两个指针,比如*P和*q,p每次移动两个位置,即p=p->next-next,q每次移动一个位置,即q=q->next.当p到达最后一个节点时,q就是中间节点了。

46.进程间的通信如何实现?

答:现在最常见的进程间的通信的方式有信号,信号量,消息队列,共享内存。

47.产生死锁的必要条件?

答:1>互斥条件:一个资源每

次只能被一个进程使用。2>请求与保持关系:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
3>不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺。4>循环等待条件:若干进程之间形成一种头尾相接循环等待资源关系。

48.请描述进程和线程的差别?

答:进程是程序的一次执行,线程可以理解为进程中执行的一段程序片段。

49.一个父类写了一个virtual 函数,如果子类覆盖它的函数不加virtual ,也能实现多态?
在子类的空间里,有没有父类的这个函数,或者父类的私有变量? (华为笔试题)

答案:只要基类在定义成员函数时已经声明了virtue关键字,在派生类实现的时候覆盖该函数时,virtue关键字可加可不加,不影响多态的实现。子类的空间里有父类的所有变量(static除外)。

50. 请讲一讲析构函数和虚函数的用法和作用。

答:析构函数是在对象生存期结束时自动调用的函数,用来释放在构造函数分配的内存。

虚函数是指被关键字virtual说明的函数,作用是使用C++语言的多态特性。

51.全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的?

答:一些变量在整个程序中都是可见的,它们称为全局变量。一些变量只能在一个函数中可知,称为局部变量。这就是他们的区别。在任何函数外面定义的变量就是全局变量,在

函数内部定义的变量是局部变量,这是它们在程序中的实现过程。操作系统和编译器是根据程序运行的内存区域知道他们的,程序的全局数据放在所分配内存的全局数据区,程序

的局部数据放在栈区。

52.程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中。

53.static全局变量与普通全局变量区别:static全局变量只初使化一次,防止在其他文件单元中被引用;

static局部变量和普通局部变量区别:static局部变量只被初始化一次,下一次依据上一次结果值;

static函数与普通函数区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。

54.写出程序删除链表中的所有接点
void del_all(node *head)
{ node *p;
while(head!=NULL)
{ p=head->next;
free(head);
head=p;
}
cout<<"释放空间成功!"<}

55.怎么判断链表中是否有环?
bool CircleInList(Link* pHead)
{
if(pHead = = NULL || pHead->next = = NULL)//无节点或只有一个节点并且无自环
return (false);
if(pHead->next = = pHead)//自环
return (true);
Link *pTemp1 = pHead; //step 1
Link *pTemp = pHead->next; //step 2
while(pTemp != pTemp1 && pTemp != NULL && pTemp->next != NULL)
{
pTemp1

= pTemp1->next; //增量1
pTemp = pTemp->next->next; //增量2
}
if(pTemp = = pTemp1)
return (true);
return (false);
}

56.编写一个 C 函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的。
char * search(char *cpSource, char ch)
{
char *cpTemp=NULL, *cpDest=NULL;
int iTemp, iCount=0;
while(*cpSource)
{
if(*cpSource == ch)
{
iTemp = 0;
cpTemp = cpSource;
while(*cpSource == ch)
++iTemp, ++cpSource;
if(iTemp > iCount)
iCount = iTemp, cpDest = cpTemp;
if(!*cpSource)
break;
}
++cpSource;
}
return cpDest;
}

57.请编写一个 C 函数,该函数在给定的内存区域搜索给定的字符,并返回该字符所在位置索引值。
int search(char *cpSource, int n, char ch)
{
int i;
for(i=0; ireturn i;
}

58. CPU在上电后,进入操作系统的main()之前必须做什么工作?
整个系统对开发环境以及各种变量的初始化,包括了变量空间的分配,cpu内部寄存器的初始化,总线的初始化等等,总之,只有等系统初始化完成以后,我们的c语言的main才能被识别和执行下来。

59.makefile文件的作用是什么?
Makefile 的作用是根据配置的情况,构造出需要编译的源文件列表,然后分别编译,并把目标代码链接到一起,最终形成 Linux 内核二进制文件。



60.什么叫做多态性? 在C++中是如何实现多态的?

解:多态是指同样的消息被不同类型的对象接收时导致完全不同的行为,是对类的特定成员函数的再抽象。C++支持的多态有多种类型,重载(包括函数重载和运算符重载)和虚函数

是其中主要的方式。

61. 什么叫做抽象类? 抽象类有何作用? 抽象类的派生类是否一定要给出纯虚函数的实现?
解:带有纯虚函数的类是抽象类。抽象类的主要作用是通过它为一个类族建立一个公共的接口,使它们能够更有效地发挥多态特性。抽象类声明了一组派生类共同操作接口的通用语义,而接口的完整实现,即纯虚函数的函数体,要由派生类自己给出。但抽象类的派生类并非一定要给出纯虚函数的实现,如果派生类没有给出纯虚函数的实现,
这个派生类仍然是一个抽象类。

62.虚函数主要用于实现多态用,基类的某个函数前加个Virtual 用来告诉编译系统,遇到这个处理过程时,要等到执行时再确定到底调用哪个类的处理过程;

每一个虚函数都会有一个入口地址,虚函数表保存所有虚函数的入口地址

63.main 函数执行以前,还会执行什么代码? (Autodesk)
答案:全局对象的构造函数会在main 函数之前执行。

64. Struct 和class 的区别 (Autodesk)
答案:struct 中成员变量和成员函数默认访问权限

是public,class 是private。

65. 描述一下C++的多态 (microsoft)
答案:C++的多态表现在两个部分,一个是静态连编下的函数重载,运算符重载;动态连编下的虚函数、纯虚函数(抽象类)

66.请说出const 与#define 相比优点
答案:
(1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。
(2) 有些集成化的调试工具可以对const 常量进行调试,但是不能对宏常量进行调试。

67.类成员函数的重载、覆盖和隐藏区别
答案:
成员函数被重载的特征:
(1)相同的范围(在同一个类中);
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无。

68.覆盖是指派生类函数覆盖基类函数,特征是:
(1)不同的范围(分别位于派生类与基类);
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有virtual 关键字。

69.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)

70.static有什么用途?(请至少说明两种)
1.限制变量的作用域
2.设置变量的存储域

71.引用与指针有什么区别?
1) 引用必须被初始化,指针不必。
2) 引用初始化以后不能被改变,指针可以改变所指的对象。
2) 不存在指向空值的引用,但是存在指向空值的指针。

72.用宏定义写出swap(x,y)
#define swap(x, y)
x = x + y;
y = x - y;
x = x - y;

73.C++中virtual与inline的含义分别是什么?
答:在基类成员函数的声明前加上virtual关键字,意味着将该成员函数声明为虚函数。

inline与函数的定义体放在一起,使该函数称为内联。inline是一种用于实现的关键字,而不是用于声明的关键字。

虚函数的特点;如果希望派生类能够重新定义基类的方法,则在基类中将该方法定义为虚方法,这样可以启用动态联编。

内联函数的特点;使用内联函数的目的是为了提高函数的运行效率。内联函数体的代码不能过长,因为内联函数省去调用函数的时间是以代码膨胀为代价的。内联函数不能包含循
环语句,因为执行循环语句要比调用函数的开销大。

74.编写my_strcpy函数,实现与库函数strcpy类似的功能,不能使用任何库函数;


答:char* my_strcpy(char* strdest, const char* strsrc)
{ assert((strdest != NULL) && (strsrc != NULL))
char* address = strdest;
while((*strdest++ = *strsrc++) != NULL)
return address;
}

75. 堆栈溢出一般是由什么原因导致的?
答 :1.没有回收垃圾资源
2.层次太深的递归调用

76.关键字volatile有什么含意 并给出三个不同的例子。
答:一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地 重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
1). 并行设备的硬件寄存器(如:状态寄存器)
2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3). 多线程应用中被几个任务共享的变量

77.宏定义是C++预处理命令之一,它是一个替换操作,不做计算和表达式求解,不占用内存和编译时间。

78.宏定义与操作符的区别:宏定义是替换,不做计算,也不做表达是求解,另外宏定义的替换在编译前进行,所以它不占用内存,宏的展开不占运行时间,只占编译时间,而操作符则占运行时间。

79.标准头文件在系统文件目录下查找,用户自定义文件会依次在用户目录的C++安装目录和系统文件中查找。

80.虚函数必须是基类的非静态成员函数,其访问权限可以是protected或public,纯虚函数是一种特殊的虚函数。

81.基类中不能对虚函数给出有意义的实现,而把它说明为纯虚函数,他的实现留给该基类的派生类去做,这就是纯虚函数的作用。

82.虚函数和纯虚函数的区别:纯虚函数是虚函数的一个子集,用于抽象类,含有纯虚函数的类就是抽象类,它不能生成对象。

83.纯虚函数是虚函数的一个子集。

84.纯虚函数是用来定义没有意义的实现,用于抽象类中需要交给派生类具体实现的方法。

85.数组指针是一个指针变量,它指向一个数组,而指针数组是一个只包含指针元素的数组,它的元素可以指向相同类型的不同对象。

86.函数指针就是指向函数的存储空间地址的指针,可以对函数指针进行赋值,并且通过函数指针来调用函数。

87.函数指针是一个指向函数的指针,它的本质是一个指针,而指针函数只是说明它是一个返回值为指针的函数,它的本质是一个函数。

88.this指针是一个隐含的指针,它是指向对象本身的,表示当前对象的地址。在调用成员函数时,编译器会隐含的插入一个参数,这个参数就是this指针,this指针指向当前对象

本身,表示当前

对象的地址。

89.当对一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员函数,每次成员函数存储数据成员时,由隐含作用this指针,而通常不去显示的使用this
指针来引用数据成员,同样也可以使用*this来标识调用该成员函数的对象。

90.派生类的成员函数可以直接访问基类中的protected和public成员,但不能访问基类中的private成员。通过派生类的对象只能访问基类的public成员。

91.覆盖在继承时派生类对于抽象类或者接口声明的方法的具体实现时使用。

92.复制构造函数又称为拷贝构造函数,是一种特殊的构造函数。它由编译器调用来完成一些基于同一类的其它对象的构建及初始化。拷贝构造函数要调用基类的拷贝构造函数和成
员函数。复制构造函数是由普通构造函数和赋值操作符共同实现的。

93.有三种情况会使用复制构造函数:1>一个对象以值传递的方式传入函数体。2>一个对象以值传递的方式从函数返回。3>一个对象需要通过另外一个对象进行初始化。

94.C++可以通过隐藏参数机制来支持参数个数不确定的函数。

95.在类声明的内部声明或定义的成员函数叫做内联函数。引入内联函数的目的是为了解决程序中函数调用的效率问题。一般来说,内联机制适用于优化小的只有几行的,而且经常被调用的函数。

96.(1)在类声明的内部声明,而在类声明外部定义叫做显示内联函数。

(2)在类声明的内部定义,叫做隐式内联函数。

97.内联函数的定义必须出现在内联函数第一次被调用之前。

98.公有成员可以在类外访问,私有成员只能被该类的成员函数访问。

99.保护成员只能被该类的成员函数访问或派生类的成员函数访问。

100.实例化的类存储在内存的堆内,而结构存储在栈内,结构的执行效率相对较高,结构没有析构函数,结构不可以继承,一般来说,结构用来处理较少的程序基础数据,而类用
来处理复杂的逻辑。

101.包含纯虚函数的类称为抽象类,抽象类把有共同属性或方法的对象抽象成一个类。

102.成员变量有哪些访问方式?

答:类的成员变量有三种访问方式。分别是:private,public和protected。private:只能由该类的方法访问,是私有变量,不能被该类的对象访问。

protected:可以被该类中的方法和其友元函数访问,但不能被该类的对象访问。

public:可以被该类中的方法和其友元函数访问,是公有变量,也可以由该类的对象访问。

103.静态数据成员被类的所有对象所共享,包括该类派生类的对象,即派生类对象与基类对象共享基类的静态数据成员。

104.类的静态函数只能

调用静态成员,因为静态函数不包含this指针。

105.静态成员可以独立访问,不需要创建类的实例,它也不能用实例来进行调用,类的静态方法只能访问类的静态成员。

106.多态技术允许将父类设置成和它的一个或更多的子对象相等。

107.多态有动态多态,静态多态,函数多态和宏多态等。编程者常说的多态指的是动态多态,它是基于继承机制和虚函数来实现的。

108.虚函数必须是基类的非静态成员函数,它的访问权限可以是protected或者public,函数如果在基类中声明为虚函数,它就一直为虚函数,派生类也不可以改变,派生类重定义

虚函数时,可以使用virtual保留字,但这不是必须的。

109.虚函数的作用是实现动态解析,也就是在程序的运行阶段动态地选择合适的成员函数,在定义了虚函数后,可以在基类的派生类中对虚函数重新定义,如果在派生类中没有对

虚函数重新定义,则它继承其基类的虚函数。

110.虚函数的作用是实现动态联编,当程序发现虚函数名前的关键字virtual后,会自动将其作为动态联编处理,即在程序运行时动态地选择合适的成员函数。

111.构造函数是类中一种特殊的方法,它用来在创建对象时初始化对象,即为对象成员变量赋初始值,构造函数没有返回值,所以它也没有返回类型,不能使用void修饰,另外构

造函数也不可以直接被调用,如果没有提供构造函数,则C++提供一个默认的构造函数,这个默认构造函数是无参构造函数,它仅负责创建对象。

112.析构函数与构造函数相反,当对象脱离其作用域时,系统会自动执行析构函数,析构函数往往用来做程序的"清理善后"工作,析构函数不带任何参数,也没有返回值,也不能使

用void修饰符,类只能有一个析构函数,不能重载,如果用户没有编写析构函数,C++也会自动提供一个默认的析构函数,这个析构函数不进行任何操作。

113.在类的对象首次被使用之前,构造函数将被应用在该对象上,构造函数和析构函数的调用是自动进行的,建立对象时会调用构造函数,而销毁对象时会调用析构函数。

114.全局对象的构造函数在main()函数之前调用,析构函数在main()函数执行结束后调用。不同全局变量的构造函数执行顺序与变量定义的顺序一致,而析构函数调用的顺序正好

相反。

115.自动局部变量的构造函数在程序执行到定义局部变量的语句时调用,在退出包含定义局部变量的语句的块时调用析构函数,不同局部变量的构造函数执行顺序与变量定义的顺

序一致。而析构函数调用的顺序正好相反。

116.静态局部变量的构造函数在程序第一次执行,

到定义静态局部变量的语句时调用,而析构函数在main()函数执行结束后调用,不同静态局部变量的构造函数执行顺序与变量定

义的顺序一致,而析构函数的调用顺序也是正好相反。

117.覆盖(override)是指派生类中如果存在重新定义的函数,其函数名,参数列,返回值类型必须同父类中相对应被覆盖的函数严格一致,覆盖函数和被覆盖函数只有函数体不同。

118.覆盖的特性为在不同的范围中(分别位于派生类与基类)的函数,函数名字相同,函数参数相同,基类函数必须有virtual关键字。

119.浅复制又称为浅拷贝,指的是在对象复制时,只是对对象中的数据成员进行简单的赋值,默认复制构造函数执行的也是浅复制。

120.深复制又称为深拷贝,对于对象中的动态成员,就不仅仅是简单的赋值了,而是重新动态分配空间。

121.类成员中的函数就是类的成员函数,特别的类成员函数有构造函数和析构函数。

122.在类中如果函数调用的结果不会访问或者修改任何对象数据成员,这样的成员声明为静态成员函数比较好。静态函数不能被其他文件所用,其它文件中可以定义相同名字的函
数。

123.静态函数是使用static修饰符修饰的函数,静态函数没有this指针,只能访问静态变量。

124.类的静态成员函数可以访问类的私有成员,但是类的静态成员函数只能直接访问类的静态私有成员,但是静态成员函数可以借助对象名和指针来访问类的非静态私有成员。

125.静态函数只能直接访问类的静态私有成员,静态函数不可以直接访问类的非静态私有成员,但是可以通过自定义的一些特殊方法比如宏替换访问类的非静态成员。

126.函数重载是指在相同的作用域中,具有相同名称而形参列表不同的多个函数。

127.拷贝构造函数有如下特点:

1>该函数名与类同名,因为它也是一种构造函数,并且该函数不指定返回类型。
2>该函数只有一个参数,并且是对某个对象的引用。
3>每个类都必须有一个复制构造函数。
4>如果程序员没有显示地定义一个复制构造函数,那么,C++编译器会自动生成一个缺省的拷贝构造函数。
5>复制构造函数的目的是建立一个新的对象实体,所以一定要保证新创建的对象有独立的内存空间,而不是与先前的对象共用。

128.基类的构造函数和析构函数不能被派生类继承。

129.纯虚函数永远不会被调用,它们主要用来统一管理子类对象。

130.设置虚函数需要注意以下5个方面的内容:

1>只有类的成员函数才能说明为虚函数。
2>静态成员函数不能为虚函数。
3>内联函数不能为虚函数。
4>构造函数不

能为虚函数。
5>析构函数可以为虚函数,而且通常声明为虚函数。

131.c++中如何阻止一个类被实例化?

答:C++中可以通过使用抽象类,或者将构造函数声明为private阻止一个类被实列。

132.#define有哪些缺陷?

答:1>它无法进行类型检查.2>由于优先级的不同,使用宏定义时,可能会存在副作用。3>无法单步调试。4>会导致代码膨胀。5>在C++中,使用宏无法操作类的私有数据成员。

133.头文件的作用有哪些?

答:头文件的作用主要表现在以下两个方面:1>通过头文件来调用库功能。2>头文件能加强类型安全检查。

134.使用指针有哪些好处?

答:1>可以动态的分配内存,2>进行多个相似变量的一般访问。3>为动态数据结构,尤其是树和链表,提供支持。4>遍历数组,如解析字符串。5>高效地按引用"复制"数组与结

构,特别是作为函数参数的时候,可以按照引用传递函数参数,提高开发效率。

135.内存泄露的概念?

答:所谓内存泄露是指由于疏忽和错误造成程序未能释放已经不再使用的内存的情况。

136.内存分配的形式有哪些?

答:1>由符号起始的区块(BSS段):通常是指用来存放程序中未初始化的全局数据和静态数据的一块内存区域,BSS段属于静态内存分配,程序结束后静态变量资源由系统自动释
放。2>数据段:数据段通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段也属于静态内存分配。

3>代码段:通常是指用来存放程序的执行代码(包括类成员函数和全局函数以及其他函数代码)的一块内存区域

4>堆:用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。

5>栈:栈用户存放程序临时创建的局部变量。栈由编译器自动分配释放,存放函数的参数值,局部变量的值等。

137.new/delete和malloc/free的区别是什么?

答:1>new能够自动计算需要分配的内存空间,而malloc需要手工计算字节数。2>new与delete直接带具体类型的指针,malloc与free返回void类型的指针。

3>new是类型安全的,而malloc不是。4>new一般由两步构成,分别是new操作和构造。5>malloc/free需要库文件stdlib.h支持,new/delete则不需要库文件支持。

138.什么情况下需要使用const关键字?

答:1>修饰一般常量。2>修饰常数组。3>修饰常对象。常对象是指对象常量。4>修饰常指针。5>修饰常引用。6>修饰函数的常参数。7>修饰函数的返回值。8>修饰类的成员函数
。9>在另一连接文件中引用const常量,使用方式有:extern const int i;

139.const有哪些作用?

答:1>定义const常量具有不可变性.2>进行类型检查,使编译器对处理内容

有更多的了解,消除了一些隐患。3>保护被修饰的东西,防止被意外的修改,增强了程序的健壮性。

4>为函数重载提供参考。5.节省空间,避免不必要的内存分配。

140.static变量有什么作用?

答:1>在函数体内,静态变量具有记忆功能,即一个被声明为静态的变量在这一函数被调用的过程中其值维持不变。2>在模块内(但在函数体外),它的作用域范围是有限制的,即
如果一个变量被声明为静态的,那么该变量可被模块内所有函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。







相关主题
文本预览
相关文档 最新文档