1)什么时候使用模板,而不是重载?
解答:模板适用于函数的参数个数相同而类型不同,且函数体相同的情况;不满足这种情况时,就只能使用函数重载。
2)C++不使用sizeof,判断机器是16位还是32位?
解答:如果可以使用sizeof,那是再简单不过了:
#include <iostream>
int main()
{
std::cout<<(sizeof(int*)==4 ? "32位机器" : "16位机器")<<std::endl;
system("pause");
return 0;
}
当然,题目禁止我们使用sizeof,但我们可以通过整数的表示范围来判断,因为16位系统中整数int最大为65535,因此代码如下:
#include <iostream>
int main()
{
unsigned int data = ~0; //取反
if(data > 65536)
{
std::cout<<"32位机器"<<std::endl;
}
else
{
std::cout<<"16位机器"<<std::endl;
}
system("pause");
return 0;
}
3)一般析构函数都要写成虚函数,请问为什么要这样做,编程给出实例说明这样做的作用?
解答:先看实例代码:
#include <iostream>
class ASCEBase
{
public:
ASCEBase(){};
virtual ~ASCEBase(){std::cout<<"ASCEBase destructor!"<<std::endl;};
virtual void Broadcast()
{
std::cout<<"See you in another life ASCEBase!"<<std::endl;
}
};
class ASCEDerive : public ASCEBase
{
public:
ASCEDerive(){};
~ASCEDerive(){std::cout<<"ASCEDerive destructor!"<<std::endl;}
void Broadcast()
{
std::cout<<"See you in another life ASCEDerive!"<<std::endl;
}
};
int main()
{
ASCEBase *pAsce = new ASCEDerive;
pAsce->Broadcast();
delete pAsce;
system("pause");
return 0;
}
程序运行后输出是:
See you in another life ASCEDerive!
ASCEDerive destructor!
ASCEBase destructor!
这样的程序是正确的,但是,如果将基类ASCEBase析构函数前的virtual去掉,则输出结果是:
See you in another life ASCEDerive!
ASCEBase destructor!
即,派生类ASCEDerive的析构函数并没有被调用!一般情况下类的析构函数中是释放内存资源的代码,这样一来,就很可能造成内存泄漏。
因此,一般将析构函数写出虚函数,是为了当这个类用作基类时,用这个基类指针删除它的派生类的对象时,派生类的析构函数能够被调用到。当然,当一个类不打算作为基类使用时,我们一般不将其声明为虚函数,因为当类里面存在虚函数时,编译器会自动给这个类添加一个虚函数表,里面存放指向虚函数的指针,这无疑会增大类的存储空间。
4)编写一个函数,把一个char字符串循环右移n位。例如原来的字符串是”abcdefg”,如果n=2,移位后应该是”fgabcde”,函数头如下:
//pstr是指向以'/0'结尾的字符串的指针
//steps是要求移动的n
void LoopMove(char *pstr, int steps);
解答:
//方法一,使用strcpy
void LoopMove(char *pstr, int steps)
{
int n = strlen(pstr) - steps;
char tmp[MAX_LENGTH];
strcpy(tmp, pstr+n);
strcpy(tmp + steps, pstr);
*(tmp + strlen(pstr)) = '/0'; //截断
strcpy(pstr, tmp);
}
//方法二,使用memcpy
void LoopMove(char *pstr, int steps)
{
int n = strlen(pstr) - steps;
char tmp[MAX_LENGTH];
memcpy(tmp, pstr+n, steps);
memcpy(pstr+steps, pstr, n);
memcpy(pstr, tmp, steps);
}
5)makefile文件的作用是什么?
解答:makefile文件保存了编译器和链接器的参数选项,还表述了所有源文件之间的关系(源代码文件需要的特定的包含文件、可执行文件要求包含的目标文件模块及库等)。创建程序make首先读取makefile文件,然后激活编译器、链接器、资源编译器和链接器以便产生最后的输出,最后输出并生成的通常是可执行文件。创建程序make利用内置的推理规则来激活编译器,以便通过对特定cpp文件的编译来产生特定的obj文件。