[普通]《ASCE1885的IT笔试面试题》---0000 0005

作者(passion) 阅读(1054次) 评论(0) 分类( 面试题)

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文件。


« 上一篇:wifi共享上网(至尊版wifi)
« 下一篇:drcom至尊版使用openwrt路由器拨号
在这里写下您精彩的评论
  • 微信

  • QQ

  • 支付宝

返回首页
返回首页 img
返回顶部~
返回顶部 img