OC--类与对象

                                                                              OC--类与对象

OC的基本特征

oc文件以.m结尾,一般会加入拷贝文件#import <Foundation/Foundation.h>

Oc编译运行格式:

l  cc –c 文件名.m

l  cc 文件名.o –framework Foundation

l  ./a.out

#import的用途:

1>    跟#include一样,拷贝文件的内容

2>    可以自动防止文件的内容被重复拷贝

输出语句:

NSLog(@”这是一个oc程序!!!”);//带有自动换行功能

类:指的是某一类东西,而不是一个(例如”车“类,车有丰田,现代,奥迪等等)

类的注意事项:

1>    类名

*类名的第一个字母必须是大写

*不能有下划线

*多个英文单词,用驼峰标识法

2>属性:名词

3>行为(功能):动词

/*例如Car类

类名:Car

属性:轮胎个数,时速(速度)

行为:跑

*/

1.  类的声明

*成员变量

*方法的声明

@interface 类名 : NSObject

{

@public

成员变量;//(类型 变量名称;)

Int wheels;//轮胎  最好加上备注,提高可读性

成员变量;

……………….

}

方法声明;(动词行为)// -(数据类型)方法名;

- (void)run;

……………

@end

2. 类的实现

@implementation 类名

//用来实现@interface中声明的方法

-(数据类型)方法名

{ 方法内容;  }

-(void)run

{

NSLog(@”车子在奔驰着”);

}                                                    

@end

int main()

{

类名 *指针名 = [类名 new]; //为类创建对象,对象一创建就会分配内存

指针名 ->变量名称 = 值;//变量名称为属性里的变量名称

[指针名 方法名];//调用方法

return 0;

<pre name="code" class="cpp">#import <Foundation/Foundation.h>
//1.类的声明
//用来声明对象的属性,行为
//: NSObject 目的是:让Car这个类具备创建对象的能力
@interface Car : NSObject
{
// 用来声明对象属性(成员变量,默认会初始化为0)
@public//可以让外部的指针间接访问对象内部的成员变量
int wheels;//轮胎个数
int speed;//时速(xxkm/h)
}
//方法(行为):方法名,参数,返回值(声明,实现)
//只要是OC对象的方法,必须以 - 开头
//OC方法中任何数据类型都必须用小括号()括住
//OC方法中的小括号():括住数据类型
-(void)run;
@end
 
//2.类的实现
//用来实现@interface中声明的方法
@implementation Car
- (void)run
{
//可直接访问内部类对对应属性的值
NSLog(@”有%d个轮子的车子,以时速为%dkm/h跑着”,  wheels, speed);
}
@end
int main()
{
//在OC中,想执行一些行为,就写上一个中括号[行为执行者,行为名称]
//利用类来创建对象
//执行了Car这个类的new
//定义了一个指针变量p,p将来指向的是Car类型的对象
//[Car new];每次都会创建一个新的对象,并且会返回新对象本身(新对象的地址)
Car * p = [Car new];//调用对象时候会返回地址
//给指针所指向对象的属性赋值
p->wheels = 4;
p->speed = 250;
//给p所指向的对象发送一条run消息,并调用执行
[p run];
NSLog(@”车子的轮子有%d,时速:%dkm/h”, p -> wheels, p ->speed);
return 0;
}
 如果要对以创建的对象进行值修改,可以通过指针形式 

接上上面我们在创建一个对象:p2

Car *p2 = p;//把指针p的值赋值给p2,此时,p和p2指向同一个对象地址
p2 -> wheels = 5;//把对象里的属性值通过指针地址进行修改,修改成功
[p run];//此时输出改后的值:车子的轮子有5,时速:250km/h

通过指针对类的属性值进行修改 

#import <Foundation/Foundation.h>
@interface Car : NSObject
{// 成员变量
    @public
    int wheels;
    int speed;
}

- (void)run;
@end

@implementation Car
- (void)run
{
    NSLog(@"%d个轮子,速度为%dkm/h的车子跑起来", wheels, speed);
}
@end

void test(int w, int s)
{
    w = 20;
    s = 200;
}

void test1(Car *newC)
{
    newC->wheels = 5;
}

void test2(Car *newC)
{
    Car *c2 = [Car new];
    c2->wheels = 5;
    c2->speed = 300;
    
    newC = c2;
    newC->wheels = 6;
}

int main()
{
    Car *c = [Car new];
    c->wheels = 4;
    c->speed = 250;
    
    //test(c->wheels, c->speed);//只对函数的值进行修改,并没有把对象的改动
    //test1(c);//通过指针传递,对对象的地址进行属性修改
    test2(c); //通过指针传递,画图好好分析和test1相似  
    [c run];    
    return 0;
}

常见错误

l   只有类的声明,没有类的实现

l   漏了@end

l  @interface和@implementation嵌套

l   两个类的声明嵌套

l   成员变量没有写在括号里面

l  成员变量例的属性不能直接赋值,必须创建对象后,通过指针对象赋值

l  方法的声明写在了大括号里面

OC方法和函数的区别

 方法
 1.对象方法都是以减号 - 
 2.对象方法的声明必须写在@interface和@end之间
   对象方法的实现必须写在@implementation和@end之间
 3.对象方法只能由对象来调用
 4.对象方法归类\对象所有
 
 函数
 1.函数能写在文件中的任意位置(@interface和@end之间除外),函数归文件所有
 2.函数调用不依赖于对象
 3.函数内部不能直接通过成员变量名访问某个对象的成员变量
 

l  OC方法只能声明在@interface和@end之间,只能实现在@implementation和@end之间。也就是说OC方法不能独立于类存在

l  C函数不属于类,跟类没有联系,C函数只归定义函数的文件所有

l  C函数不能访问OC对象的成员

l  低级错误:方法有声明,但是实现的时候写成了函数

对象嵌套

#import <Foundation/Foundation.h>
//性别枚举,并通过typedef重新定义为Sex
typedef enum {
    SexMan,
    SexWoman
} Sex;
//结构体定义,并通过typedef重新定义为Date
typedef struct {
    int year;
    int month;
    int day;
} Date;
//颜色枚举,并通过typedef重新定义为Color
typedef enum {
    ColorBlack,
    ColorRed,
    ColorGreen
} Color;
//对狗进行类的声明
@interface Dog : NSObject
{
    @public
    double weight; // 体重
    Color curColor; // 毛色
}


- (void)eat;
- (void)run;
@end
//对狗进行类的实现
@implementation Dog
- (void)eat
{
    // 每吃一次,体重就加1
    weight += 1;
    //weight = weight +  1;
    NSLog(@"狗吃完这次后的体重是%f", weight);
}
- (void)run
{
    weight -= 1;
    NSLog(@"狗跑完这次后的体重是%f", weight);
}
@end
/*
学生
成员变量:性别、生日、体重、最喜欢的颜色、狗(体重、毛色,吃、跑)
方法:吃、跑步、遛狗(让狗跑)、喂狗(让狗吃)
*/
@interface Student : NSObject
{
    @public
    Sex sex; // 性别
    Date birthday; // 生日
    double weight; // 体重(kg)
    Color favColor; // 最喜欢的颜色
    char *name;
    
    // 重点:狗
    Dog *dog;//定义狗的类型为指针Dog *,其变量名为dog
}
- (void)eat;
- (void)run;
- (void)print;


- (void)liuDog;//对狗执行的动作
- (void)weiDog;//对狗执行的动作
@end


@implementation Student
//将学生的行为进行实现,并通过方法调用狗的行为
- (void)liuDog
{
    // 让狗跑起来(调用狗的run方法)
    [dog run];//对狗的行为的调用
}


- (void)weiDog
{
    // 让狗吃东西(调用狗的eat方法)
    [dog eat];
}


- (void)print
{
    NSLog(@"性别=%d, 喜欢的颜色=%d, 姓名=%s, 生日=%d-%d-%d", sex, favColor, name, birthday.year, birthday.month, birthday.day);
}


- (void)eat
{
    // 每吃一次,体重就加1
    weight += 1;
    //weight = weight +  1;
    NSLog(@"学生吃完这次后的体重是%f", weight);
}


- (void)run
{
    weight -= 1;
    NSLog(@"学生跑完这次后的体重是%f", weight);
}
@end


int main()
{
    Student *s = [Student new];
    
    Dog *d = [Dog new];
    d->curColor = ColorGreen;
    d->weight = 20;
    s->dog = d;//通过指针将狗的对象,传递给学生的dog对象
        
    [s liuDog];    
    [s weiDog];
    return 0;
}


void test()
{
    Student *s = [Student new];
    s->weight = 50;    
    // 性别
    s->sex = SexMan;    
    // 生日
    Date d = {2011, 9, 10};//注意结构体的赋值形式
    s->birthday = d;  
    s->name = "Jack";
    
    /*
     s->birthday.year = 2011;
     s->birthday.month = 9;
     s->birthday.day = 10;
     */
    
    // 喜欢的颜色
    s->favColor = ColorBlack;
    /*
     [s eat];
     [s eat];
     
     [s run];
     [s run];
     */
    
    [s print];
}

方法的具体定义和实现

1.不带参数的方法

 设计一个返回PI的方法

// 方法声明

- (double)pi;

//方法实现

- (double)pi

{

    return 3.14;

}



 方法调用


2.带一个参数的方法

  设计一个计算平方的方法

// 方法声明

- (double)square:(double)number;

//方法实现

- (double)square:(double)number

{

    return number * number;

}


 方法调用

 

3.带多个参数的方法

设计一个计算和的方法

// 方法声明

- (double)sumOfNum1:(double)num1andNum2:(double)num2;

//方法实现

- (double)sumOfNum1:(double)num1andNum2:(double)num2

{

    return num1 + num2;

}

 方法调用

4. 方法名注意

l  冒号也是方法名的一部分

l  同一个类中不允许两个对象方法同名

 








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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阿三先生

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

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

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

打赏作者

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

抵扣说明:

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

余额充值