c++ 和c#区别

7 篇文章 1 订阅

一、编译过程

    c++中编译过程为:预处理阶段(宏替换、文件包含、条件编译#if等)、编译阶段、汇编成目标文件、链接成可执行文件。

    c#中没有宏,编译过程如下:

    1.C#通过编译器(CSC)生成程序集(dll/exe),程序集内部是由微软中间语言(MSIL)组成。在这个过程中,CSC会检查错误,看是否符合C#的语言规范。

    2.当运行程序集的时候,公共语言运行时(CLR)中的JIT会将程序集中的中间语言(MSIL)转换成本地平台的CPU指令,然后将指令传给CPU执行。

    3.CPU运行该指令,程序开始运行。

二、static 修饰符(指定存储类型)。

        在c++里只能为对象(数据类型)和函数指定存储类型,因此c++里不会存在静态类。当用static修饰的成员或方法时,表示该成员或方法是属于类的,不属于某个具体对象,而是所有对象共享。既然属于所有对象,因此,对象可以访问静态成员和方法(与访问普通成员和方法一样);静态成员又是属于类的,因此还可以使用class::成员,class::方法来访问静态成员和方法。

        static修饰的方法里不含有this指针。因为,this指针是指向当前对象的。而静态方法是所有对象共享,因此没有this指针。也因此,在静态方法里只能访问该类下的静态成员和该类下的静态方法(但是在静态方法里是能构建别的对象,访问别的对象普通成员及方法的),因为它不属于某个具体对象,没有this指针,就不知道访问的是哪个对象的非静态方法或成员了。

        在这里说一下,this指针实在哪创建的?

        我们都知道this并不是类的成员,this在成员函数的开始执行前赋值,在成员函数执行结束后清除。
实际上编译器是这样实现this指针的:
第1.改变类成员函数的定义,用附加参数this指针来确定具体的对象。如:
void Cgoods::RegisterGoods(Cgoods*this,char*nam,int amount,float price)
{
    strcpy(this->Name,name);this->Amount=amount;
    this->price=price;
}
第2.每个类成员函数的调用,加上一个附加的实参——被调用对象的地址。如:
    Car1.RegisterGoods ( String , number , pr );
改变为:
    RegisterGoods ( &Car1 , String , number , pr);
编译器会在每个非静态的成员函数里加上一个this指针,当某个对象调用成员时,this指
针会指向该对象地址。在成员函数执行完后清除,只是清除栈空间。

    在c#里是有静态类说法的,并且静态类特征如下:

  [1] 仅包含静态成员。

  [2] 无法实例化。

  [3] 静态类的本质,是一个抽象的密封类,所以不能被继承,也不能被实例化。

  [4] 不能包含实例构造函数。

  [5] 如果一个类下面的所有成员,都需要被共享,那么可以把这个类定义为静态类。

三、构造对象

        c++中,构造函数有一般函数形式和构造函数初始化列表。在创建对象的时候调用构造函数。

        c#中,与c++的最大不同就是:1)没有构造函数初始化列表;2)在调用构造函数new对象时,有两种形式,如下:

         比如有类foo,  方式一(一般形式):new foo();方式二(c++没有该方式):new foo() { name="ff"};  方式二里调用构造函数,并在{}里给public成员赋值。

  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值