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

1)什么时候使用模板,而不是重载?

解答:模板适用于函数的参数个数相同而类型不同,且函数体相同的情况;不满足这种情况时,就只能使用函数重载。

2C++不使用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);

}

5makefile文件的作用是什么?

解答:makefile文件保存了编译器和链接器的参数选项,还表述了所有源文件之间的关系(源代码文件需要的特定的包含文件、可执行文件要求包含的目标文件模块及库等)。创建程序make首先读取makefile文件,然后激活编译器、链接器、资源编译器和链接器以便产生最后的输出,最后输出并生成的通常是可执行文件。创建程序make利用内置的推理规则来激活编译器,以便通过对特定cpp文件的编译来产生特定的obj文件。

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