Day1 oc与c/c++比较

oc与c/c++的比较(摘自千峰黎老师课程)

  • oc关键字都以@开头,完全兼容c。@符号是OC在C基础上新加的特性之一。常见到的形式有@”字符串”,%@ , @interface,@implement等。@”字符串”表示引用的字符串应该作为Cocoa的NSString元素来处理。@interface等则是对于C的扩展,是OC面向对象特性的体现。ps:只要看到@符号,就可以认为它是对于C的一个扩展。
  • NSLog():在OC中用的打印函数是NSLog(),因为OC是加了一点”特殊语料”的C语言,所以也可以用printf(),但是NSLog()提供了一些特性,如时间戳,日期戳和自动加换行符等。ps:NS前缀告诉你函数来自Cocoa而不是其他工具包。
  • BOOL和C中的bool有如下区别BOOL:YES(1),NO(0);bool:true(!0),false(0)
  • 基类是NSObject,所有的函数都是虚函数
    #include<iostream>
    using namespace std;
    class A
    {
        public:
            virtual void print(){cout<<"This is A"<<endl;}
    };
    class B : public A
    {
        public:
        void print(){cout<<"ThisisB"<<endl;}
    };
     
    int main()
    {
        A a;
        B b;
        A *p1 = &a;
        A *p2 = &b;
        p1->print();
        p2->print();
        return 0;
    }
     被virtual关键字修饰的成员函数,就是虚函数。虚函数的作用,是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异,而采用不同的策略。
    定义虚函数的限制:
    (1)非类的成员函数不能定义为虚函数,类的成员函数中静态成员函数和构造函数也不能定义为虚函数,但可以将析构函数定义为虚函数。实际上,优秀的程序员常常把基类的析构函数定义为虚函数。因为,将基类的析构函数定义为虚函数后,当利用delete删除一个指向派生类定义的对象指针时,系统会调用相应的类的析构函数。而不将析构函数定义为虚函数时,只调用基类的析构函数。
(2)只需要在声明函数的类体中使用关键字“virtual”将函数声明为虚函数,而定义函数时不需要使用关键字“virtual”。
(3)当将基类中的某一成员函数声明为虚函数后,派生类中的同名函数(函数名相同、参数列表完全一致、返回值类型相关)自动成为虚函数。
(4)如果声明了某个成员函数为虚函数,则在该类中不能出现和这个成员函数同名并且返回值、参数个数、类型都相同的非虚函数。在以该类为基类的派生类中,也不能出现这种同名函数。
  • nil等同于null
  • 在OC中定义一个类需要有两个部分:接口和实现。接口文件包含了类的声明,定义了实例变量和方法。实现文件包含了具体的函数的实现代码。类声明放到.h文件里(@interface @end),类的实现放到.m文件里(@implementation @end)
  • #import "xxxx.h"包含头文件,同一个头文件只能包含一次,相当于#include+ #pragma once的组合
    #ifndef _HEAD_H_
    #define _HEAD_H_
    #endif
     
  • “:”表示继承 
    @interface  ABC : NSObject{
    }  
    @end
     
  • 对象创建销毁
    ABC *abc=[ABC alloc];
    [abc init];
    [abc release];
     
  • 字段定义
    变量申明:@public @protected @private,变量缺省是@protected,在.h头文件定义的函数是@public类型
    @interface ABC:NSObject
    {
    @public
    int name;
    @protected
    int ID;
    @private
    float secret;
    }
     
  • 类方法以+号开头,对象方法以-号开头,oc中允许类方法和对象方法名称一样,类方法的好处是不依赖于对象,执行效率高,当方法内部不需要使用到成员变量时,就可以改为类方法。能用类方法尽量用类方法,如工具类(基本没有成员变量/实例变量)
    + (void) init;        // 类方法
    - (void) show;     // 对象方法
    // 调用类方法
    [Test init];
    // 调用对象方法
    ABC *abc = [ABC new];
    [abc show];
  • 类的申明,oc中类的申明必须带*号,这里的*既表示指针也表示引用,例如:ABC  *abc;这里的*既表示真正的指针,也表示引用,可以通过abc→xxx或者abc.xxx这些方法来访问。
  • 函数调用的对比


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值