Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103068462
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: C/C++

2008-04-14 23:28:44

作者:李阳编译 来源:赛迪网 

创建C++应用程序

要创建一个能逐渐演变为展示你Windows视窗应用程序的空C++应用程序,首先选择File->New Project,并在界面左边选择Visual C++ projects,在界面右边选择Managed C++ Application。将该工程命名为cpp1以便让你的文件名和变量名与我的相匹配。用记事本从C#应用程序打开代码Form1.cs,选择并拷贝表格中的所有内容,粘贴到_tmain() function函数之前的cpp1.cpp中。

C#和C++之间的区别

现在的工作是要把C#语言的程序转变为C++的程序。在做这个工作的时候,请记住一点,编译器是你的朋友,它会提醒你所忘记做的任何变换。这两种语言最重要的区别主要包括:

1. C#在主名字空间与子名字空间之间、主名字空间与类之间、类与静态成员函数之间以及对象引用和实例函数之间用点号(.)隔开,而C++则使用范围分解运算符(::)来分隔前三类关系,使用符号(->)来分隔最后一类关系。

2. C#中返回的是对象的参量,而C++返回的却是指针。C++无法生成指定对象的实例,而只能得到指向该对象的一个指针,因此必须将声明由Foo改为Foo*。

3. C#可以通过菜单在工程中添加引用,而C++则需要使用#号来声明。(每个类的在线帮助都会告诉你该类是在什么样的汇编语言程序中,例如System.dll,因此你可以添加恰当地#号说明语句)。

4. C#在每个声明中都可以重复使用存取指定符(private,public,etc),而C++则是为某一特定的存取指示符开辟一部分内存。

5. C#在声明一个成员变量时可以对其进行初始化,而C++则不行。

6. C#中对于表示空参变量的关键字是null,而C++始终把空指针表示为NULL。

7. C#中,在一个基本类中忽略一个函数,你需要使用表示忽略的关键字来指示你是有意的忽略一个函数;而这样的指示对C++来说则是不必要的。

8. 虽然C#没有一个预处理器,但C#却有一些以#开头的关键字,这些关键字更多的是直接对于集成电路设备的指令而并非对于编译器的指令。这些关键字在C++中通常都不被支持,因此必须删掉。例如,在概要语句中最普通的两个带#的关键字是#region和#endregion。

9. C#可以很轻松的用圆括弧来声明非工作状态下的数组;C++却不允许把这样的数组看作是函数的参量。你或者创建一个符合要求的临时数组,或者寻找另外一个被称为多重计时的函数,这个函数无需符合要求的数组。

10. C#中把基本类直接称为base,而C++却是使用基本类的确切名称以及范围分解运算符::。

11. 在基本类库中的一些类实际上就是数值类型,这就意味着在C++中这样的类无法用新的代码语句来创建,也不能通过指针来查阅。指向(Point)和尺寸(Size)这两个类就是很好的例子。

12. 在C++中合格的函数指针语句需要一个&符号,而在C#中却没有这个要求。C#中对成员函数指针的语法指定要比C++更简单一点。

编辑成C++

了解并掌握了C#和C++之间的差异,我们接下来的工作就是一步步将你刚才粘贴到C++源文件中的那部分C#语言代码进行编译,使其成为正确的C++语言代码。

1. 在类定义的结束处找到结束性圆括弧(不要与主名字空间部分结束处的圆括弧相混淆)并在括弧后面加一个分号。

2. 将Form1类的成员声明表区:System.Windows.Forms.Form 改成Form1类的成员声明表区_gc: public System::windows::Forms::Form。

3. 将以开始使用System的代码区变换成以开始使用主名字空间System的代码区。

4. 将所有名称分隔符.改为::,例如将System.Data改为System::Data。

5. 在使用主名字空间陈述代码区之前添加以下几行代码:

#using <System.dll>
        #using <System.Drawing.dll>
        #using <System.Windows.Forms.dll>
        #using <System.Data.dll>

6. 找到那些类似System.Windows.Forms.Button这样完全符合要求的名称,将其中所有的.号改成::号,或最好去掉整个名称再将其定义成一个单词Button即可(对于程序容器来说,去掉全名可以避免编译器报错)。

7. 将在C++中被看作固定对象的对引用的声明改为指针。例如,将Button button1变成Button* button1。

8. 从各自单独的声明中去掉字private或public,并在提出声明之前的一行属于各自自身的代码中将其替换成private:或pulic:。

9. 在声明成分的代码行中去掉=null,并针对构造器添加一行代码以把该成分设置为NULL。

10. 将this.编辑并置换成this->或完全去掉,因为在这个例子中不存在任何名字上的冲突。

11. 去掉代码中任何的表示忽略的关键字。

12. 去掉所有象#region和#endregion这样的预处理指令。

13. 将点击按钮1的程序button_1Click()的标记符改为获取指针:

void button1_Click(Object* sender, System::EventArgs* e)

14. 把下列单独一行:

Controls.AddRange(new System.Windows.Forms.Control[] { label1, button1});

改为以下两行:

Controls->Add(label1); 
      Controls->Add(button1);

15. 在处理方法上,将base.Dispose( disposing ); 改为 Form::Dispose( disposing );

16. 找到那些创建新指向(Point)对象的代码行,并去掉新的关键字,这样我们可以把代码行改成如下所示的形式:

label1->Location = Point(184, 96);

17. 对于有关尺寸(Size)类的代码行也做同样的变换,但仍然使用全名称谓System::Drawing::Size,这样可以避免与表格中的尺寸属性相冲突。

18. 对InitializeComponent()这样能将button1_Click()添加到处理程序的清单列表中的函数中间部分做改动,以使得能够点击按钮1,那么代码行

this.button1.Click += new System.EventHandler(this.button1_Click);

将改为

button1->Click += new System::EventHandler(this, &#38;Form1::button1_Click);

阅读(437) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~