D语言游戏编程(10):D语言基础之函数和操作符重载

本文介绍了D语言中的函数特性,包括默认的虚函数、参数修饰符、函数指针和委托。此外,还详细讨论了操作符重载的应用,包括一元、二元操作符,比较和赋值操作符,并通过实例展示了如何在类和结构体中实现这些操作符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于D语言的函数和操作符重载:
1. 不需要声明虚函数,默认所有成员函数都为虚函数,编译器会自动优化;
2. 函数参数支持in, out, inout等修饰符;
3. 支持函数指针,不支持类成员函数指针,但是支持更方便的方式--委托(delegate)。
4. 支持丰富的操作符重载

下面是一些特性的演示代码。

import std.stdio;

void main()
{
    tryFunction();
    tryOperator();
}


// functions
//--------------------------------------
class MyBaseClass
{
    
void func(int a)
    
{
        writefln(
"MyBaseClass.func");
    }

    final 
public void finalFunc()
    
{
        writefln(
"MyBaseClass.finalFunc");
    }

    
    
void overrideFunc()
    
{
        writefln(
"MyBaseClass.overrideFunc");
    }

}


class MySubClass : MyBaseClass
{
    
void func(int a)    // 自动变为virtual
    {
        writefln(
"MySubClass.func");
    }

    
    
void finalFunc() //???
    {
        writefln(
"MySubClass.finalFunc");
    }

    
    
override void overrideFunc()
    
{
        writefln(
"MySubClass.overrideFunc");
    }

}


// function parameters
//-------------------------------------------
void myFunc(in float x, out float y, inout float z)
{
    x 
= 5;
    y 
= 6;
    z 
= 7;
}


// Function Pointers
void function(in float x, out float y, inout float z) fp;

void tryFunction()
{
    MySubClass s 
= new MySubClass;
    s.func(
1);
    s.finalFunc();
    s.overrideFunc();
    
    MyBaseClass b 
= s;
    b.func(
1);    // 调用派生类的func
    b.finalFunc();    // 调用基类的finalFunc
    b.overrideFunc(); // 调用派生类的overrideFunc
    
    
float x,y,z;
    myFunc(x,y,z);
    writefln(
"x = ", x,
            
", y = ", y,
            
", z = ",z);
            
    fp 
= &myFunc;
    writefln(fp);
    
    
// delegate
    
//------------------------
    void delegate(int a) dg;
    dg 
= &s.func;
    dg(
1);
    writefln(dg.ptr);
    writefln(dg.funcptr);

}


// Operator Overloading
//----------------------------------
class TestClass
{
    
// 一元操作符(Unary Operator)
    void opNeg()
    
{
        writefln(
"TestClass.opNeg");
    }

    
    
// 二元操作符(Binary Operator)
    void opAdd(int i)
    
{
        writefln(
"TestClass.opAdd");
    }

    
void opAdd_r(int i)
    
{
        writefln(
"TestClass.opAdd_r");
    }

    
    
// ==和!=都调用这一个函数
    int opEquals(int i)
    
{
        writefln(
"TestClass.opEquals");
        
return 1;
    }

    
    
// <, <=, > 和 >=都调用下面这个函数
    int opCmp(int i)
    
{
        
return i;
    }

}


struct MyStruct
{
    
int x,y;
    
    
static MyStruct opCall(int xx, int yy)
    
{
        MyStruct ret;
        ret.x 
= xx;
        ret.y 
= yy;
        
return ret;
    }

    
    
// Array Operator Overloading
    
//------------------------------
    int opIndex(int i)
    
{
        assert(i
>=0 && i<2);
        
if(i == 0)
            
return x;
        
else
            
return y;
    }

    
    
void opIndexAssign(int value, int i)
    
{
        assert(i
>=0 && i<2);
        
if(i == 0)
            x 
= value;
        
else
            y 
= value;
    }

    
    
// Assignment Operator Overloading
    void opAssign(int value)
    
{
        x 
= value;
        y 
= value;
    }

}


void tryOperator()
{
    TestClass t 
= new TestClass;
    
    
-t;    // 调用TestClass.opNeg
    
    t 
+ 1;    // 调用TestClass.opAdd
    1 + t;    // 调用TestClass.opAdd_r
    
    
// 调用TestClass.opEquals
    int b = t != 1;
    t 
== 1;
    
    
// 调用TestClass.opCmp
    bool r1 = t >= 1// 相当于“t.opCmp(1) > 0”
    bool r2 = t >= -1;
    writefln(r1, 
"", r2);
    
    
//
    MyStruct s = MyStruct(99,98);    // 调用MyStruct.opCall
    int x = s[0];    // 调用MyStruct.opIndex
    writefln(x);
    
    s[
0= 100;    // 调用MyStruct.opIndexAssign
    writefln(s.x);
    
    s 
= 101;    // 调用MyStruct.opAssign
    writefln(s.y);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值