`
qiezi
  • 浏览: 497933 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

从C++到D

    博客分类:
  • D
阅读更多
从http://www.digitalmars.com/d/cpptod.html摘录

1、构造函数:
c++:
<!---->1 class Foo
2 {
3     Foo(int x); 
4 };
d:
<!---->1 class Foo
2 {
3     this(int x) { } 
4 }

2、基类初始化
c++:
<!---->1 class A { A() { } };
2 class B : A
3 {
4      B(int x)
5     : A()        // call base constructor 
6      {    
7      }
8 };
d:
<!---->1 class A { this() {  } }
2 class B : A
3 {
4      this(int x)
5      {    
6     super();    // call base constructor 
7     
8      }
9 }
d还支持构造函数里面调用另一个构造函数,当然不能交叉调用,否则会死循环,d编译器会阻止你这么做。
<!----> 1 class A
 2 {    int a = 7;
 3     int b;
 4     this() { b = foo(); } 
 5     this(int x)
 6     {
 7         this();
 8         a = x;
 9     }
10 }
上面的a=7会在构造函数内其它代码调用之前执行。

3、结构:
c++:
<!----> 1 #include <string.h>
 2 
 3 struct A x, y;
 4 
 5 inline bool operator==(const A& x, const A& y)
 6 {
 7     return (memcmp(&x, &y, sizeof(struct A)) == 0); 
 8 }
 9 
10 if (x == y)
11     
d:
<!---->1 A x, y;
2 
3 if (x == y) 
4     
5 

4、typedef定义新类型:
c:
<!---->1 #define HANDLE_INIT    ((Handle)(-1))
2 typedef void *Handle;
3 void foo(void *);
4 void bar(Handle);
5 
6 Handle h = HANDLE_INIT;
7 foo(h);            // coding bug not caught 
8 bar(h);            // ok
c++:(加入自动初始化)
<!----> 1 #define HANDLE_INIT    ((void *)(-1)) 
 2 struct Handle
 3 {   void *ptr;
 4 
 5     // default initializer
 6     Handle() { ptr = HANDLE_INIT; }
 7 
 8     Handle(int i) { ptr = (void *)i; }
 9 
10     // conversion to underlying type 
11     operator void*() { return ptr; }
12 };
13 void bar(Handle);
14 
15 Handle h;
16 bar(h);
17 = func();
18 if (h != HANDLE_INIT)
19     
d:
<!---->1 typedef void *Handle = cast(void *)-1
2 void bar(Handle);
3 
4 Handle h;
5 bar(h);
6 = func();
7 if (h != Handle.init)

5、友元:
c++:
<!----> 1 class A
 2 {
 3     private:
 4     int a;
 5 
 6     public:
 7     int foo(B *j);
 8     friend class B;
 9     friend int abc(A *);
10 };
11 
12 class B
13 {
14     private:
15     int b;
16 
17     public:
18     int bar(A *j);
19     friend class A;
20 };
21 
22 int A::foo(B *j) { return j->b; }
23 int B::bar(A *j) { return j->a; } 
24 
25 int abc(A *p) { return p->a; }
d:(d语言中,同一模块隐含友元声明)
<!----> 1 module X;
 2 
 3 class A
 4 {
 5     private:
 6     static int a;
 7 
 8     public:
 9     int foo(B j) { return j.b; }
10 }
11 
12 class B
13 {
14     private:
15     static int b;
16 
17     public:
18     int bar(A j) { return j.a; } 
19 }
20 
21 int abc(A p) { return p.a; }

6、操作符重载:
c++:
<!----> 1 struct A
 2 {
 3     int operator <  (int i);
 4     int operator <= (int i);
 5     int operator >  (int i);
 6     int operator >= (int i);
 7 };
 8 
 9 int operator <  (int i, A &a) { return a >  i; }
10 int operator <= (int i, A &a) { return a >= i; }
11 int operator >  (int i, A &a) { return a <  i; }
12 int operator >= (int i, A &a) { return a <= i; } 
d:
<!---->1 struct A
2 {
3     int opCmp(int i); 
4 }

7、命名空间以及using声明:
c++:
<!---->1 namespace Foo 
2 {
3     int x;
4 }
5 using Foo::x;
d:
<!---->1 /** Module Foo.d **/
2 module Foo;
3 int x;
<!---->1 /** Another module **/ 
2 import Foo;
3 alias Foo.x x;

8、RAII(资源获得即初始化)
c++:
<!---->class File
{   Handle 
*h;

    
~File()
    {
    h
->release(); 
    }
};
d:(使用auto关键字)
<!---->auto class File
{   Handle h;

    
~this()
    {
    h.release();
    }
}

void test()
{
    
if ()
    {   auto File f 
= new File();
    
    } 
// f.~this() gets run at closing brace, even if 
      
// scope was exited via a thrown exception
}

9、属性:
c++:
<!----> 1 class Abc
 2 {
 3   public:
 4     void setProperty(int newproperty) { property = newproperty; } 
 5     int getProperty() { return property; }
 6 
 7   private:
 8     int property;
 9 };
10 
11 Abc a;
12 a.setProperty(3);
13 int x = a.getProperty();
d:
<!----> 1 class Abc
 2 {
 3     // set 
 4     void property(int newproperty) { myprop = newproperty; }
 5 
 6     // get
 7     int property() { return myprop; }
 8 
 9   private:
10     int myprop;
11 }
12 
13 Abc a;
14 a.property = 3;        // equivalent to a.property(3)
15 int x = a.property;    // equivalent to int x = a.property() 

10、递归模板:
c++:(经典的阶乘模板)
<!----> 1 template<int n> class factorial
 2 {
 3     public:
 4     enum { result = n * factorial<- 1>::result }; 
 5 };
 6 
 7 template<> class factorial<1>
 8 {
 9     public:
10     enum { result = 1 };
11 };
12 
13 void test()
14 {
15     printf("%d\n", factorial<4>::result); // prints 24
16 }
d:(d语言中,实例化模板时,与模板名同名的类、函数、变量等会自动成为实例化模板的值,说着不太顺,大致是这么个意思。。)
<!----> 1 template factorial(int n)
 2 {
 3     enum { factorial = n * .factorial!(n-1) }
 4 }
 5 
 6 template factorial(int n : 1)
 7 {
 8     enum { factorial = 1 }
 9 }
10 
11 void test()
12 {
13     printf("%d\n", factorial!(4));    // prints 24 
14 }

11、元编程:
c++:
<!----> 1 #include <limits.h>
 2 
 3 template< int nbits > struct Integer
 4 {
 5     typedef Integer< nbits + 1 > :: int_type int_type ;
 6 } ;
 7 
 8 struct Integer< 8 >
 9 {
10     typedef signed char int_type ;
11 } ;
12 
13 struct Integer< 16
分享到:
评论

相关推荐

    自写CF C++外部绘制方框源码.rar_D3D外部_c++D3D绘制文字_c++cs方框绘制_c++方框绘制_方框绘制源码

    很好的C++ 绘制源码 绘制菜单 方框 D3D

    D算法的C++实现

    本篇将深入探讨D算法的C++实现,以及它在通信网理论中的应用。 Dijkstra算法是由荷兰计算机科学家艾兹格·迪杰斯特拉于1956年提出的,主要用于解决单源最短路径问题。该算法的基本思想是从起始节点开始,逐步扩展...

    c++实现的D算法的F算法

    在C++中实现Dijkstra算法,通常会用到优先队列(如二叉堆)来存储待处理的节点,以及一个距离数组来记录从源节点到各个节点的当前最短距离。 以下是Dijkstra算法的基本步骤: 1. 初始化:所有节点的距离设置为无穷...

    C++四书五经 - 01. TCPL和D&E

    本人搜集了C++四书五经中提到的所有26本书,并按照分类分别上传了7个文件,包括: 1. TCPL和D&E 2. 入门教程 3. 高效健壮编程 4. 模板和泛型编程 5. 标准库 6. 网络编程 7. 杂项(因这个文件太大,分成了2个) 与...

    Sqlite3 C++类库Sharplite 转D

    标题中的“Sqlite3 C++类库Sharplite 转D”指的是将一个基于C++的SQLite3接口库——Sharplite,移植或转换到D语言中。这个过程涉及到跨语言接口的实现,通常是为了利用D语言的特性或者为了在D项目中使用SQLite3...

    C++编程从问题分析到程序设计 PDF 01

    C++编程-从问题分析到程序设计 [美] D.S.Malik 著 电子工业出版社 本书是一本无需任何程序设计基础、内容涵盖CS1课程的权威教材。 全书的编写与设计充分考虑到学生的学习方法,借助于详尽的解释和例子对C++进行...

    C++实现三维空间中点到点、点到直线、点到平面的距离计算

    本篇文章将详细探讨如何使用C++来实现点到点、点到直线以及点到平面的距离计算。 首先,我们从点到点的距离计算开始。假设我们有两个点P1(x1, y1, z1)和P2(x2, y2, z2),它们之间的距离D可以通过欧几里得距离公式...

    C++编写经典2D游戏

    有些人喜欢MFC,用它也...因为我主要学的C++,我就只谈C++了,3D的先不谈,2D作为基础还是有必要研究,XML技术不错,现在很流行,WOW、Novashell、POPCAP FRAMEWORK等都使用了。用它来管理游戏资源及资源调度很方便。

    C++编程 从问题分析到程序设计 PDF 清晰版 2

    C++编程-从问题分析到程序设计 [美] D.S.Malik 著 电子工业出版社 本书是一本无需任何程序设计基础、内容涵盖CS1课程的权威教材。 全书的编写与设计充分考虑到学生的学习方法,借助于详尽的解释 和例子对C++进行...

    C++实现新年贺卡程序

    C++实现新年贺卡程序 C++实现新年贺卡程序是利用C++语言编写的贺卡程序,主要用于发送...该程序展示了C++语言和Windows API的应用,涉及到C++基础知识、Windows API、类和对象、图形用户界面、消息处理等多个知识点。

    visual c++ HGE游戏引擎 斜45度 伪2.5D 天气下雨下雪 日出日落 光照变化.zip

    《Visual C++与HGE游戏引擎:构建斜45度视角的伪2.5D世界》 在游戏开发领域,Visual C++(VC++)是一种常用的语言,它结合了Microsoft的MFC库和C++的强大功能,使得开发者能够创建高性能的应用程序,包括游戏。HGE...

    c++与QML相互通信 数据交互

    1. **使用信号**:在QML中,你可以创建信号并通过`Connections`组件连接到C++的槽函数。 ```qml import QtQuick 2.0 import "." Item { MyData { id: data myInt: 10 } Button { text: "Increase Int" ...

    d-pointer c++ template

    仿qt的d-pointer技术的另一种实现

    MOEA/D的C++代码

    在提供的C++代码资源中,我们可以看到以下几个关键文件,它们是实现MOEA/D算法的基础: 1. **random.h**:这是随机数生成器的头文件,对于遗传算法和进化计算来说,随机性是其核心组成部分。随机数用于初始化种群、...

    c++四书五经~介绍c++所有经典名著!

    这本书采用了一种非传统的教学方式,直接从现代C++特性入手,利用标准库进行编程,通过实例驱动的方式引导读者学习语言和库。这种方法使得学习过程更为实际和有趣,对于有一定编程基础的人来说尤其合适。 此外,C++...

    C++ 文件操作大全

    文本模式下,回车被当成一个字符'/n',而二进制模式认为它是两个字符 0x0D,0x0A。在文件操作中,需要根据实际情况选择合适的打开模式。 此外,文件操作还需要注意文件的权限问题,包括读权限、写权限和执行权限。在...

    01 C++书写HelloWorld_通用C++模板_

    在编程世界中,C++是一种强大且广泛应用的编程语言,尤其在系统软件、游戏开发、高性能计算以及嵌入式系统等领域。"01 C++书写HelloWorld_通用C++模板_"这个标题暗示了我们将探讨如何使用C++编写基础的"Hello, World...

    C++获取时间(Dev-C++可完美运行)

    在C++编程中,获取系统时间是一项常见的任务,这通常涉及到使用C++标准库中的`&lt;ctime&gt;`头文件。在这个名为“C++获取时间”的项目中,开发者提供了一个使用Dev-C++编译环境的源码示例,可以成功运行并显示当前的系统...

    eMule-0.44d-VeryCD1129源代码C++

    《eMule-0.44d-VeryCD1129源代码解析与C++编程探讨》 eMule,作为一个著名的P2P(点对点)文件分享软件,其0.44d版本的VeryCD1129源代码的公开,为开发者们提供了一次深入学习和研究P2P技术的宝贵机会。源代码是...

Global site tag (gtag.js) - Google Analytics