天天看點

測試題答案

C++:

1.String 的具體實作

已知String類定義如下:

class String

{

    public:

    String(const char *str = NULL); // 通用構造函數

    String(const String &another); // 拷貝構造函數

    ~ String(); // 析構函數

    String & operator =(const String&rhs); // 指派函數

    private:

    char *m_data; // 用于儲存字元串

};

嘗試寫出類的成員函數實作。

String::String(const char*str){if ( str == NULL ) //strlen在參數為NULL時會抛異常才會有這步判斷{m_data = new char[1] ;m_data[0] = '\0' ;}else{m_data = newchar[strlen(str) + 1];strcpy(m_data,str);}} String::String(const String &another)

{m_data = newchar[strlen(another.m_data) + 1];strcpy(m_data,other.m_data);}String&String::operator =(const String &rhs){if ( this == &rhs)return *this;delete []m_data; //删除原來的資料,新開一塊記憶體m_data = new char[strlen(rhs.m_data) + 1];strcpy(m_data,rhs.m_data);return*this ;}String::~String(){delete []m_data ;}

2.C++中的class和struct的差別

(一)預設繼承權限。如果不明确指定,來自class的繼承按照private繼承處理,來自struct的繼承按照public繼承處理;

(二)成員的預設通路權限。class的成員預設是private權限,struct預設是public權限。

除了這兩點,class和struct基本就是一個東西。文法上沒有任何其它差別。

3.既然C裡面已經有了malloc、free,為什麼還要new、delete

它們都可用于申請動态記憶體和釋放記憶體。對于非内部資料類型的對象而言,光用maloc/free無法滿足動态對象的要求。使用new、delete對象在建立的同時自動執行構造函數,對象在消亡之前自動執行析構函數。

4.請寫出下面程式的輸出結果

#include<iostream>

using namespace std;

class A{

public:

    A(){cout<<"A"<<endl;func();}

    virtual void func(){cout<<"funcA"<<endl;}

    virtual~A(){cout<<"~A"<<endl;};

class B:publicA{

    B(){cout<<"B"<<endl;func();}

    virtual void func(){cout<<"funcB"<<endl;}

    virtual~B(){cout<<"~B"<<endl;};

int main(int argc,constchar * argv[])

    A *a = new B;

    deletea;

    return 0;

}

A              //先建立基類對象

funcA      //虛函數看指向,之前的想法是調用B的方法,此時A還沒有建立好,是以B也就還沒建立,是以就調用A的func

B                  

funcB

~B

~A     //析構函數必須是虛函數,這樣如果是指針類型在釋放子類對象的時候,才能也将父類對象都釋放完畢,才能釋放的徹底。

IOS:

選擇題

1.Person *person =[[Person alloc]initWithObjects:@"11", nil];

     [person release];

     NSLog(@"%d", person.retainCount);會輸出多少?

解釋:我感覺出這種題目的公司是誤導開發者的行為,屬于沒意義的題目,我相信大牛也解釋不了!如果在person的dealloc中寫上NSLog(@"釋放了");再運作這句會發現,已經輸出“釋放了”,但是它的retainCount還會輸出1,蘋果官方對retianCount的解釋也是不能完全信這個計數器,隻能供學習參考!希望公司不要出這種沒意義的題目!或者是對應聘者選的是A要給以支援

A.0      B.-1     C.1   D.錯誤,直接崩潰

2.NSString *aa =@"Simple Audio Engine";

     NSLog(@"%@",[aasubstringToIndex:8]);會輸出什麼?

A.Simple Au      B.A     C.Simple A    D.u

3.變量命名正确的是:

A.2A      B._AA      C..AA   D.-AA

4.int a = 0; -+a--;NSLog(@"%d",a);會輸出什麼?

     A.0     B.-1      C.1   D.不确定

5.NSString *str =@"a123";NSLog(@"%d",[str intValue]);會輸出什麼?

這個題目我也覺得無語,怎麼不是系統報錯,如果@“0”,這豈不是也會輸出0,那根據結果是0,怎麼判斷你之前寫的是0還是非0

     A.0      B.123     C.123a    D.不确定

6.已知inta = 6;則執行 a+=a-=a*a;語句後,a的值為

     A.36     B.0      C.-24    D.-60

7.NSString *str =@"a123"; NSLog(@"%@",(str ==@"123")?@"yes":@"no");會輸出什麼?

對象的儲存的位址都是不一樣的!

     A. yes     B. no      C.不确定   D.錯誤

8.@[@"a",@"b"];該類型是

NSArray *arr = @[@"a",@"b"]

     A._字元串對象      B.字典對象      C.數組對象    D.集合對象

9.多态的定義是:

     A._來自不同對象可以接受同一消息的能力     

     B.來自不同類的對象可以接受同一消息的能力     

     C.來自不同的類可以接受同一消息的能力   

     D.以上都不是

10.下列條件語句中,功能與其他語句不同的是

    A.if(a)printf("%d\n",x); else printf("%d\n",y);

    B.if(a=0)printf("%d\n",y); else printf("%d\n",x);   //這個b選項if判斷裡面相當于if(0)

    C.if (a!=0)printf("%d\n",x); else printf("%d\n",y);

    D.if(a==0) printf("%d\n",x); elseprintf("%d\n",y);

11.已知char s[20],*p=s,則在下列語句中,錯誤的是

     A.p=s+5

     B.s=p+s  //s是一個已經确定好了的位址,不是一個指針,是以不能重新給他指派

     C.s[2]=p[4]

     D.*p=s[0]

12.若w=1,X= 2,y= 3,z=4,則條件表達式w<x?w:y<z?y:z的值是:  

注意:從前往後執行,跟&&是一樣的,從前往後判斷,如果一旦确定了後面就不執行了

    A.表達式錯誤      B.-1      C.0       D.1

13.以下for循環語句 for(;;) printf("**");

A.判斷循環結束的條件不合法

B.是無限循環

C.一次也不執行

D.隻執行一次

14.以下關于子類和父類的叙述中,正确的是

A.代碼中使用父類對象的地方,都可以使用子類對象進行替換      //解釋:因為父類有的消息,子類都有

B.代碼中使用子類對象的地方,都可以使用父類對象進行替換

C.父類定義的對象與子類定義的對象在屬性和方法上一定相同

D.父類定義的對象與子類定義的對象在屬性和方法上一定不同

15.下面四個選項中,均是合法浮點數的選項是

A.+1e+1      B.-.60      C.123e       D.-e3 

   5e-9.4        12e-4        1.2e-.4       .8e-4

   03e2          -8e5         +2e-1         5.e-0

 字母e(或E)之前必須有數字,且e後面的指數必須是整數

簡答題

1.NSString *a =@"abc";   a能添加到定義好的NSArray裡面嗎

答:不能

2.淺複制和深複制的差別?

答:淺複制是指針複制,深複制是對象拷貝

3.簡要說說繼承與分類的差別

答:對于執行個體變量子類不可以通路父類的私有變量而分類可以,對于添加執行個體變量子類可以添加而分類不可以

4.簡要說說正式協定與非正式協定的差別

答:非正式協定,是使用類别category來實作,非正式協定是NSObject的一個類别,這樣任何類的對象都可以作為委托對象來使用,正式協定,是一個命名的方法清單,與非正式協定相比不同的是,它要求顯示的采用協定,此時,實作協定的類應該遵守協定,否則編譯器将會發出警告。

5.簡要說說可變對象與不可變對象的不同之處

答:可變對象的修改是在源對象基礎之上,不可變對象的修改是非本對象

6.簡要說說對象的生命周期

答:new、allloc、copy、retain對象引用計數加1、release對象引用計數減1,當引用計數大于零時對象保留,引用計數為零時調用delloc方法釋放對象,使用autorelease對象在未來某個時刻釋放自動釋放池的時候會周遊該自動釋放池,使池内的每個對象的引用計數減1

7.對于屬性@property裡的參數清單什麼時候用retain, 什麼時候用copy

答:當對象本身是不可變對象的時候,為防止傳入的參數是可變的使用copy,其他時段都可以使用retain

8.闡述一下 person.money=100; 和 int num = person.money 的差別

答:前者調用的是setter方法,而後者調用的是getter方法

9.retain,assign,copy,nonatomic,atomic, readwrite,readonly屬性的作用

答:retain,assign,copy用于執行個體變量存取器的記憶體管理、nonatomic,atomic是否有原子操作、readwrite,readonly用于執行個體變量的存取器生成

10.self/super 的差別

答:self指代目前對象,super指代父類

11.id 聲明的對象有什麼特性?

答:聲明的對象具有運作時的特性,即可以指向任意類型的objcetive-c的對象

12.分析一下NSMutableArray *arr = [NSMutableArrayarrayWithObjects:@"123", nil]; 和  NSMutableArray *arr = [[NSMutableArrayalloc]initWithObjects:@"123", nil];的差別

答:前者生成的對象是自動生成的,後者生成的對象需要手動進行釋放

13.用宏定義MIN輸入兩個參數輸出最小值

答:#defineMIN((A),(B)) ((A)<(B)?(A):(B))

14.請描述自動釋放池的工作原理

答:一個自釋放池是一個明确定義了範圍的對象集合,這個範圍标記着最終什麼時候釋放。自釋放池可以被嵌套。當你發送一個 autorelease 消息, 一個該對象的引用被放進最近的自釋放池中。它仍然是一個有效的對象,是以其他在自釋放池定義範圍内的對象可以給它發送消息。當程式執行到範圍末尾時,這個池被釋放。

15.為什麼重寫父類方法都需要去重新調用父類的方法,如self = [super init];

答:因為OC中繼承父類在子類中重寫父類的方法,子類并不會主動去調用父類的方法

本文轉蓬萊仙羽51CTO部落格,原文連結:http://blog.51cto.com/dingxiaowei/1366444,如需轉載請自行聯系原作者

繼續閱讀