c++面试题集锦

这里是面试题集锦,有自己亲身经历的,还有广大热爱c++同胞的知识分享。

1. 已知strcpy的函数原型:char *strcpy(char *strDest, const char *strSrc)其中strDest 是目的字符串,strSrc 是源字符串。不调用C++/C 的字符串库函数,请编写函数 strcpy。

答案:

/*
编写strcpy函数(10分)
已知strcpy函数的原型是
char *strcpy(char *strDest, const char *strSrc);
其中strDest是目的字符串,strSrc是源字符串。
(1)不调用C++/C的字符串库函数,请编写函数 strcpy
(2)strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值?
答:为了 实现链式表达式。 // 2分
例如 int length = strlen( strcpy( strDest, “hello world”) );
*/

#include
< assert.h >
#include
< stdio.h >
char * strcpy( char * strDest, const char * strSrc)
{
assert((strDest
!= NULL) && (strSrc != NULL)); // 2分
char * address = strDest;    // 2分
while ( ( * strDest ++ = * strSrc ++ ) != ' \0 ' )        // 2分
NULL;
return address ;     // 2分
}
另外 strlen函数如下:
#include < stdio.h >
#include
< assert.h >
int strlen( const char * str ) // 输入参数const
{
assert( str
!= NULL ); // 断言字符串地址非0
int len = 0;
while ( ( * str ++ ) != ' \0 ' )
{
len
++ ;
}
return len;
}

2.求下面函数的返回值( 微软)

int func(x)
{
int countx = 0 ;
while (x)
{
countx
++ ;
x
= x & (x - 1 );
}
return countx;
}

假定x = 9999。 答案:8

思路:将x转化为2进制,看含有的1的个数。

3. .h头文件中的ifndef/define/endif 的作用?

答:防止该头文件被重复引用。

4. #include<file.h> 与#include "file.h"的区别?

答:前者是从Standard Library的路径寻找和引用file.h,而后者是从当前工作路径搜寻并引用file.h。

5. 多态的作用?

主要是两个:

1. 隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用;

2. 接口重用:为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性时的正确调用

6. #define DOUBLE(x) x+x ,i = 5*DOUBLE(5); i 是多少?
答案:i 为30。(注意直接展开就是了) 5 * 5 + 5
7. C++是不是类型安全的?
答案:不是。两个不同类型的指针之间可以强制转换(用reinterpret cast)。C#是类型安全的。

8. 描述内存分配方式以及它们的区别?
1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量
2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集。
3) 从堆上分配亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意多少的内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存期由程序员决定,使用非常灵活,但问题也最多。

4) 代码区。

9.请说出const与#define 相比,有何优点?
1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型 安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。
2) 有些集成化的调试工具可以对const 常量进行调试,但是不能对宏常量进行调试。
10. 如何判断一段程序是由C 编译程序还是由C++编译程序编译的?
答案:
#ifdef __cplusplus
  cout
<< " c++ " ;
#else
  cout
<< " c " ;
#endif
11.文件中有一组整数,要求排序后输出到另一个文件中
答案:
复制代码
#include < iostream >
#include
< fstream >
using namespace std;

void Order(vector < int >& data) // bubble sort
{
int count = data.size() ;
int tag = false ; // 设置是否需要继续冒泡的标志位
for ( int i = 0 ; i < count ; i ++ )
{
for ( int j = 0 ; j < count - i - 1 ; j ++ )
{
if ( data[j] > data[j + 1 ])
{
tag
= true ;
int temp = data[j] ;
data[j]
= data[j + 1 ] ;
data[j
+ 1 ] = temp ;
}
}
if ( ! tag )
break ;
}
}

void main( void )
{
vector
< int > data;
ifstream
in ( " c:\\data.txt " );
if ( ! in )
{
cout
<< " file error! " ;
exit(
1 );
}
int temp;
while ( ! in .eof())
{
in >> temp;
data.push_back(temp);
}
in .close(); // 关闭输入文件流
Order(data);
ofstream
out ( " c:\\result.txt " );
if ( ! out )
{
cout
<< " file error! " ;
exit(
1 );
}
for ( i = 0 ; i < data.size() ; i ++ )
out << data[i] << " " ;
out .close(); // 关闭输出文件流
}
12.判读是否含有中文
bool IncludeChinese(char* str)
{
    bool bHas = false;
    char c;
    while (c=*str++)
    {
        //如果字符高位为1且下一字符高位也是1则有中文字符
        if ((c&0x80)&&(*str &0x80))
        {
            bHas = true;
            break;
        }
    }
    return bHas;
}
13.#define double(x) x+x; int i = 5 * double(5);计算i值
答:i=5*5+5=25+5=30



















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值