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