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++中的classstruct的区别

(一)默认继承权限。如果不明确指定,来自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{

public:

    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中继承父类在子类中重写父类的方法,子类并不会主动去调用父类的方法