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了這幾個函數的類,都可以用於這種用途。 因為這是一個招聘題,我認為他想考的是對設計模式的認識, |