一些面試題目zz

來源:互聯網
上載者:User
1。在C++中有沒有純虛建構函式?
2。在c++的一個類中聲明一個static成員變數有沒有用?
3。在C++的一個類中聲明一個靜態成員函數有沒有用?
4。如何?一個非阻塞的socket?
5。setsockopt, ioctl都可以對socket的屬性進行設定,他們有什麼不同?
6。解釋一下進程和線程的區別?
7。解釋一下多播(組播)和廣播的含義?
8。多播採用的協議是什嗎?
9。在c++中純虛解構函式的作用是什嗎?請舉例說明。
10。編程,請實現一個c語言中類似atoi的函數功能(輸入可能包含非數字和空格)

1。在C++中有沒有純虛建構函式?
2。在c++的一個類中聲明一個static成員變數有沒有用?
3。在C++的一個類中聲明一個靜態成員函數有沒有用?
4。如何?一個非阻塞的socket?
5。setsockopt, ioctl都可以對socket的屬性進行設定,他們有什麼不同?
6。解釋一下進程和線程的區別?
7。解釋一下多播(組播)和廣播的含義?
8。多播採用的協議是什嗎?
9。在c++中純虛解構函式的作用是什嗎?請舉例說明。
10。編程,請實現一個c語言中類似atoi的函數功能(輸入可能包含非數字和空格)

我的答案

1。在c++中沒有不支援虛建構函式,當然也不支援純虛建構函式。
2。有用,static成員變數不屬於某個對象,而屬於類。比如一個類中要用圓周率,你可以把它聲明為static
3. 有用,可以對static成員變數訪問
4。使用setsockopt或ioctl
5. ioctl改變的是系統核心的行為,setsockopt改變的是應用socket的行為(沒有找到相應的資料)
6. 一個進程被建立是對父進程所有資源的複製,可獨立運行。 線程本身並不複製資源,它與其他線程共用父進程的資源,不能獨立運行,如果一個線程出問題會影響其他線程
7。多播是向一個D類地址發送資料如224.1.1.1, 用戶端如想接收該資料包,必須利用IGMP協議加入該組,通知路由器。廣播是向一個子網段發送資料包,如192.168.3.255,在該段的主機直接可接受到資料,使用的協議隨網路的不同而不同
8.多播採用IGMP,網路組管理協議
9. 能釋放子類的資源。
10。見樓上

-------------------------------
試著回答:
1。在C++中有沒有純虛建構函式?
9。在c++中純虛解構函式的作用是什嗎?請舉例說明。
Yarco: 感覺假如是依照OO的想法,純虛解構函式的存在也未嘗不可. 不過昨晚gcc編譯未通過說明,c++不支援純虛建構函式. 因為看到過虛解構函式,所以知道虛解構函式是為了能使子類釋放資源.比如在一個函數中:
void use(baseCls* p)
{
delete p;
}
我可以傳遞一個之向子類執行個體的指標,然後正常釋放它的資源.

2。在c++的一個類中聲明一個static成員變數有沒有用?
3。在C++的一個類中聲明一個靜態成員函數有沒有用?
Yarco: 有用. 在smalltalk中,它們的概念分別是類變數和類(成員)函數,顯然是對整個類負責.有用的地方比如:
統計類/子類的執行個體化對象個數,獲得某個執行個體化對象(cls& obj = cls::getInst()

4。如何?一個非阻塞的socket?
5。setsockopt, ioctl都可以對socket的屬性進行設定,他們有什麼不同?
6。解釋一下進程和線程的區別?
7。解釋一下多播(組播)和廣播的含義?
8。多播採用的協議是什嗎?
Yarco:這部分不屬於c++.更象是linux c socket編程.查書查書.不過題目8似乎不夠嚴謹.因為協議本身是一層套一層的.要回答出全部的協議似乎不夠理智.

10。編程,請實現一個c語言中類似atoi的函數功能(輸入可能包含非數字和空格)
Yarco:寫步驟吧.
int atoi(const char*);

//char* p指向字串首, int total = 0, int flag = 1;
//for迴圈跳過空格
//判斷+/-符號, + 跳過, - 設定flag = -1;
//while判斷 *p>='0' && *p<='9'
// 迴圈 total =  total*10 + *p - '0';
//返回total* flag;

10.
/*10。atoi的實現,把字串轉換為數字*/

#include <stdio.h>
#include <stdlib.h>
#include <strings.h>

int t_atoi(const char *str)
{
   char *s1,*s2,*s3;
   char arr[200];
   int t_int;

   s1 =  (char *)malloc(sizeof(str));
   strcpy(s1 , str);
   s2 = s1;
   s3 = arr;
   printf("s1 = %s\n", s1);
   while(*s1 != '\0')
   {
       if(*s1<48 || *s1>57)
       {
           printf("entry error\n");
           return -1;
       }
       else
       {
           *s3 = *s1;
       }
       s1++;
       s3++;

   }
   free(s2);
   *s3 = '\0';
   sscanf(arr, "%d", &t_int);
   return t_int;
}

int main(int argc, char *argv[])
{
   char s[200];
   int t_i;
   printf("please entry a number:\n");
   scanf("%s", s);
   t_i = t_atoi(s);
   printf("t=%d\n", t_i);
   return 0;
}

--------------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
int myatoi(const char *s)
{
   int a,b,c;
   int flag;
   char *j;
   a=b=c=0;
   flag=1;
   j=(char *)s;
   if(NULL==s)
      return 0;
   if(*j=='-')
   {
      flag=-1;
      j++;
   }
   while(isdigit(a=*j++))
   {
      b=c;
      a=a-0x30;   
      c=10*b+a;
      if(c<0) //處理溢出,做到行為與atoi一致
         return flag*INT_MAX;
   }
   return flag*c;
}
int main()
{
   char *num="-153.78abc";
   printf("%d %d\n",myatoi(num),atoi(num));
   printf("%d %d\n",myatoi("7788"),atoi("7788"));
   printf("%d %d\n",myatoi("-7788"),atoi("-7788"));
   printf("%d %d\n",myatoi("abcd7788"),atoi("abcd7788"));
   printf("%d %d\n",myatoi("7788abcd"),atoi("7788abcd"));
   printf("%d %d\n",myatoi("9876543210123"),atoi("9876543210123"));
   printf("%d %d\n",myatoi("-9876543210123"),atoi("-9876543210123"));
   printf("%d\n",myatoi(NULL));
   printf("%d\n",INT_MAX);
   int i;
   printf("%d\n",(sscanf(num,"%d",&i),i));
   float t;
   printf("%f\n",(sscanf(num,"%f",&f),f));
   //sscanf這樣就可以直接代替atoi,atof了
   return 0;
}

--------------------------------------------------------------------------------------

代碼:
虛建構函式(virtual constructor)”?

一種允許你做一些 C++ 不直接支援的事情的用法。

你可能通過虛函數 virtual clone()(對於拷貝建構函式)或虛函數 virtual create()(對於預設建構函式),得到虛建構函式產生的效果。

class Shape {
   public:
  virtual ~Shape() { }                 // 虛解構函式
  virtual void draw() = 0;             // 純虛函數
  virtual void move() = 0;
  // ...
  virtual Shape* clone()  const = 0;   // 使用拷貝建構函式
  virtual Shape* create() const = 0;   // 使用預設建構函式
};

class Circle : public Shape {
   public:
  Circle* clone()  const { return new Circle(*this); }
  Circle* create() const { return new Circle();      }
  // ...
};

在 clone() 成員函數中,代碼 new Circle(*this) 調用 Circle 的拷貝建構函式來複製this的狀態到新建立的Circle對象。在 create()成員函數中,代碼 new Circle() 調用Circle的預設建構函式。

使用者將它們看作“虛建構函式”來使用它們:

void userCode(Shape& s)
{
  Shape* s2 = s.clone();
  Shape* s3 = s.create();
  // ...
  delete s2;    // 在此處,你可能需要虛解構函式
  delete s3;
}

這個函數將正確工作,而不管 Shape 是一個Circle,Square,或是其他種類的 Shape,甚至它們還並不存在。

注意:成員函數Circle's clone()的傳回值類型故意與成員函數Shape's clone()的不同。這種特徵被稱為“協變的傳回型別”,該特徵最初並不是語言的一部分。如果你的編譯器不允許在Circle類中這樣聲明Circle* clone() const(如,提示“The return type is different”或“The member function's type differs from the base class virtual function by return type alone”),說明你的編譯器陳舊了,那麼你必須改變傳回型別為Shape*。
to redsnow:
這實際上是一種建立型模式。它的目的是為了引入一種‘虛‘的建構函式。

如果shape不存在的話,那麼Shape* s2 = s.clone(); 中的clone()就是一個存虛函數呀,這樣行嗎?

應當注意到,s被定義位Shape&類型,而實際傳入的是一個由Shape繼承而來的實際類型,在衍生類別型中clone等方法必然比override。

所謂的“shape不存在”的話,是指任何一個繼承自Shape的並override了這幾個函數的類,都可以用於這種用途。

因為這是一個招聘題,我認為他想考的是對設計模式的認識,

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.