关于笔试题中C++的一些基础知识

1、先说说宏吧。好多公司的笔试题会在宏上出题,最常见的有以下三条语句。

 

    1.1、2个数中取最小值,注意括号。

 

            #define  MIN( A, B ) ( (A) <= (B) ? (A) : (B))

 

    1.2、这个题在选择题中经常出现,考察的是计算数的展开式

 

            #define  SQR(X) ( (x) * (x) )

 

    1.3、考察定义值的长度

 

            #define SEC_PER_YEAR( 60* 60 * 24 * 365) UL

 

    重点举例说明第二条:

 

    通常程序员粗心大意容易写成这样#define  SQR(X) ( x * x ) 那么下面用例子测试下这个结果。

 

    SQR(6+4);    这样的输入得出的结果是6+4×6+4 = 6+24+4 = 34 结果是错误的。所以这个地方是要注意的。

 

2、2个数字比较大小,求较大的值。要求不用判断语句(if , switch...)来实现。

 

     int iMax = ( (a + b) + abs(a-b) ) / 2;

 

3、交换2个值。

 

     3.1、书上的答案是这样,我也经常这样去写。

 

             int  iNum = a;

             a             = b;

             b             = iNum;

 

     3.2、资料上的最优答案是。

            a = a ^ b;

            b = a ^ b;

            a = a ^ b;

 

4、const的用法。

 

      4.1、修饰常量

 

      4.2、可以修饰函数参数、返回值、函数体、防止程序被意外修改。曾强程序的健壮性。

 

5、const 与 define 的区别。

 

     const 定义常量时有数据类型 define 没有数据类型

     const 可以进行调试              define 不可以

 

6、sizeof 与 strlen 的区别。

 

     sizeof是运算符                    strlen是库函数

     sizeof可以用类型做参数        strlen只能用char*做参数

     sizeof可以用函数做参数

     strlen计算字符的长度不是类型占内存的大小

 

 7、list删除时的操作

     for ( it = IntArray.begin(); it != IntArray.end() ; )

    {

             if ( ... )

             {

                     it = IntArray.erase(it);

             }

             else

             {

                     ++it;

             }
    }

 

8、拷贝构造函数与赋值函数的区别

 

     class Test;

 

     8.1、   Test  a;  

                a = b;

 

 

     8.2、   Test  a = b;

                Test  a(b);

 

     两者调用时间不同:

     8.1、a构造完成,已有资源,然后等号进行赋值。

     8.2、a此时还没有分配资源,赋值时不需要分配资源。

 

9、什么是“多态”?


     在基类函数前面添加virtual关键字后,在派生类中重新该函数,运行时将会根据对象的实际类型调用相应的函数。

 

10、什么是虚函数?


       用virtual关键字申明的函数叫虚函数。

 

11、析构函数为VIRTUAL是什么目的?


       这样做是为了当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用。

 

12、 多线程的方法?


      互斥对象、事件对象、关键代码段。


      互斥对象与事件对象都属于内核对象,利用内核对象实现线程同步时,速度较慢。但可以在多进程中的各个线程间进行同步。


      关键代码段速度较快,但在等待进入关键代码段时由于没有办法设置等待超时值。会造成线程的死锁。

 

13、WINDOWS内存原理?


       Windows为每一个进程分配了4GB的地址空间。2GB的地址空间,用于存代码、数据、堆栈。2GB用于共享系统使用。

 

14、实现strcmp函数.

 

      char*  strcmp(char* strDest, const char* strSrc)

     {

             assert( (strDest != NULL)  && (strSrc != NULL) );

 

             char* address = strDest;

 

             while(  (*strDest++ = *strSrc++) != '/0' )

 

                      NULL;

             return address;

     }

 

15、链表倒置

  node* ReverseList(node* head) 
  {  
          node* p = NULL;  
          node* q = head;


           while( head->next != 0) 
          {

                   p = head->next;

 

                   head->next = p->next;

 

                   p->next = q;

 

                   q = p;

           } 
           return q;

  }

16、实现String类

 class String

{

private:

  char* m_data;

public:

  String(const char* pStr);

  ~String();

  String(const String& other);

  String& operator=(const String& other);

}

 String::String(const char* pStr)

{

       if ( pStr == NULL )

       {

              m_data = new char[1];

              *m_data = '/0';

       }

       else

       {

              int iSize = strlen(pStr);

              m_data = new char[iSize+1];

              strcpy(m_data, str);

       }

}

String::~String(void)

{

     delete []m_data;
}

 

String::String(const String& other)

{

     int iSize = strlen(other.m_data);

     m_data = new char[iSize+1];

     strcpy(m_data, other.m_data);
}

 

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

{

     if ( this != &other )

     {

          int iSize = strlen(other.m_data);

          char* pCh = new char[iSize+1];

          delete [] m_data;

          m_data = pCh;

     }

     return *this;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章