第一部分 1.10 OC基础语法-点语法、构造方法、结构体

一、点语法

新建一个person类

#import <Foundation/Foundation.h>

@interface Person : NSObject {
    int _age;
}

- (void)setAge:(int)age; // 方法名是setAge:
- (int)age; // 方法名是age

// 方法名是setAge:andNo:
// - (void)setAge:(int)newAge andNo:(int)no;
@end
#import "Person.h"

@implementation Person

- (void)setAge:(int)age {
    NSLog(@"调用了setAge方法:%i", age);
    _age = age;

    // 这是错误的写法,会导致死循环,无限调用set方法
    // self.age = newAge;// [self setAge:newAge];
}

- (int)age {
    NSLog(@"调用了age方法:%i", _age);

    return _age;
}
@end

在main.m中实现点语法

#import <Foundation/Foundation.h>
#import "Person.h"

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        Person *person = [[Person alloc] init];

        person.age = 10; // 等效于[person setAge:10];

        int age = person.age; // 等效于int age = [person age];

        NSLog(@"age is %i", age);

        [person release];
    }
    return 0;
}

二、构造方法

新建一个student类

#import <Foundation/Foundation.h>

@interface Student : NSObject {
    int _age;
    int _no;
}

- (void)setAge:(int)age;
- (int)age;

- (void)setNo:(int)no;
- (int)no;

// 自己写一个构造方法
- (id)initWithAge:(int)age andNo:(int)no;

@end
#import "Student.h"

@implementation Student

- (void)setAge:(int)age {
    _age = age;
}

- (void)setNo:(int)no {
    _no = no;
}

- (int)age {
    return _age;
}

- (int)no {
    return _no;
}
// 实现构造方法
- (id)initWithAge:(int)age andNo:(int)no {
    // 首先要调用super的构造方法
    // self = [super init];

    // 如果self不为nil
    if (self = [super init]) {
        // _age = age;
        // _no = no;
        self.age = age;
        self.no = no;
    }

    return self;
}

// 重写父类的description方法
// 当使用%@带打印一个对象的时候,会调用这个方法
- (NSString *)description {
    NSString *str = [NSString stringWithFormat:@"age is %i and no is %i", self.age, self.no];
    return str;
}

// 如果直接把方法写在.m文件中,没有在.h文件中进行声明,那么这就是私有方法

// 谁调用方法,self就指向谁
- (void)test {
    int age = self.age;
}

+ (void)test2 {
    [Student alloc];

    [self alloc];

    // 上面两句代码是等效的
}
@end

然后再新建goodstudent继承student

#import "Student.h"

@interface GoodStudent : Student

@end
#import "GoodStudent.h"

@implementation GoodStudent

// 子类访问了父类的成员变量
- (void)test {
    _age = 10;
}
@end

main.m中实现

#import <Foundation/Foundation.h>
#import "Student.h"

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        // char *s = "neal";  C语言中字符串

        NSString *str =  @"itcast"; // OC中的字符串

        Student *stu = [[Student alloc] initWithAge:15 andNo:2];

        // NSLog(@"age is %i and no is %i", stu.age, stu.no);
        // %@代表打印一个OC对象
        NSLog(@"%@", stu);

        [stu release];
    }
    return 0;
}

三、结构体的定义,代码实现

#include <stdio.h>

void test() {
    // 这个机构只能在函数内部使用
    // 定义一个名为Student的结构体类型
    struct Student {
        int age; // 年龄
        char *name; // 姓名
        float height; // 身高
    };

    // 定义一个结构体变量
    struct Student stu = {27, "mj", 1.8f};
    // 下面这行的初始化是错误的
    // stu = {27, "mj", 18.0f};

    stu.age = 28;

    printf("age=%d\n", stu.age);
    printf("name=%s\n", stu.name);
    printf("height=%.1f\n", stu.height);
}

void test1() {
    struct Student {
        int age; // 年龄
        char *name; // 姓名
        float height; // 身高
    } stu = {27, "mj", 1.8f};

    struct Student stu1 = {28, "lmj", 1.9f};

    struct {
        int age; // 年龄
        char *name; // 姓名
        float height; // 身高
    } stu2 = {27, "mj", 1.8f};

    struct {
        int age; // 年龄
        char *name; // 姓名
        float height; // 身高
    } stu3 = {27, "mj", 1.8f};
}

void test2() {
    // 定义一个Date结构体
    struct Date {
        int year;
        int month;
        int day;
    };

    // 定义一个学生结构体
    struct Student {
        int age;
        struct Date birthday;
    };

    struct Student stu = {27, {2009, 10, 10}};

    printf("age=%d\n", stu.age);
    printf("year=%d\n", stu.birthday.year);
    printf("month=%d\n", stu.birthday.month);
    printf("day=%d\n", stu.birthday.day);
}

void test3() {
//    struct Student {
//        int age; // 年龄
//        char *name; // 姓名
//        float height; // 身高
//    };
//    struct Student a[2] = {{27, "mj", 1.8f}, {28, "lmj", 1.9f}};

    struct Student {
        int age; // 年龄
        char *name; // 姓名
        float height; // 身高
    } a[2] = {{27, "mj", 1.8f}, {28, "lmj", 1.9f}};

    struct Student a2[4];
}

struct Person {
    int age;
};

void change(struct Person p) {
    p.age = 9;
}
// 结构体作为函数参数
void test4() {
    struct Person person = {27};
    change(person);

    printf("age=%d", person.age);
}

// 指向结构体的指针
void tets5() {
    // 定义一个结构体变量
    struct Person person = {27};
    // 定义一个指向结构体的指针
    struct Person *p;
    // 让指针p指向结构体person
    p = &person;

    printf("age=%d\n", person.age);
    printf("age=%d\n", (*p).age);
    printf("age=%d\n", p->age);
}

int main(int argc, const char * argv[])
{
    tets5();
    return 0;
}
时间: 2024-10-12 22:11:09

第一部分 1.10 OC基础语法-点语法、构造方法、结构体的相关文章

第七天:C基础之字符串操作与结构体

培训的第七天,来成都的十天.来的一行人都觉得好累.也许是因为天气原因,也许是因为今天所讲的内容开始不好理解了. 早上主要讲了字符串相关的两个函数的操作.strstr和strtok ,strstr前面接触过,是查找子串,返回地址.strtok是使用分隔符分割字符串.今天的第一个程序就是不使用这两个函数实现将字符串中的单词分割出来存在二维数组中.这个使用一次循环就能够完成,循环遍历遇到空格是用'\0'代替.代码如下: 1 #include<stdio.h> 2 #include<stdlib

第一部分 1.8 OC基础语法-Block

一.Block基本含义 Block封装了一段代码,可以在任何时候执行 Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值. 苹果官方建议尽量多用block.在多线程.异步任务.集合遍历.集合排序.动画转场用的很多 二.Blocks的定义 Blocks的定义: int (^MySum)(int, int) = ^(int a, int b) { return a+b; }; 定义了一个叫MySum的blocks对象,它带有两个int参数,返回int.等式右边就是block

第一部分 1.12 OC基础语法-类的声明和实现,static和变量,typedef

新建一student类 只是用来声明Student这个类有哪些成员变量和方法 #import <Foundation/Foundation.h> // @interface代表声明一个类 // : 代表继承 @interface Student : NSObject { // 成员变量要定义在下面的大括号中{} int age; int no; } // 在这里声明的所有方法都是公共 // age的get方法 // - 代表动态方法 + 代表静态方法 - (int)age; // age的se

2014.12.10 OC基础复习

oc是一种没有垃圾回收机制的语言,再没有打开arc的情况下,需要手动管理内存 @为关键字的开头,也是字符串的开头 @interface --@end 写对类的声明,包括对成员变量和方法的声明,@implementaion --@end之间写对类的方法实现,方法形如- (void)setAge:int; +号表示静态方法,-号表示动态方法 对象的声明初始化都是Student *st = [[Student alloc]init]; st指针就表示该对象 st.age不是访问成员变量,而是根据情况调

OC基础复习(六)之构造方法小结

写到这里心慌慌的,压力骤然而起, 1.什么是构造方法? OC构造方法 构造方法我们创建一个对象的时候一般喜欢直接调用一个类方法,比如有一个Person类,我们为这个Person类创建对象一般是直接这样[Person new];其实new是NSObject中的一个类方法,这个new方法中是先调用了alloc方法,alloc方法也是一个类方法,作用是创建这个类的对象,再将这个对象的指针返回:再调用创建的对象的对象方法init,作用是初始化创建的对象的属性,然后返回这个已经被初始化的对象.比如: Pe

OC基础(七)构造方法与自定义构造方法

一.构造方法 在OC中构造方法是init开头的方法, 用于初始化一个对象, 让某个对象一创建出来就拥有某些属性和值. 构造方法属于对象方法,以“-”开头 例如:在创建对象的时候就调用了init方法. Person *p = [[Person alloc] init]; 可以分解为 Person *p1 = [Person alloc]; //分配空间 Person *p = [p1 init];  //初始化对象,即调用init方法 书写格式: - (instancetype)init { se

语法*第九章*6 结构体变量作为函数参数

#include<stdio.h> struct student{ int num; char name[20]; float score; } stu={112301,"bowen1",20}; void print(struct student stux); int main(void){ print(stu); } void print(struct student stux){ printf("%d %s %0.1f",stux.num,stux

语法*第九章*5 结构体指针作为函数参数

#include<stdio.h> struct student{ int num; char name[20]; float score; } stu={112301,"bowen1",20}; void print(struct student *p); int main(void){ print(&stu); } void print(struct student *p){ printf("%d %s %0.1f",p->num,p-

OC基础笔记——创建类2(广州黑马一期)

// // main.m // 04-创建类2 // // Created by Apple on 14/11/17. // Copyright (c) 2014年 itcast. All rights reserved. // #import <Foundation/Foundation.h> /* 类名:Zombies 属性:life,颜色,位置,形状 行为:走,咬,死,loseLife 炮弹 类名:Cannonball 属性:大小,威力,飞行距离,速度 行为:飞,爆炸 车 类名:Car