OC简介及基本语法(二)

         OC是一门面向对象的开发语言,而C语言是面向过程的,因此在开发思想上要把面向过程和面向对象好好区分开来,体会其中的不同之处。面向过程关注的是解决问题需要哪些步骤,而面向对象关注的是解决问题需要哪些对象。

1. 类的设计

        在C语言中完整的写一个函数需要函数的声明和定义(也就是实现),而OC中类似,完整的写一个类需要类的声明和实现

类的设计主要包括:类名,属性和行为。

  OC中类名的第一个字母必须是大写。不能有下划线。多个英文单词,用驼峰标识。

2. 方法(行为)的设计

       OC中方法就是行为,主要包括方法名,参数,返回值(声明和实现)方法不能放在大括号里面。只要是OC对象的方法,必须以减号 - 开头,类方法以+开头。OC方法中任何数据类型都必须要用()扩住。OC方法中的小括号():只有一个作用,用来扩住数据类型。

3. 类的声明跟实现

       OC中类的声明值得是用来声明对象的属性跟行为,声明对象的属性(实例变量或者叫成员变量) , 成员变量默认情况下会做一个初始化,所有成员变量默认都是0。

       声明在@interface和@end之间进行,实现在@implementation和@end之间进行。

简单OC类的实现举例:

#import <Foundation/Foundation.h> // 因为使用了NSObject
@interface Plane: NSObject    // NSObject目的是:让这个类具备创建对象的能力
{
    @public  // @public关键字,可以让外部的指针间接访问内部的成员变量   
    int wheels;  
    int speed;    
    // 大括号里面只能写属性不能写行为
}
- (void)run;  // 跑这个方法
@end

//类的实现  用来实现@interface中声明的方法
@implementation Plane
- (void)run
{
    NSLog(@"Plane is flying !");  // 实现声明的方法
}
@end

int main()
{
    //[Plane new];会创建出一个新对象,并且会返回新对象本身(新对象的地址)   
    Plane *p = [Plane new]; // 定义了一个指针变量p,p将来指向的是Plane类型的对象   
    Plane *p2 = [Plane new]; // [Plane new]每次都会创建出一个新的对象
    
    p->wheels = 3; // 给p所指向的wheels属性赋值,类似于结构体    
    p->speed = 1550;
    // 给p所指向的对象发送一条run消息,消息机制:给指针所指向的对象发送一条run消息
    [p run];   
    [p2 run];    
    NSLog(@"Plane有%d个轮子,时速为%dkm/h",p->wheels,p->speed);    
    return 0; // 程序退出后会默认把内存回收
}

     [Plane new]在使用类创建对象之前,会将类加载进内存,类的内存里面只放方法列表,创建的每个对象内部默认有一个指针(isa指针),这个指针指向这个对象所对应的类,所有的对象共用相同的类里面的方法。

      OC 类的成员变量不能在{}中进行初始化、不能被直接拿出去访问;方法不能当做函数一样调用;成员变量\方法不能用static等关键字修饰,别跟C语言混在一起(暂时忽略);类的实现可用写在main函数的后面,主要在声明后面就行了。

4.OC方法的声明和实现

@interface JiSuanQi : NSObject

- (double)pi;   // 方法名叫pi,不带参数的方法

// OC方法中,一个参数对应一个冒号

// 方法名叫square: ,要连上冒号,为了防止方法名的冲突,冒号也是方法名的一部分

- (int)square:(int)num;   // 带一个参数的方法

// 方法名叫: sumWithNum1:andNum2:

- (int)sumWithNum1:(int)num1 andNum2:(int)num2; // 带两个参数的方法,可读性好 冒号前面加一些描述信息,来描述后面的参数是干嘛用的

@end

5.示例OC的方法

// 设计一个方法,用来和其他车比较车速,返回车速的差距
#import <Foundation/Foundation.h>
@interface Car : NSObject  // 类的声明
{
    @public
    int speed;  // 车速
}
// 此处传递一个车进来比较速度,车是一个对象,OC中的对象都是指针类型的,数据类型为Car*
- (int)compareSpeedWithOther:(Car *)other;
@end

@implementation Car  // 类的实现
- (int)compareSpeedWithOther:(Car *)other
{
    // speed当前这辆车的速度
    // other->speed 是other传进来比较的这辆车的速度
    // 返回当前这辆车和other这辆车的速度差距
    return speed - other->speed;
}
@end

int main()
{
    Car *c1 = [Car new];  // 创建车对象c1
    c1->speed = 300;      // 给对象的speed属性赋值
    
    Car *c2 = [Car new];  // 创建对象c2
    c2->speed = 280;
    
    int a = [c2 compareSpeedWithOther:c1];  // c2调用方法并传入c1参数进行速度比较
    NSLog(@"%d",a);  // 打印速度差距
    
    return 0;
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大王算法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值