问题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
2)strcpy能把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
}