发新话题
打印

[转载D语言文档] D语言基础之函数和操作符重载

D语言基础之函数和操作符重载

知识若不分享 实在没有意义 http://www.d-programming-language-china.org 20070427

点击下面网址查看原文:
http://www.d-programming-language-china.org

by: 燕良
from: http://blog.csdn.net/yanonsoftware/archive/2007/01/15/1483818.aspx

关于D语言的函数和操作符重载:
1. 不需要声明虚函数,默认所有成员函数都为虚函数,编译器会自动优化;
2. 函数参数支持in, out, ref等修饰符;
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, ref float z)
{
    x = 5;
    y = 6;
    z = 7;
}

// Function Pointers
void function(in float x, out float y, ref 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);
}

D语言论坛 http://www.d-programming-language-china.org 注:
输出信息如下:

QUOTE:
MySubClass.func
MySubClass.finalFunc
MySubClass.overrideFunc
MySubClass.func
MyBaseClass.finalFunc
MySubClass.overrideFunc
x = nan, y = 6, z = 7
4020E8
MySubClass.func
910FE0
402084
TestClass.opNeg
TestClass.opAdd
TestClass.opAdd_r
TestClass.opEquals
TestClass.opEquals
true, false
99
100
101
( lastupdate:20070427 最新文章请访问http://www.d-programming-language-china.org )

关于一大步成功社区:
yidabu提倡在交流中学习,在分享中提高
收集感兴趣的知识,写下心得,通过网络与别人一起分享
理解一点就实践一步,收获什么就分享什么,成功就是这样一点点一步步累积起来的
网络只是一个工具,只有自己身心提高才是实实在在的。d-programming-language-china.org为大家提供一个学习交流各种知识的平台

TOP

发新话题