/*
类名:car
属性:轮胎个数、时速(速度)
行为:跑
*/
#import <Foundation/Foundation.h>
//完整地写一个类:类的声明和实现(期间不允许发生嵌套)
// 声明必须放在前面,实现可以放在后面
//1. 类的声明
// 声明对象的属性、行为
// : NSObject目的是:让Car这个类具备创建对象的能力
@interface Car : NSObject
{
//用来声明对象属性(实例变量\成员变量, 默认为0)
//@public可以让外部的指针间接访问对象内部的成员变量
//不允许在声明的时候初始化
//不能随便将成员变量当作c语言中的变量
@public
int wheels; //轮胎个数
int speed; //时速
}
//方法(行为)声明 : 方法名、参数、返回值
//只要是OC对象的方法:必须以减号 - 开头
//OC方法中任何数据类型都必须用小括号()括住
//OC方法中的小括号():括住数据类型
- (void) run;
- (void) walk;
- (void) jiasu:(int)jspeed;
- (void)piaoyijiaspeed:(int) jiaspeed jianspeed : (int) jianspeed;
@end
//2. 类的实现
@implementation Car
// 方法的实现(说清楚方法里面有什么代码)
- (void) run
{
NSLog(@"%i个轮子, %i速度的车子跑起来了", wheels, speed);
}
//方法名:walk
- (void)walk
{
NSLog(@"%i个轮子, %i速度的车子慢下来了", wheels, speed);
}
//OC方法中一个参数对应一个冒号,多个参数之间要有空格
//方法名:jiasu: (冒号也算在方法名之内)
- (void) jiasu:(int)jspeed
{
speed += jspeed;
}
//冒号前加一些描述信息
//这样可以使程序的可读性提高
//方法名:piaoyijiaspeed:jianspeed:
- (void)piaoyijiaspeed:(int) jiaspeed jianspeed : (int) jianspeed
{
speed += jiaspeed;
speed -= jianspeed;
}
@end
//函数
void test (Car *newC)
{
newC->wheels = 6;
}
/*
方法和函数的区别:
1.对象方法都是以减号 - 开头
2.对象方法的声明必须写在@interface和@end之间
对象方法的实现必须写在@implementation和@end之间
3.对象方法只能又对象调用
4.函数能写在文件中的任一位置,函数归文件所有
5.函数调用是不依赖于对象
6.函数内部不能直接通过成员变量名访问某个对象的成员变量
*/
int main()
{
//在OC中,想执行一些行为,就写上一个中括号[行为执行者 行为名称 ]
//利用类来创建对象
//执行了Car这个类的new行为来创建新对象
//定义类一个指针变量p, p将来指向的Car类型的对象
//[Car new]会创建出一个新对象,并且会返回新对象本身(新对象的地址)
//在使用类创建对象之前,会将类加载进内存,而且只会加载一次
Car *p = [Car new];
Car *p2 = [Car new];
//匿名对象 对内存管理是不合理的,只需要看懂就可以
[Car new]->speed = 300;
[[Car new] run];
//给p所指向对象的wheels属性赋值
p->wheels = 4;
p->speed = 250;
p2->wheels = 5;
p2->speed = 300;
//函数
test(p2);
//给p所指向对象发送一个run消息
[p jiasu:10];
[p2 piaoyijiaspeed:10 jianspeed:20];
[p run];
[p walk];
[p2 run];
//NSLog(@"The car's wheels is %i, speed is %i", p->wheels , p2->speed);
return 0;
}