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,如需轉載請自行聯系原作者