自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(23)
  • 收藏
  • 关注

原创 int 和long long int区别

无符号类型:unsigned int 表示非负整数,范围从 0 到 2^32 - 1(对于 4 字节的 unsigned int),unsigned long long int 表示非负整数,范围从 0 到 2^64 - 1(对于 8 字节的 unsigned long long int)。long long int:表示的数值范围通常是 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807(对于 8 字节的 long long int)。

2025-01-02 16:54:28 1284

转载 C#委托怎么理解

简单来说,委托是一种引用类型,它封装了一个或多个方法,允许在运行时动态调用这些方法。当调用委托时,它会依次调用这些方法。委托是一种强大且灵活的功能,它让方法的引用变得更加简洁和类型安全,能够使你在运行时动态地指定和调用方法。类型安全:C#的委托是类型安全的,即方法签名必须匹配委托的定义,避免了普通函数指针可能带来的类型不匹配问题。创建委托实例: 通过 new 关键字,你可以创建一个委托实例,并将一个匹配委托签名的方法赋给它。调用委托: 创建了委托实例之后,你可以通过委托调用所封装的方法。

2024-12-31 13:25:39 319

原创 c# 反射怎么理解

在 C# 中,反射(Reflection)是指在运行时检查类型的元数据(如类、属性、方法等)的能力。通过反射,可以动态地获取和操作对象的类型信息,而不需要在编译时硬编码。这使得我们能够在运行时发现类的结构、方法、属性、字段等,甚至可以动态地创建对象、调用方法和访问字段。反射在很多应用场景中非常有用,尤其是以下几个方面:动态类型信息:可以在运行时获取有关类型的信息,如获取类的属性、方法、构造函数等。动态调用:可以动态调用一个类型的方法、构造函数或访问属性,而不需要在编译时就确定具体的类型。框架设计:许

2024-12-26 11:27:12 196

原创 字节序和位序怎么理解

假设有一个16位的数据0x1234(十六进制),在内存中,它在大端字节序和小端字节序下的排列方式会有所不同,但每个字节内的位序通常是相同的(高位在前,低位在后)。字节序和位序在许多场合下是独立的,字节序关心的是数据字节的排列顺序,而位序关心的是字节内位的排列顺序。字节序和位序在不同的系统和协议中可能有所不同,因此在跨平台或网络通信时,需要特别注意字节序和位序的转换,避免数据解释错误。字节序(Endianess)是指数据多字节部分在内存中的排列顺序:大端字节序(高字节在前)和小端字节序(低字节在前)。

2024-12-24 18:10:25 986

原创 虚析构怎么理解

虚析构函数(virtual destructor)是指在基类中声明为虚函数的析构函数,它在类的继承体系中具有特别的重要性,特别是当通过基类指针或引用删除派生类对象时。基类析构函数的虚拟性:如果基类没有虚析构函数,而派生类的析构函数是虚函数,那么派生类析构函数仍然会正常调用,但基类析构函数不会保证在删除对象时正确调用。虚析构函数确保在通过基类指针删除派生类对象时,派生类和基类的析构函数都能被正确调用,避免了资源泄漏的风险。现在程序正确地调用了派生类和基类的析构函数,确保了派生类的资源被释放,避免了内存泄漏。

2024-12-24 17:49:30 529

原创 虚函数和虚函数表

由于 basePtr 指向的是一个 Derived 对象,所以 vptr 指向 Derived 类的虚函数表,最终调用到 Derived::show() 和 Derived::info()。在这个例子中,Base 类的 show() 方法被声明为 virtual,这样当 basePtr 指向 Derived 对象时,通过基类指针调用的 show() 会动态绑定到派生类中的实现,最终输出 Derived class show。这样就实现了动态绑定,能够在运行时确定具体调用的是基类函数还是派生类的重写函数。

2024-10-18 11:12:13 1107

原创 没有virtual,子类可以重写吗

在上面的例子中,虽然 Derived 类重写了 Base 类的 show 方法,但是由于基类的方法不是 virtual 的,当使用基类指针 basePtr 调用 show() 时,调用的是 Base 类的方法,而不是 Derived 类的方法。也就是说,当你通过基类的指针或引用调用这个函数时,调用的仍然是基类的版本,而不是子类的版本。没有 virtual 的情况下,子类可以重写基类的方法,但这种重写不会实现运行时多态,而是基于静态绑定,基类指针调用的仍是基类的方法。使用 virtual 的函数重写。

2024-10-18 10:23:58 493

原创 多态包含哪些

多态(Polymorphism)是面向对象编程中的一个重要概念,它允许同一接口或函数作用于不同的数据类型,并根据不同对象的具体类型表现出不同的行为。函数重载(Function Overloading):同一个作用域内定义多个函数名相同但参数列表不同的函数,编译器在编译时根据参数的类型和数量选择合适的函数。虚函数(Virtual Function):在基类中声明一个函数为 virtual,使得派生类可以重写该函数,运行时根据对象的实际类型调用正确的实现。抽象类包含至少一个纯虚函数,是实现多态的基础。

2024-10-18 10:14:18 435

原创 单例模式有哪些

选择哪种实现方式取决于应用程序的需求和运行环境,比如是否需要线程安全、实例化的成本以及内存管理的复杂性。静态局部变量单例:C++11 提供的线程安全静态初始化,简单且高效。使用 C++11 标准的静态局部变量初始化,线程安全且实现简单。懒汉式单例:需要延迟加载,但在多线程环境中需注意线程安全问题。实例在首次访问时创建,节省内存,适合需要延迟加载的场景。双重检查锁:性能优化的线程安全实现,适用于高并发环境。线程安全懒汉式:多线程场景下的安全实现。适合需要高效且线程安全的单例模式实现。

2024-10-18 09:18:28 437

原创 工厂模式有哪几种

工厂方法模式和抽象工厂模式更符合面向对象设计原则,尤其是“开闭原则”和“单一职责原则”,它们在应用场景上侧重于产品扩展的灵活性和维护性。简单工厂模式:使用一个工厂类根据条件来创建具体产品,不符合开闭原则,适合简单情况。抽象工厂模式:为产品族提供一个创建接口,适合创建一组相关或相互依赖的对象。工厂方法模式:为每种具体产品提供一个具体工厂,符合开闭原则,扩展性好。不符合开闭原则(每当添加新产品类时需要修改工厂类代码)。增加新产品族时比较简单,但增加新的产品种类时比较困难。工厂类负责所有产品对象的创建。

2024-10-17 20:05:48 399

原创 qt connect如何传递参数

在 Qt 中,connect 函数通常用于将信号和槽连接起来,槽函数在信号发出时被调用。在现代 C++ 中,使用 lambda 表达式是最简单且灵活的方式来为 Qt 的 connect 传递参数。在这个例子中,signalMapper 用于将按钮的点击信号映射到对应的整数值,这样在调用 someSlot(int) 时可以接收到特定的参数。在上面的代码中,someValue 是一个额外的参数,当按钮被点击时,someSlot(someValue) 会被调用。

2024-10-17 19:54:14 995

原创 Qt 为什么不需要析构

连接信号和槽时,可以指定Qt::AutoConnection或者Qt::QueuedConnection等类型,这样槽函数在对象销毁时自动断开,避免了内存问题。在通常的Qt应用中,开发者通过合理设置父子关系以及使用Qt提供的内存管理工具,减少了显式析构对象的需要。因此,Qt在大多数情况下不需要显式地编写析构函数来管理内存,除非涉及到非QObject类型或手动分配的资源(如文件句柄、网络连接等)。在C++中,Qt框架通过智能指针和父子对象系统管理内存,使得在大多数情况下,开发者不需要显式调用析构函数。

2024-10-10 09:11:51 320

原创 c++设计模式

C++ 中常用的设计模式根据需求和应用场景选择合适的设计模式来优化项目设计,能够大大提升项目的质量和开发效率。创建型模式主要用于对象的创建,封装了对象实例化的过程,目的是提高代码的灵活性和可复用性。结构型模式关心类或对象的组合关系,用来解决类之间的继承、组合、依赖等结构问题。应用场景:当有多个维度的变化时(如形状、颜色),需要通过组合的方式降低复杂性。应用场景:适用于需要生成多种产品系列的场景,如不同操作系统的 UI 控件。应用场景:需要在运行时动态选择算法的场景,如不同的排序策略。

2024-09-04 17:06:59 1215

原创 四种智能指针如何理解

智能指针在 C++11 标准中通过头文件 提供了四种主要类型:std::unique_ptr、std::shared_ptr、std::weak_ptr、和 std::auto_ptr(已废弃)。std::unique_ptr 表示独占所有权。auto_ptr 已废弃,类似 unique_ptr,但不安全 已被废弃,使用 unique_ptr 或 shared_ptr 替代。weak_ptr 弱引用,不管理资源,不增加引用计数 需要引用 shared_ptr 但不影响对象生命周期,避免循环引用。

2024-09-04 09:49:15 1021

原创 const修饰函数放在函数前和函数结尾的区别

注意:如果函数返回的是基本数据类型(如 int),在大多数情况下加 const 意义不大,因为返回值是拷贝,无法修改原值。下面来解释这两种情况。const 放在函数结尾(类成员函数):表示这个成员函数不会修改当前对象的成员变量,也不能调用其他非 const 成员函数,用于保持对象的状态不被改变。含义:const 修饰的成员函数不能修改当前对象的成员变量,也不能调用其他非 const 成员函数。const 放在函数返回类型前:表示返回的值是常量,调用者不能修改返回的值,通常用于返回指针或引用时防止修改数据。

2024-09-04 09:41:19 927

原创 指针的引用怎么理解

在 changePointer 函数中,虽然我们传递的是 ptr,但实际上操作的是 ptr 的引用,因此可以修改指针本身,使其指向新的对象。这和指针的普通传递不同,普通传递中只能修改指针指向的内容,而不能修改指针本身的地址。指针的引用:指向的是指针本身,而不是指针所指向的变量。这意味着通过指针的引用,我们可以修改该指针本身的值,即让该指针指向不同的对象。通过指针的引用,能够方便地在函数中修改指针的值(即指针指向的地址),在动态内存管理或需要改变指针指向的场景中非常有用。

2024-09-04 09:36:23 395

原创 c++ 引用和指针的区别

指针:指针有多种 const 组合,比如 const int* 表示指针所指向的值是常量,int* const 表示指针本身是常量,const int* const 表示指针和指向的值都是常量。指针:指针常用于动态内存分配、数组操作、实现复杂数据结构(如链表、树等),并且可以指向空值表示未初始化状态。引用:语法简单,适合用作函数参数或返回值,是对象的别名,绑定后无法改变所指向的对象。指针:指针在使用时需要使用解引用操作符(*)来访问指针所指向的对象。

2024-09-04 09:32:54 454

原创 c++ vector和array的区别

C++ 中的 vector 和 array 是两种常见的容器类型,它们的主要区别如下:

2024-09-04 09:18:48 518

原创 c++四种强制转换符怎么理解

在 C++ 中,有四种主要的强制转换符,分别是 static_cast, dynamic_cast, const_cast, 和 reinterpret_cast。它们各自有不同的用途和语法,用于不同的类型转换场景。这些转换符在不同场景下有各自的用途,理解它们的适用范围和限制对于编写安全且高效的 C++ 代码至关重要。dynamic_cast:用于带有虚函数的多态类型之间的转换,运行时检查。static_cast:用于相关类型之间的转换,编译时检查。

2024-08-14 15:58:25 321

原创 智能指针和传统指针理解

主要类型包括 std::unique_ptr、std::shared_ptr 和 std::weak_ptr。限制和规范使用:如 std::unique_ptr 禁止复制但允许移动,std::shared_ptr 通过引用计数共享所有权,而 std::weak_ptr 用于打破循环引用。智能指针是现代 C++ 中推荐的做法,因为它们通过自动化的资源管理减少了错误的发生,使得代码更加安全和健壮。智能指针和传统指针(或原始指针)都是 C++ 中用来引用其他对象的工具,但它们在功能和使用方式上有显著的差异。

2024-07-30 14:22:23 536

原创 智能指针理解

在 C++ 中,智能指针是标准库的一部分,主要包括 std::unique_ptr, std::shared_ptr, 和 std::weak_ptr。std::weak_ptr 是一种不控制对象生命周期的智能指针,它设计用来解决 std::shared_ptr 相互引用时可能导致的循环引用问题。std::weak_ptr 持有对对象的非拥有性引用,它需要与 std::shared_ptr 合作使用。std::shared_ptr 是一种共享所有权的智能指针。可以被安全地复制和传递,引用计数会自动更新。

2024-07-30 14:10:46 315

原创 Revit二次开发-合并多个实体

Revit二次开发-合并多个实体很久没发博客了,这篇博客记录一下一个比较实用的方法,传入多个实体进行合并,返回合并过后的实体下面是代码: /// <summary> /// 将多个solid合并成一个solid /// </summary> /// <param name="solids"></param> /// <returns></returns>

2021-08-30 09:46:11 1335

原创 WPF开发之2D绘图

WPF开发之2D绘图WPF绘图的工具可以用到路径Path、Geometry对象、可视化对象DrawingVisual,这三种的量级从高到低,刚开始接触2D绘图的时候一开始接触的是路径Path,后来发现如果需要渲染大量的图形的时候,Path的效率可能会不太好,而通过可视化对象绘图是非常轻量级的,每一个Path是作为一个一元素在WPF中渲染的,而可视化元素可以数千个封装到单个元素里面进行渲染,就像我们用手提包装钱,Path就像人民币,虽然也能装不少,但是不如银行卡,存的是巨款,而可视化对象就是银行卡里面的数据

2020-06-06 13:52:21 1583

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除