OC与C++的区别参考汇总:

OCC++的区别参考汇总:

C++与OC同为面向对象设计语言,他们有很多相似的对象,但是由于两者属于不同的面向对象学派。因此两者之间的比较也乐此不疲。下面简要说说他们的区别:

        1.继承:Objective-C与同JavaSmalltalk一样不支持多重继承,而C++语言支持多重继承(从侧面可以说明多重继承的效率不高);

        2.函数调用:Objective-C通过互相传递消息实现函数调用,而C++直接进行函数调用

       3.定型:Objective-C是动态定型(dynamicaly typed)。所以它的类库比C++要容易操作。Objective-C 在运行时可以允许根据字符串名字来访问方法和类,还可以动态连接和添加类。而C++,对象的静态类型决定你是否可以发送消息给它。

        4.接口:Objective-C采用protocol协议(非正式和正式)的形式来定义接口,而C++采用虚函数的形式来定义接口。

        5.方法重载:c++中允许两个方法的名字相同,参数个数相同,但是参数类型不同,以及不同的返回值类型。而OC中不允许同一个类中两个方法有相同的名字,参数个数相同,参数类型不同。
总结 

1.C++存在多继承,OC没有,取而代之的有代理,类别,通知等较为常见的设计模式,从而导致思维方式的不同。

2.C++有公有和私有变量,OC没有私有变量一说,当需要访问OC类成员变量,就需要将类成员设置成类属性。

3.C++多态允许同一个类中两个方法有相同的名字,参数个数相同,参数类型不同。而OC不可以。

4.C++采用虚函数的形势定义接口,OC采用协议。


 c++与oc的对比 

我觉得最主要的区别就是,c++中的对象可以是动态创建的(使用new来创建,返回对象的地址),也可以是直接的创建对象(如:A a;就是直接创建)。

所以在c++中就有了 值传递 与指针传递的区别。在java中是没有的,oc中也是没有的,因为java与oc创建的对象都相当于是创建的对象的指针,而不能直接的创建对象本身,都是通过这个指针去访问对象的。

比如,我在c++中创建一个B对象,可以用2种方式:

1,

class A:  //学生对象

{

public: 

    int  id;

    string name;

    int age;

    string sex;

};

第一种创建B的方法:

class B:

{

public:

    int classId; //班级编号

    A a; //学生对象数组 

} //这种方式创建,是直接创建的A a对象,B b;那么当B对象创建的时候,就为a对象分配了空间,也就是a对象被初始化好了。Hzh:隐式调用默认普通构造函数

第二种创建B的方法:


class B:

{

public:

    int classId; //班级编号

    A  *a;  //学生对象数组的指针 

} //这种方式创建,只创建了一个A对象的指针,所有指针都是4个字节,这个时候其实a对象是个null,并没有分配内存。只有当a = new A();的时候才为a分配了内存。

总结:

可以看出,第一种方法就是非动态的创建内存的例子,使用A a;直接的分配内存。第2种方法就是动态分配内存的例子,使用A *a;当需要初始化a的时候再用new为它分配内存。

很显然,第2种方法要好得多。当需要的时候再分配内存,可以提高内存的使用效率。而objective-c就是这种方法的忠实拥护者,在oc中只能动态的创建内存,这也是oc的动态特性之一。

我们假设A对象占20个字节,

如果按照第一种B类的写法。B b;创建B对象,b占用的内存空间是20 + 4,也就是24个字节。

如果按照第二种B类的写法。B b;创建B对象,b占用的内存空间是4 +4,也就是8个字节,这是因为A *a是一个指向a对象的指针,只占4个字节,这个时候,b.a是null,只有当在需要使用b.a的时候,为a对象初始化。b.a = new A();。这也就是oc中的懒惰初始化,也叫延迟初始化。

在oc中只能用第二种方法初始化,第一种方法是没有的。

只有当类中有指针的时候,才能延迟初始化,

char *pBuffer; //类的对象中包含指针,指向动态分配的内存资源

int nSize;

};只有这种情况下,pBuffer会在需要的时候去动态的申请内存。



再来谈谈c++的拷贝构造函数:


C++中,下面三种对象需要调用拷贝构造函数(有时也称复制构造函数):

1) 一个对象作为函数参数,以值传递的方式传入函数体

2) 一个对象作为函数返回值,以值传递的方式从函数返回;

3) 一个对象用于给另外一个对象进行初始化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值