一、不用第三个变量,实现交换两个变量的值。函数原型: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个函数:
参考答案:
三、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< cout< cout< cout< cout< cout< cout< cout< cout< cout< cout< return 0;
}
参考答案:
4,11,100,400,4,3,4,4,4,6,8。
【解析】:指针的大小是一个定值,就是4个字节。所以sizeof(一个指针)返回的值是4。
因此cout< cout< cout< cout< 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!” ) ) ;