object-c对象的创建

和C++不同的是,object-c中并没有规定说一定要实现一个构造函数和析构函数;所以,在object-c中,其实没有构造函数和析构函数这样的概念,取而代之的应该是对象的创造和初始化,对象的释放。在object-c中,调用alloc/init其实就是进行对象的创造和初始化,或者,用户也可以自己写一个函数,只要完成类的数据成员的初始化,并且返回这个本实例的指针(self)即可。实例如下:

1. 代码:

在本系列实例“2.创建一个简单的类(object-c)”中,增加如下代码:

// Fraction.h

-(Fraction*) initWithNumerator: (int) n denominator: (int) d;
-(Fraction*) init: (int) n denominator: (int) d;

-(void) setNumerator: (int) n andDenominator: (int) d;


// Fraction.m

-(Fraction*) initWithNumerator: (int) n denominator: (int) d {
    self = [super init];

    if ( self ) {
        [self setNumerator: n andDenominator: d];
    }
    return self;
}

-(Fraction*) init: (int) n denominator: (int) d {
    self = [super init];

    if ( self ) {
        [self setNumerator: n andDenominator: d];
    }

    return self;
}


-(void) setNumerator: (int) n andDenominator: (int) d {

    numerator = n;
    denominator = d;
}


// main.m

#import <stdio.h>
#import "Fraction.h"


int main( int argc, const char *argv[] ) {
    // create a new instance
    Fraction *frac = [[Fraction alloc] init];
    Fraction *frac2 = [[Fraction alloc] init];
    Fraction *frac3 = [[Fraction alloc] initWithNumerator: 1 denominator: 3];
    Fraction *frac4 = [[Fraction alloc] init: 1 denominator: 4];


    // set the values
    [frac setNumerator: 1];
    [frac setDenominator: 1];


    // combined set
    [frac2 setNumerator: 1 andDenominator: 2];


    // print it
    printf( "The fraction is: " );
    [frac print];
    printf( "\n" );


    printf( "Fraction 2 is: " );
    [frac2 print];
    printf( "\n" );


    printf( "Fraction 3 is: " );
    [frac3 print];
    printf( "\n" );
    
    printf( "Fraction 4 is: " );
    [frac4 print];
    printf( "\n" );


    // free memory
    [frac release];
    [frac2 release];
    [frac3 release];
    [frac4 release];


    return 0;
}

2. 编译:同示例2 .

3.说明:

(1). initWithNumerator 和 init都可以认为是Fraction的构造函数,但是,init是重写了父类(NSObject)而实现的; 而initWithNumerator可以认为是一个普通函数,但完成了Fraction的初始化,所以,也可以认为是一个构造函数。因为object-c中没有像c++或java中的构造函数必须与类名同名这一限制条件。

(2).一定要在实现代码的时候,先调用父类的init,再初始化自己的数据成员,并且返回self.

(3).事实上,init的函数返回值应该定义为id.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值