进击的皮皮虾

真正理解 Objective-C 中的类(一)

2017-03-15  本文已影响261人  柳豪

前言

本系列文章介绍的并不是一些艰深的内容。

重要的是找到一些以前学习过程中主动地、被动地错误吸收的知识将它从脑中剔除,并理清其所给人带来的矛盾。

但是还是有一个主线的,那就是正确理解Objective-C中的对象含义。

目的

看懂Objective-C对象和类的定义的数据结构表示

基础

你会回顾到一下几点基础知识:


C 语言结构体与 typedef

在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类。

结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。

结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。

简单的说:结构体是聚合了一系列数据的数据结构

结构体的定义如下:

 struct tag { member-list } variable-list ; 

在一般情况下,tagmember-listvariable-list这3部分至少要出现2个

结构体作为 C 语言的一种聚合数据类型(aggregate data type),一般都会拥有成员变量(member-lis),所以下面只举出两例如下:

例子1,这个结构体并没有标明其标签(缺少tag
struct 
{
    int a;
    char b;
    double c;
} s1;
例子2,结构体的tag被命名为SIMPLE,没有接着用来声明变量variable-list
struct SIMPLE
{
    int a;
    char b;
    double c;
};

使用这种结构体用来声明变量的方式如下:

struct SIMPLE simple1;
struct SIMPLE simple2;

结构体变量的成员变量的访问一(点运算符)

对结构体变量的成员变量的方位使用.运算符以上面定义的 struct SIMPLE类型的对象为例子:

struct SIMPLE simple1;
simple1.a = 100;
simple1.b = 100;
simple1.c = 0.5;

结构体变量的成员变量的访问二(箭头运算符)

//定义一个结构体
struct gstudent {
    char name[20];
    int age;
    float height;
    
};

//编写一个函数,用来修改某一个学生的身高
/*接受的参数为:
    struct gstudent *   类型(一个结构体指针)
    int                 类型
 */
void changeStudentHeight (struct gstudent * student,int height) {
    student->height = height;
}

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        //结构体的初始化
        struct gstudent tom = {"tom liu",25,170};
    
        changeStudentHeight(&tom,180);//tom两个月后长到了180公分
        
        printf("tom现在的身高是%f\n",tom.height);
        
    }
    return 0;
}

例子中

student->height = height;

这一句是一种简写,因为涉及到对对象存储的值的修改所以要用到指针

所以函数:

void changeStudentHeight (struct gstudent * student,int height)

接受的参数有一个结构体指针

因而在函数内访问结构体对象的成员的值的时候需要这么做:

(* student).height = height;

简写为:

student->height = height;

相信以上用-> 访问结构体成员的方式各位iOS开发人员会有印象,后面会讲到

结构体和typedef

在 C 和 C++ 中 typedef关键字用来对一个资料类型取一个新名字,目的是为了使源代码更易于阅读和理解。

简单的解释就是typedef声明可以给原有的数据类型定义“同义词”,他的作用等同于数据类型名称

有效利用typedef声明可以简化冗长的写法:

struct gstudent {
    char name[20];
    int age;
    float height;
    
};

//改写后形式
//注意此处省掉了原来结构体的tag(gstudent)
typedef struct {
    char name[20];
    int age;
    float height;
    
}Student;

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
     //struct gstudent tom = {"tom liu",25,170};
     //使用typedef后用新的别名来声明一个变量tom2
      Student tom2 ={"tom liu",25,170};
    }
    return 0;
}




参考:维基百科、《明解C语言》

上一篇下一篇

猜你喜欢

热点阅读