• 06-OC对象与函数参数


    创建一个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的值被改变。所以输出结果是:5个轮子,速度为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的车子跑起来了。

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

    3、总结:

      1>函数的存在不依赖于类;

      2>值传递,函数内部不能改变外部的值;

      3>地址传递,函数内部可以改变外部的值;

      4>复习指针,加深理解。

    人生之路,不忘初心,勿忘始终!
  • 相关阅读:
    配置Apache虚拟主机
    Apache: You don't have permission to access / on this server
    wordpress之备份与恢复数据
    ruby之各种概念
    Oracle之比较NVARCHAR2字符串
    Centos安装ruby--jekyll
    Linux之IO Redirection
    SecureCRT导入已有会话
    jdk1.8新特性应用之Iterable
    jdk1.8新特性应用之Collection
  • 原文地址:https://www.cnblogs.com/xdl745464047/p/3996439.html
Copyright © 2020-2023  润新知