网讯笔经

来源:互联网 发布:sop8单片机介绍 编辑:程序博客网 时间:2024/05/29 14:17
 

网讯笔试归来

昨天去网讯(杭州)笔试了,做了下笔试题,感觉题目都不难,但是自己做的的确不怎么样,估计是没机会去了,不过暂时还是先把几道自己还记得的题目,写出来,总结下,以做复习。

1、  要求自己实现 String 类,给出了 String 类的以下头文件类声明

class String

{

public:

       String(const char *m_char = NULL);

       String(const String & Str);

       String& operator = (const String &Str);

       ~String();

private:

       char * m_Data;

};

 

关于 String 类的笔试题,以前看林锐的随笔时听说他在微软面试时曾碰到那么一道题目,我自己也没有真的下笔去做过,平常都是拿来就用的,这次自己碰到,才知道会死得那么惨,反正编得不堪入目(我就不拿出来献丑了),下面是我回来后,自己重新写的答案。

String::String(const char* m_char)

{

       int m_nLength = strlen(m_char) + 1;

       if (m_Data != NULL)

       {

              delete [] m_Data;

              m_Data = NULL;

       }// 以上判断是否必要 ??

       m_Data = new char[m_nLength];

       memcpy(m_Data, m_char, m_nLength);

}

 

String::String(const String &Str)

{

       int m_nLength = strlen(Str.m_Data) + 1;// 以前真的不知道,原来对象的私有变量

// 在类的实现代码中也是可以访问的

       if (m_Data != NULL)

       {

              delete [] m_Data;

              m_Data = NULL;

       }// 以上判断是否必要 ??

       m_Data = new char[m_nLength];

       memcpy(m_Data, Str.m_Data, m_nLength);

}

 

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

{

       if(this == &Str)

              return *this;

 

       int m_nLength = strlen(Str.m_Data) + 1;

       if (m_Data != NULL)

       {

              delete [] m_Data;

              m_Data = NULL;

       }// 以上判断是否必要 ??

      

       m_Data = new char[m_nLength];

       memcpy(m_Data, Str.m_Data, m_nLength);

       return *this;

}

 

String::~String()

{

       if (m_Data != NULL)

       {

              delete [] m_Data;

              m_Data = NULL;

       }

}

 

2、  关于内存分配

这个题目很简单,就给了一个函数,然后问函数内的局部变量存放在哪里,我也不知道为什么当时会选择 heap( ) ,下面再把几个概念罗列出来:

1.            堆区( heap ):由程序员申请分配和释放,属动态内存分配方式,若程序员不释放,程序结束时可能会由 OS 回收。不过这个内存分配很容易引起问题,如果申请的内存不释放就会造成内存泄漏;如果释放的不是所要释放的内存,则轻者引起程序运行结果出错,重者系统崩溃。

2.            栈区( stack ):编译器自动分配释放,存放函数的形参值、局部变量的值,也是属于动态内存分配方式,它由系统分配,所以执行效率也高,不过自由度小,声明时就得决定其具体大小。

3.            全局区(静态区)( static ):全局变量和静态变量的存储是放在一块的,而且初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放,所以也不会造成内存问题。

除了以上的变量外,还有两类存放位置,文字常量区和程序代码区,两者都是由系统分配和释放,且文字常量区和前面三区合成为程序数据区,与程序代码区相对应。

3、  关于类继承的构造和析构函数

class Base

{

public:

       Base(){cout<< "Base" <<endl;};

       ~Base(){cout<<"~Base"<<endl;};

protected:

private:

};

 

class First:public Base

{

public:

       First(){cout << "First" << endl;};

       ~First(){cout << "~First" <<endl;};

};

 

int main()

{

       Base *a = new First;

       delete a;

}

问程序的输出会是什么?

结果很简单,也就是 Base

                               First

                   ~Base

其它还有一个关于 & 的题目,把我搞的云里雾里的,还要再看些东西才知道怎么来解释。

原创粉丝点击