———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 @end 11 12 @implementation Car 13 - (void)run 14 { 15 NSLog(@"%d个轮子,速度为%ikm/h的车子跑起来", _wheels, _speed); 16 } 17 @end 18 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的车子跑起来了。
注:由于对象把地址赋值给了指针变量,我们习惯上就把这个指向对象的指针变量称为对象。
时间: 2024-10-03 23:54:14