《ASCE1885的IT 笔试面试题》-- 0000 0000

问题1:写出BOOL flag与“零值”比较的if语句

解答:if(flag)或者if(!flag)

如下写法均属不良风格:

if(flag == TRUE)

if(flag == 1)

if(flag==FALSE)

if(flag==0)

问题2:写出char *p与“零值”比较的if语句

解答:if(p == NULL)或者if(p != NULL)

如下写法均属不良风格:

if(p==0)

if(p!=0)

if(p)

if(!p)

问题3:在C++程序中调用被C编译器编译后的函数,为什么要加extern C

解答:C++语言支持函数重载,C语言不支持函数重载。函数被C++编译后在库中的名字与C语言的不同。假设某个函数原型是:void ace(int x, int y);

该函数被C编译器编译后在库中的名字是_ace,而C++编译器则会产生像_ace_int_int之类的名字。

因此,C++提供了C连接交换指定符号extern C”来解决名字匹配问题。

问题4:已知strcpy函数原型是

char *strcpy(char *strDest, const char *strSrc);

其中strDest是目的字符串,strSrc是源字符串。

1)不调用C/C++的字符串库函数,请编写函数strcpy

2strcpy能把strSrc的内容复制到strDest,为什么还要char*类型的返回值

解答:

1

char *strcpy(char *strDest, const char *strSrc)

{

assert((strDest != NULL) && (strSrc != NULL));

char *address = strDest;

while((*strDest++ = *strSrc++) != '/0')

{

}

return address;

}

2)为了实现链式表达式,例如:

int length = strlen(strcpy(strDest, "SEE YOU IN ANOTHER LIFE BROTHER!"));

问题5:已知类String的原型为:

class String

{

public:

String(const char *str = NULL); //普通构造函数

String(const String &other); //拷贝构造函数

~String(void); //析构函数

String & operator=(const String &other); //赋值函数

private:

char *m_data; //用于保存字符串

};

请编写String的上述4个函数

解答:

//普通构造函数

String::String(const char *str)

{

if(str == NULL)

{

m_data = new char[1]; //若能加new是否成功的判断则更好

m_data = '/0';

}

else

{

int length = strlen(str);

m_data = new char[length + 1];

strcpy(m_data, str);

}

}

//拷贝构造函数

String::String(const String &other)

{

int length = strlen(other.m_data);

m_data = new char[length + 1];

strcpy(m_data, other.m_data);

}

//赋值函数

String & String::operator=(const String &other)

{

//检查自赋值

if(this == other)

return *this;

//释放原有的内存资源

delete[] m_data;

//分配新的内存资源,并复制内容

int length = strlen(other.m_data);

m_data = new char[length + 1];

strcpy(m_data, other.m_data);

//返回本对象的引用

return *this;

}

//析构函数

String::~String(void)

{

delete[] m_data;

//由于m_data是内部数据类型,也可以写出delete m_data

}

你可能感兴趣的:(面试题)