微信

使用微信服务,更方便

职友集>程序员面试题 > 程序员面试题

程序员面试题

2015-06-27 06:30:01 阅读( 122 )

1621人 收藏本页

标签:程序员面试题

一、不用第三个变量,实现交换两个变量的值。函数原型:void foo(int a,int b);
参考答案:
void foo(int a,int b)
{
a^=b;
b^=a;
a^=b;
}

二、已知类String的原型为:
class String
{
public:
String(const char *str = NULL);// 普通构造函数
String(const String &other); // 拷贝构造函数
~ String(void); // 析构函数
String & operate =(const String &other);// 赋值函数
private:
char *m_data;// 用于保存字符串
};
请编写String的上述4个函数:
参考答案:

String::String(const char*str) //普通构造函数

{

if(str==NULL)

{

m_data = new char[1]; // 对空字符串自动申请存放结束标志’\0′的

*m_data = ‘\0′;

}

else

{

intlength = strlen(str);

m_data = new char[length+1]; // 若能加 NULL 判断则更好

strcpy(m_data, str);

}

}

// String的析构函数

String::~String(void)

{

delete[] m_data; // 或delete m_data;

}

//拷贝构造函数

String::String(constString &other) // 得分点:输入参数为const型

{

intlength = strlen(other.m_data);

m_data = new char[length+1]; //加分点:对m_data加NULL 判断

strcpy(m_data, other.m_data);

}

//赋值函数

String & String::operate =(constString &other) // 得分点:输入参数为const型

{

if(this== &other) //得分点:检查自赋值

return *this;

delete[] m_data; //得分点:释放原有的内存资源

intlength = strlen( other.m_data );

m_data = new char[length+1]; //加分点:对m_data加NULL 判断

strcpy( m_data, other.m_data );

return *this; //得分点:返回本对象的引用

}




































三、C/C++中的“ifndef/define/endif”作用是什么?
参考答案:为了防止头文件重复包含而导致的重复定义。

四、sizeof运算符问题,下面代码输出的结果是什么?
#include
#include
#include
using namespace std;

struct{
shrot a1;
short a2;
short a3;
}A;

struct{
long a1;
short a2;
}B;
int main()
{
char *ss1 = “0123456789″;
char ss2[] = “0123456789″;
char ss3[100]=”0123456789″;
int ss4[100];
char q1[] = “abc”;
char q2[] = “a\n”;
char *q3 = “a\n”;
char *str1 = (char *)malloc(100);
void *str2 = (void *)malloc(100);
cout<<sizeof(ss1)<<endl;
cout<<sizeof(ss2)<<endl;
cout<<sizeof(ss3)<<endl;
cout<<sizeof(ss4)<<endl;
cout<<sizeof(q1)<<endl;
cout<<sizeof(q2)<<endl;
cout<<sizeof(q3)<<endl;
cout<<sizeof(str1)<<endl;
cout<<sizeof(str2)<<endl;
cout<<sizeof(A)<<endl;
cout<<sizeof(B)<<endl;
return 0;
}
参考答案:
4,11,100,400,4,3,4,4,4,6,8。
【解析】:指针的大小是一个定值,就是4个字节。所以sizeof(一个指针)返回的值是4。
因此cout<<sizeof(ss1)<<endl;输出的是4。
cout<<sizeof(q3)<<endl;输出的是4。
cout<<sizeof(str1)<<endl;输出的是4。
cout<<sizeof(str2)<<endl;输出的是4。
ss2是一个字符数组,这个数组最初未设定大小,由具体填充值来定,填充值是“0123456789”,1个字符占一个字节,10个就是10个字节,再加上隐含的’\0′,所以是11个字节。
ss3也是个字符数组,这个数组开始的时候就分配了100个字符空间,所以他的大小一共是100字节。
ss4是一个整形数组,这个数组开始的时候就分配了100个整形空间,每个整形占4个字节,所以是400字节。
字符数组q1和q2与ss2相似,只是’\n’是一个转义字符,只算作一个字符,所以q1的大小是4,q2的大小是3。
先讲一下怎么计算struct的长度(先罗嗦一下):
为了方便对结构体内元素的访问和管理,当结构体内的元素的长度都小于处理器的位数的时候,便以结构体里面最长的数据元素为对齐单位,也就是说,结构 体的长度一定是最长的数据元素的整数倍。如果结构体中存在长度大于处理器位数打的元素,那么就以处理器的位数为对齐单位。但是结构体中类型相同的连续元素 将在连续的空间内,和数组一样。
结构体A中有三个short类型变量,各自以2字节对齐,则a1,a2,a3都取2字节,所以sizeof(A)的返回值是6
结构体B中,a1是long型,为4字节,a1取4字节对齐,a2是short型,为2字节,a2取2字节对齐,则结构体的大小是6字节,但是6不是4的整数倍,则补两个空位,增加到8字节。所以最后sizeof(B)返回值是8。

五、已知strcpy函数的原型是char *strcpy( char *strDest, char *strSrc ) ;其中strDest是目的字符串,strSrc是源字符串,完成如下两题:
(1)不调用C/C++的字符串函数,编写函数strcpy。
(2)strcpy能把strSrc的内容复制到strDest,为什么还要char *类型的返回值?
参考答案:
char *srtcpy( char *strDest, char *strSrc)
{
assert( strDest != NULL && strSrc != NULL);
// if( strDest == NULL || strSrc == NULL) return NULL;
char *address = strDest;
while( (*strDest++ = *strSrc++) != ‘\0′) ;
return address;
}

为了实现链式表达式,例如:
int length = strlen( strcpy( strDest, “Hello,world!” ) ) ;

来自IT公司面试手册

下一篇:内存泄露和内存溢出是什么?他们之间的区别是什么?

上一篇:重载(overload)和重写(overried,也叫做“覆盖”)的区别?

亲~ 如果您有更好的答案 可在评论区发表您独到的见解。

您想查看更多的信息: 面试题