C# 系列 -- C# 和 C++ 的区别

C++ 语言

简介

C++ 是一种计算机高级程序设计语言,由C语言扩展升级而产生,较早于1979年由本贾尼·斯特劳斯特卢普在AT&T贝尔工作室研发

C++ 既可以进行 C 语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计

C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计。 C++几乎可以创建任何类型的程序:游戏、设备驱动程序、HPC、云、桌面、嵌入式和移动应用等,甚至用于其他编程语言的库和编译器也使用C++编写

C++拥有计算机运行的实用性特征,同时还致力于提高大规模程序的编程质量与程序设计语言的问题描述能力

特点

  • 与C语言的兼容性:C++与C语言完全兼容,C语言的绝大部分内容可以直接用于C++的程序设计,用C语言编写的程序可以不加修改地用于C++。
  • 数据封装和数据隐藏:在C++中,类是支持数据封装的工具,对象则是数据封装的实现。C++通过建立用户定义类支持数据封装和数据隐藏。在面向对象的程序设计中,将数据和对该数据进行合法操作的函数封装在一起作为一个类的定义。对象被说明为具有一个给定类的变量。每个给定类的对象包含这个类所规定的若干私有成员、公有成员及保护成员。完好定义的类一旦建立,就可看成完全封装的实体,可以作为一个整体单元使用。类的实际内部工作隐藏起来,使用完好定义的类的用户不需要知道类的工作原理,只要知道如何使用它即可。
  • 支持继承和重用:在C++现有类的基础上可以声明新类型,这就是继承和重用的思想。通过继承和重用可以更有效地组织程序结构,明确类间关系,并且充分利用已有的类来完成更复杂、深入的开发。新定义的类为子类,成为派生类。它可以从父类那里继承所有非私有的属性和方法,作为自己的成员。
  • 多态性:采用多态性为每个类指定表现行为。多态性形成由父类和它们的子类组成的一个树型结构。在这个树中的每个子类可以接收一个或多个具有相同名字的消息。当一个消息被这个树中一个类的一个对象接收时,这个对象动态地决定给予子类对象的消息的某种用法。多态性的这一特性允许使用高级抽象。继承性和多态性的组合,可以轻易地生成一系列虽然类似但独一无二的对象。由于继承性,这些对象共享许多相似的特征。由于多态性,一个对象可有独特的表现方式,而另一个对象有另一种表现方式。

C# 语言

简介

C#是微软公司发布的一种由C和C++衍生出来的面向对象的编程语言、运行于.NET Framework.NET Core跨平台)之上的高级程序设计语言。C#看起来与Java有着惊人的相似;它包括了诸如单一继承、接口、与Java几乎同样的语法和编译成中间代码再运行的过程。但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,而且它是微软公司 .NET windows网络框架的主角。

C#是由C和C++衍生出来的一种安全的、稳定的、简单的、优雅的面向对象编程语言。它在继承C和C++强大功能 的同时去掉了一些它们的复杂特性(例如没有宏以及不允许多重继承)。C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的优选语言。

C#是面向对象的编程语言。它使得程序员可以快速地编写各种基于MICROSOFT .NET平台的应用程序,MICROSOFT .NET提供了一系列的工具和服务来最大程度地开发利用计算与通讯领域。

C#使得C++程序员可以高效 的开发程序,且因可调用由 C/C++ 编写的本机原生函数,而绝不损失C/C++原有的强大的功能。因为这种继承关系,C#与C/C++具有极大的相似性,熟悉类似语言的开发者可以很快的转向C#。

特点

C# 语言是一种安全的、稳定的、简单的、面向对象的编程语言, 它不仅去掉了 C++ 和 Java 语言中的一些复杂特性,还提供了可视化工具,能够高效地编写程序。C# 语言具备如下 4 个特点:

  • 简单、安全 :在 C++ 和 C 语言中程序员最头疼的问题就是指针问题,在 C# 语言中已经不再使用指针 ,而且不允许直接读取内存等不安全的操作。它比 C、C++、Java 提供了更多的数据类型,并且每个数据类型都是固定大小的。此外还提供了命名空间来管理 C# 文件,命名空间 相当于一个文件夹,在创建程序时,允许在一个命名空间中创建一个或多个类,方便调用和重用。
  • 面向对象 :与其他面向对象语言一样,C# 语言也具有面向对象语言的基本特征,即封装、继承、 多态。封装就是将代码看作一个整体,例如使用类、方法、接口等。在使用定义好的类、 方法、接口等对象时不必考虑其细节,只需要知道其对象名以及所需要的参数即可,也是一种提升代码安全性的方法。继承是一种体现代码重用性的特性,减少代码的冗余,但在 C# 语言中仅支持单继承。多态不仅体现了代码的重用性,也体现了代码的灵活性,它主要通过继承和实现接口的方式,让类或接口中的成员表现出不同的作用。
  • 支持跨平台:较早的 C# 语言仅能在 Windows 平台上开发并使用,目前最新的 C# 6.0 版本已经能在多个操作系统上使用,例如在 Mac、Linux 等。此外,还能将其应用到手机、PDA 等设备上。
  • 开发多种类型的程序:使用 C# 语言不仅能开发在控制台下运行的应用程序,也能开发 Windows 窗体应用程序、网站、手机应用等多种应用程序,并且其提供的 Visual Studio 2015 开发工具中也支持多种类型的程序,让开发人员能快速地构建 C# 应用程序。

两者区别

语言特性不同

  • C++ 语言 :C++ 提供了许多高级语言特性,如模板、多重继承、运算符重载等。
  • C# 语言 :C# 也提供了许多高级语言特性,如属性、事件、委托、LINQ、异步编程等。C# 的语法相对简单,易于学习。

以下示例:定义一个按钮类 Button,监听其点击事件

C++(没有内置事件支持):

cpp 复制代码
#include <iostream>
#include <functional>

class Button {
public:
    std::function<void()> OnClick;

    void Click() {
        if (OnClick) {
            OnClick();
        }
    }
};

void OnButtonClick() {
    std::cout << "Button clicked" << std::endl;
}

int main() {
    Button btn;
    btn.OnClick = OnButtonClick;
    btn.Click();

    return 0;
}

C#(内置事件支持):

csharp 复制代码
using System;

class Button {
    public event EventHandler OnClick;

    public void Click() {
        OnClick?.Invoke(this, EventArgs.Empty);
    }
}

class Program {
    static void Main() {
        Button btn = new Button();
        btn.OnClick += OnButtonClick; // 事件
        btn.Click();
    }

    static void OnButtonClick(object sender, EventArgs e) { // event
        Console.WriteLine("Button clicked");
    }
}

在这个示例中,C++ 代码使用 std::function 模拟事件处理,而 C# 代码使用内置的 event 关键字支持事件。

内存管理不同

  • C++ 语言 :C++ 使用手动 内存管理,程序员需要显式地分配和释放内存。这提供了更高的内存控制,但也增加了内存泄漏野指针等错误的风险。
  • C# 语言 :C# 使用垃圾回收(GC)来自动 管理内存,这简化了内存管理,减少了内存泄漏和野指针等错误的风险,但可能导致性能损失

C++(手动内存管理):

cpp 复制代码
#include <iostream>

int main() {
    int* arr = new int[5]; // 分配内存
    for (int i = 0; i < 5; ++i) {
        arr[i] = i + 1;
    }
    for (int i = 0; i < 5; ++i) {
        std::cout << arr[i] << std::endl;
    }
    delete[] arr; // 需要手动释放内存
    return 0;
}

C#(垃圾回收):

csharp 复制代码
using System;

class Program {
    static void Main() {
        int[] arr = new int[5];
        for (int i = 0; i < 5; ++i) {
            arr[i] = i + 1;
        }
        foreach (int num in arr) {
            Console.WriteLine(num);
        }
    }
}

在这个示例中,C++ 代码使用 newdelete[] 进行手动内存管理,而 C# 代码依赖于垃圾回收自动管理内存。

类型安全不同

  • C++ 语言:C++ 允许程序员执行不安全的类型转换,这可能导致运行时错误
  • C# 语言:C# 是一种类型安全的语言,它在编译时检查类型转换,以防止类型错误

C++ 允许不安全的类型转换:

cpp 复制代码
#include <iostream>

int main() {
    int num = 42;
    double* ptr = reinterpret_cast<double*>(&num); // 不安全类型转换
    std::cout << *ptr << std::endl;

    return 0;
}

不安全的原因是:reinterpret_cast 将一个 int 类型的指针转换为 double 类型的指针,后面可能会导致运行时错误

C++ 中安全的类型转换:

cpp 复制代码
#include <iostream>

int main() {
    int num = 42;
    double d = static_cast<double>(num); // 安全类型转换:int 转 double
    std::cout << d << std::endl;

    return 0;
}

C# 安全的类型转换:

csharp 复制代码
using System;

class Program {
    static void Main() {
        int num = 42;
        double d = Convert.ToDouble(num); // 安全类型转换
        Console.WriteLine(d);
    }
}

平台支持不同

  • C++ 语言:和 C 语言一样可以在多个平台上编译和运行,包括 Windows、Linux、macOS、Android 等操作系统。
  • C# 语言 :C# 语言的运行依赖于 .NET Framework,因此主要在 Windows 平台上使用。不过,C# 也支持多平台开发,可以使用 .NET Core 进行开发并支持 Windows、Linux、macOS 平台。

参考文章

相关推荐
JSU_曾是此间年少22 分钟前
数据结构——线性表与链表
数据结构·c++·算法
此生只爱蛋1 小时前
【手撕排序2】快速排序
c语言·c++·算法·排序算法
何曾参静谧2 小时前
「C/C++」C/C++ 指针篇 之 指针运算
c语言·开发语言·c++
Envyᥫᩣ2 小时前
C#语言:从入门到精通
开发语言·c#
lulu_gh_yu2 小时前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法
ULTRA??3 小时前
C加加中的结构化绑定(解包,折叠展开)
开发语言·c++
凌云行者4 小时前
OpenGL入门005——使用Shader类管理着色器
c++·cmake·opengl
凌云行者4 小时前
OpenGL入门006——着色器在纹理混合中的应用
c++·cmake·opengl
~yY…s<#>4 小时前
【刷题17】最小栈、栈的压入弹出、逆波兰表达式
c语言·数据结构·c++·算法·leetcode
可均可可5 小时前
C++之OpenCV入门到提高004:Mat 对象的使用
c++·opencv·mat·imread·imwrite