这里是面试题集锦,有自己亲身经历的,还有广大热爱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 < assert.h >
int strlen( const char * str ) // 输入参数const
{
assert( str != NULL ); // 断言字符串地址非0
int len = 0;
while ( ( * str ++ ) != ' \0 ' )
{
len ++ ;
}
return len;
}
2.求下面函数的返回值( 微软)
{
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++编译程序编译的?
答案:
cout << " c++ " ;
#else
cout << " c " ;
#endif
答案:
#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