D语言中国主页  D语言编辑器SciTE4D   DWin库 D语言官方网站
D语言编译器1.x最新版 OpenSource   Tango   webnews  Wiki

查看完整版本: D语言基础之函数和操作符重载

yidabu 2007-4-27 11:21

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. 支持丰富的操作符重载        下面是一些特性的演示代码。        [Copy to clipboard] [ - ]CODE:                                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为大家提供一个学习交流各种知识的平台
页: [1]
查看完整版本: D语言基础之函数和操作符重载