设为首页 加入收藏

TOP

C++问题(一)
2014-11-24 01:25:59 来源: 作者: 【 】 浏览:33
Tags:问题

1. c++中指针的优缺点有哪些
答案:优点:
(1)提高程序的编译效率和执行速度。
(2)通过指针可使用主调函数和被调函数之间共享变量或数据结构,便于实现双向数据通讯。
(3)可以实现动态的存储分配。
(4)便于表示各种数据结构,编写高质量的程序。
缺点:
(1)使用未正确初始化的指针导致程序崩溃
(2)引用已释放的指针
(3)通过指针访问不该访问的内存
2. 宏和函数的区别
答案:(1)宏做的是简单的字符串替换(注意是字符串的替换,不是其他类型参数的替换),而函数的参数的传递,参数是有数据类型的,可以是各种各样的类型。
(2)宏的参数替换是不经计算而直接处理的,而函数调用是将实参的值传递给形参,是计算得来的。
(3)宏在编译之前进行,即先用宏体替换宏名,然后再编译的,而函数是编译之后,在执行时,才调用的。因此,宏占用的是编译的时间,而函数占用的是执行时的时间。
(4)宏的参数是不占内存空间的,因为只是做字符串的替换,而函数调用时的参数传递则是具体变量之间的信息传递,形参作为函数的局部变量,是占用内存的。
(5)函数的调用是需要付出一定的时空开销的,因为系统在调用函数时,要保留现场,然后转入被调用函数去执行,调用完,再返回主调函数,此时再恢复现场,这些操作,显然在宏中是没有的。
3. 宏定义是什么时期处理的(预处理?编译期?)
答案:预处理
4. 不同情况下类对象的大小(有数据成员,无数据成员,有虚函数等)
答案:(1)无任何数据成员和虚函数的类大小为1
(2)每个虚函数大小为4
(3)成员变量大小要考虑内存对齐,通常是4字节对齐
5. STL中vector使用的时候要注意什么
答案:(1) 如果元素是对象的指针,当该vector超出其作用域或调用erase删除元素时,那么元素本身在该vector中会被删除,但对象本身并没有得到销毁。在这种情况下,销毁的工作要由程序员自己来做。
(2) 用erase删除vector容器中的元素对象时,元素对象的析构函数会被多次调用。
6. 字符转整型数的函数是什么? 是怎样实现的?
答案:
strtol、strtoul。
#define TOLOWER(x) ((x) | 0×20)
#define isxdigit(c) ((’0′ <= (c) && (c) <= ’9′) \
|| (‘a’ <= (c) && (c) <= ‘f’) \
|| (‘A’ <= (c) && (c) <= ‘F’))


#define isdigit(c) (’0′ <= (c) && (c) <= ’9′)


unsigned long strtoul(const char *cp,char **endp,unsigned int base)
{
unsigned long result = 0,value;


if (!base) {
base = 10;
if (*cp == ’0′) {
base = 8;
cp++;
if ((TOLOWER(*cp) == ‘x’) && isxdigit(cp[1])) {
cp++;
base = 16;
}
}
} else if (base == 16) {
if (cp[0] == ’0′ && TOLOWER(cp[1]) == ‘x’)
cp += 2;
}
while (isxdigit(*cp) &&
(value = isdigit(*cp) *cp-’0′ : TOLOWER(*cp)-’a'+10) < base) {
result = result*base + value;
cp++;
}
if (endp)
*endp = (char *)cp;
return result;
}
long strtol(const char *cp,char **endp,unsigned int base)
{
if(*cp==’-')
return -strtoul(cp+1,endp,base);
return strtoul(cp,endp,base);
}
INT32S atoi(const INT8S *nptr)//
{
return strtol(nptr, ( INT8S **)NULL, 10);
}
7. 虚拟类和最终类能否派生出对象
答案:虚拟类可以派生对象
8. 你怎么理解虚拟类?虚拟类可以实例化一个对象吗?为什么?它的作用和其他类的区别
答案:虚拟类可以派生对象,纯虚类不可以实例化对象。因为纯虚类存在未定义的函数,只是个概念,不可真实存在。虚拟类用做多态,纯虚类做接口。
9. 内联函数怎么实现的,什么时期处理的,优缺点
答案:在程序编译时,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体来进行替换。
优点:不会产生函数调用的开销
缺点:增加目标程序的代码量,即增加空间开销
10. 内存分配的几种方法与特点
答案:栈:就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。
堆:就是那些由new分配的内存块,
自由存储区:就是那些由malloc等分配的内存块
全局/静态存储区:全局变量和静态变量被分配到同一块内存中
常量存储区:这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改
11. 静态变量、全局变量、局部变量分别存储于什么位置
答案:静态变量:全局/静态存储区
全局变量:全局/静态存储区
局部变量:栈
12. static全局变量与普通全局变量的区别?static局部变量与普通变量的区别?static函数与普通函数的区别
答案:
static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,并且在其他文件单元中不可被引用
static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,值在程序生存期有效
static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
13. 虚函数的机制,怎么理解。与其它函数的区别,如重载
答案:虚函数在c++中的实现机制就是用虚表和虚指针
普通函数编译时绑定,虚函数运行时绑定
14. 写一个复制字符串的方法,要求只能使用基本类型,用char数组表示字符串
答案:
char * strcpy(char * strDest,const char * strSrc)
{
if ((strDest==NULL)||(strsrc=”/=NULL”)) //[1]
throw “Invalid argument(s)”; //[2]
char * strDestCopy=strDest; //[3]
while ((*strDest++=*strSrc++)!=’\0′); //[4]
return strDestCopy;
}
[1]
(A)不检查指针的有效性,说明答题者不注重代码的健壮性。
(B)检查指针的有效性时使用((!strDest)||(!strSrc))或(!(strDest&&strSrc)),说明答题者对C语言中类型的隐式转换没有深刻认识。在本例中char *转换为bool即是类型隐式转换,这种功能虽然灵活,但更多的是导致出错概率增大和维护成本升高。所以C++专门增加了bool、true、false三个关键字以提供更安全的条件表达式。
(C)检查指针的有效性时使用((strDest==0)||(strsrc=”/=0″)),说明答题者不知道使用常量的好处。直接使用字面常量(如本例中的0)会减少程序的可维护性。0虽然简单,但程序中可能出现很多处对指针的检查,万一出现笔误,编译器不能发现,生成的程序内含逻辑错误,很难排除。而使用NULL代替0,如果出现拼写错误,编译器就会检查出来。
[2]
(A)return new string(“Invalid argument(s)”);,说明答题者根本不知道返回值的用途,并且他对内存泄漏也没有警惕心。从函数中

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇灵川科技面试题C# .NET方面的 下一篇紫光华宇面试题(.Net)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: