首页 > 代码库 > 黑马程序员 06-OC对象与函数

黑马程序员 06-OC对象与函数

———Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ———

创建一个Car类,再利用Car类创建对象,代码如下:

 1 #import <Foundation/Foundation.h> 2 @interface Car : NSObject 3 { 4     //成员变量 5     @public 6     int _wheels; 7     int _speed; 8 } 9 - (void)run;10 @end11 12 @implementation Car13 - (void)run14 {15     NSLog(@"%d个轮子,速度为%ikm/h的车子跑起来", _wheels, _speed);16 }17 @end18 int main(int argc, const char * argv[])19 {20     Car *car1 = [Car new];21     car1 -> _wheels = 4;22     car1 -> _speed = 250;23   24     [car1 run];25     return 0;26 }

上面的代码输出结果为:4个轮子,速度为250km/h的车子跑起来了

下面我们我们在上面的代码中加入函数,来分析输出结果会有什么变化:

1、加入3个函数:test、test1、test2

 1 void test(int w, int s) 2 { 3     w = 20; 4     s = 200; 5 } 6  7 void test1(Car *newCar) 8 { 9     newCar -> _wheels = 5;10 }11 12 void test2(Car *newCar)13 {14     Car *car2 = [Car new];15     car2 -> _wheels = 5;16     car2 -> _speed = 300;17     newCar = car2;18     newCar -> _wheels = 6;19 }

2、分析

(1)当main函数调用test函数的时候,实参_wheels = 4,_speed = 250传到test函数中,只是改变了w 和 s的值,属于值传递,并没有改变_wheels 和 _speed的值;所以输出结果是:4个轮子,速度为250km/h的车子跑起来了。

(2)car1调用test1函数,car1作为指针变量传递给test1函数,属于地址传递。这时,test1函数中:car1 ->_wheels = 5, _wheels的值被改变。所以输出结果是:4个轮子,速度为250km/h的车子跑起来了。

(3)test2函数,函数的形参是一个Car类的指针变量。在这个函数中,又利用Car类创建了一个新对象,并把新对象的地址赋值给了car2,这时car2指向新对象;接下来car2对新对象的成员变量进行赋值。

  当car1调用test2函数的时候,执行第17行代码,结果为:car1 = car2,改变了car1的指向,即car1也指向了car2所指向的对象,然后car ->_wheels = 6,也是给car2所指向的新对象赋值。自始至终没有对car1原来指向的对象进行赋值操作,输出结果为:4个轮子,速度为250km/h的车子跑起来了。

注:由于对象把地址赋值给了指针变量,我们习惯上就把这个指向对象的指针变量称为对象。

黑马程序员 06-OC对象与函数