C++⾯试题(基础)
(1)、const char *p
(2)、char const *p
(3)、char * const p
如果const位于星号的左侧,则const就是⽤来修饰指针所指向的变量,即指针指向为常量。
如果const位于星号的右侧,const就是修饰指针本⾝,即指针本⾝是常量。
2.析构函数和虚函数的⽤法和作⽤?
析构函数的作⽤是当对象⽣命期结束时释放对象所占⽤的资源。析构函数⽤法:析构函数是特殊的类成员函数
它的名字和类名相同,没有返回值,没有参数不能随意调⽤也没有重载。只是在类对象⽣命期结束时有系统⾃动调⽤。
虚函数⽤在继承中,当在派⽣类中需要重新定义基类的函数时需要在基类中将该函数声明为虚函数,作⽤为使程序⽀持动态联遍。
3.堆和栈的区别
栈(stack):由编译器⾃动分配释放,存放函数的参数值,局部变量的值等。其操作⽅式类似于数据结构中的栈。
堆:⼀般由程序员分配释放,若不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配⽅式类似。
4.头⽂件的作⽤是什么?
⼀、通过头⽂件来调⽤库功能。在很多场合,源代码不便(或不准)向⽤户公布,只要
向⽤户提供头⽂件和⼆进制的库即可。⽤户只需要按照头⽂件中的接⼝声明来调⽤
库功能,⽽不必关⼼接⼝怎么实现的。编译器会从库中提取出相应的代码。
⼆、头⽂件能加强类型安全检查。如果某个接⼝被实现或被使⽤时,其⽅式与头⽂件中
的声明不⼀致,编译器就会指出错误,这⼀简单的规则能⼤⼤减轻程序员调试、改
错的负担。
5.内存的分配⽅式有⼏种?
⼀、从静态存储区域分配。内存在程序编译的时候已经分配好,这块内存在程序的整个
运⾏期间都存在。如全局变量。
⼆、在栈上创建。在执⾏函数时,函数内局部变量的存储单元都可以在栈上创建,函数
执⾏结束时这些存储单元⾃动被释放。栈内存分配运算内置于处理器的指令集中,效率⾼,但是分配的内存容量有限。
三、从堆上分配,亦称动态内存分配。程序在运⾏的时候⽤malloc或new申请任意多
少的内存,程序员⾃⼰负责在何时⽤free或delete释放内存。动态内存的⽣存期由
我们决定,使⽤⾮常灵活。
6.BOOL、float、指针变量与“零值⽐较的if语句”。
BOOL:If(flag)或if(!flag)
Float:const float EPSINON = 0.00001;
If((x>=.EPSINON)&&(x<=EPSINON)) 说明:不可将浮点变量⽤“==”或“!=”与数字⽐较,应该设法转化成“>=”或“<=”此类形式。
指针*p:if(p==NULL) if(p!=NULL)
7.以下为Windows NT下的32位C++程序,请计算sizeof的值
Char str[] = “Hello”;
Char *p = str;
Int n = 10
请计算:
Sizeof(str) = 6
Sizeof(p) = 4
Sizeof(n)=2
Void Func(char str[100])
{
请计算:sizeof(str) = 4
}
Void *p = malloc(100)
请计算:sizeof(p) = 4
8.#include 和#include “filename.h”有什么区别
对于#include ,编译器从标准库路径开始搜索filename.h,对于#include “filename.h”,编译器从⽤户的⼯作路径中开始搜索filename.h
9.Const有什么⽤途
1.可以定义const常量
2.Const可以修饰函数的参数、返回值,甚⾄函数的定义体。被const修饰的东西都受
到强制保护,可以预防意外的变动,能提⾼程序的健壮性。
10.在C++程序中调⽤被C编译器编译后的函数,为什么要加extern “C”?
C++语⾔⽀持函数重载,C语⾔不⽀持函数重载。函数被C++编译后在库中的名字与C语⾔的不同。假设某个函数的原型为:void fee(int x,inty);
该函数被C编译器编译后在库中的名字为_foo,⽽C++编译器则会产⽣像_foo_int_int之类的名字。
C++提供了C连接交换指定符号extern “C”来解决名字匹配的问题。
11.内存思考题
Void GetMemory(char *p)
{
P = (char *)malloc(100);
}
Void Test(void)
{
Char *str = NULL;
GetMemory(str);
Strcpy(str,”hello world”);
Printf(str);
}//函数内的变量是独⽴于main的,对其改变不会影响main的变量
请问运⾏Test函数会有什么样的结果?
程序会崩溃,因为GetMemory并不能传递动态内存,Test函数中的str⼀直是NULL。
Strycpy(str,”hello world”);将使程序崩溃。
Char *GetMemory(void)
{
Char p[] = “hello world”;
Return p;
}
Void Test(void)
{
Char *str = NULL;
Str = GetMemory();
Printf(str);
}
请问Test函数会有什么样的结果?
可以是乱码。因为GetMemory返回的是指向“栈内存”的指针,该指针的地址不是NULL,但其原现的内容已经被清除,新内容不知。
Void GetMemory2(char **p,int num)
{
*P = (char *)malloc(num);
}
Void Test(void)
{
Char *str = NULL;
GetMemory(&str,100);
Strcpy(str,”hello”);
Printf(str);
}
请问运⾏Test函数会有什么样的结果?
1.能够输出hello
2.内存泄露
Void Test(void)
{
Char *str = (char *) malloc(100);
Strcpy(str,”hello”);
Free(str);
If(str != NULL)
{
Strcpy((str,”world”);
Printf(str);
}
}
请问运⾏Test函数会有什么样的结果?
篡改动态内存区的内容,后果难以预料,⾮常危险。
因为free(str);之后,str成为野指针,if(str!=NULL)语句不起作⽤。
12.头⽂件的作⽤是什么?
⼀、通过头⽂件来调⽤库功能。在很多场合,源代码不便(不准)向⽤户公布,只要向
⽤户提供头⽂件和⼆进制的库即可。⽤户只需要按照头⽂件中的接⼝声明来调⽤库
功能,⽽不必关⼼接⼝怎么实现的。编译器会从库中提取相应的代码。
字符串拷贝函数strcpy作用⼆、头⽂件能加强类型安全检查。如果某个接⼝被实现或被使⽤时,其⽅式与头⽂件中
的声明不⼀致,编译器就会指出错误,这⼀简单的规则能减轻程序员调试、改错的负担。
13.C++⾥⾯晃是不所有的动作都是main()引起的?如果不是,请举例
在运⾏C++程序时,通常从main()函数开始执⾏。因此如果没有main(),程序将不完整,编译器将指出未定义main()函数。
例外情况:如,在windows编程中,可以编写⼀个动态连接库(DLL)模块,这是其他windows程序可以使⽤的代码。由于DLL模块不是独⽴的程序,因此不需要main()。⽤于专⽤环境的程序――如机器⼈中的控制器芯⽚――可能不需要main(),但常规的独⽴程序都需要main().
14.引⽤与指针的区别:
1、引⽤总是指向某个对象,定义时没有初始化是错误的;
2、给引⽤赋值是修改引⽤所关联的对象的值,所关联的对象不变。
15.变量的声明和定义有什么区别
从编译原理上来说,声明是仅仅告诉编译器,有个某类型的变量会被使⽤,但是编译器并不会为它分配任何内存。⽽定义就是分配了内存。
16.Sizeof和strlen区别
1、Sizeof操作符的结果类型是size_t,它在头⽂件中typedef为unsigned int类型。该类
型保证能容纳实现所建⽴的最⼤对象的字节⼤⼩。
2、Sizeof是运算符,strlen是函数
3、Sizeof可以⽤类型做参数,strlen只能⽤char*做参数,且必须是以换⾏符“\0”结尾
的。
4、Strlen的结果要在运⾏的时候才能计算出来,是⽤来计算字符串的长度,不是类型占
内存的⼤⼩。
5、数组做sizeof的参数不退化,传递给strlen就退化为指针;
17.C中malloc与new的区别
1、new是C++中的操作符,malloc是C中的⼀个函数;
2、new不上是分配内存,⽽且会调⽤类的构造函数,同理delete会调⽤类析构函数,
⽽malloc则只分配内存,不会进⾏初始化类成员的⼯作,同样free也不会调⽤析构函数。
3、内存泄露对于malloc或者new都可以检查出来的,区别在于new可以指明那个⽂
件的那⼀⾏,⽽malloc没有这些信息。
4、New和malloc效率⽐较
New有三个字母,malloc有六个字母
New可以认为是malloc加构造函数的执⾏。
New出来的指针是直接带类型信息。
⽽malloc返回的都是void指针。
18.关键字static在C和C++中的区别
1、在C语⾔中,主要体现在静态全局变量、静态局部变量和静态函数。
2、在C++中,主要体现在静态数据成员和静态成员函数。
19.简述#define #endif 和#ifndef的作⽤
#define指⽰接受⼀个名字并定义该名字为预处理器变量;
#ifndef检测指定的预处理变量是否定义;
#endif预处理未定义
20.实现双向链表删除⼀个节点P,在节点P后插⼊⼀个节点,写出这两个函数;
答:双向链表删除⼀个节点P
Template void list::delnode(int p)
{
int k = 1;
listnode *ptr,*t;
ptr = first;
While(ptr->next!=NULL&&k!=p)
{
ptr = ptr->next;
k++;
}
t = ptr->next;
cout <<”你已经将数据项”<data<<”删除”<
ptr->next = ptr->next->next;
length--;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论