当前位置:网站首页 > 技术博客 > 正文

引用类型与指针类型有什么区别



1. 带 的声明:指针类型

  • 声明方式: 是一个 指针类型,表示 是一个指针,可以指向 类型的对象。
  • 指针特点
    • 指针存储的是对象的地址,可以为空(),也可以重新指向其他对象。
    • 指针需要通过 运算符来访问对象的成员。
    • 指针需要手动管理内存(如果是通过 动态分配的)。
    • 例如:

  • 适用场景
    • 当你需要动态分配内存时使用指针(比如在堆上分配对象)。
    • 当你需要在函数之间传递对象引用而不是对象副本时。

2. 不带 的声明:值类型

  • 声明方式: 是一个 值类型,表示 是 类型的对象,存储在栈上。
  • 值类型特点
    • 值类型对象会在栈上分配内存,其生命周期由作用域决定,当作用域结束时,内存会自动释放。
    • 通过 运算符来访问对象的成员。
    • 例如:

  • 适用场景
    • 当对象的生命周期明确、作用域有限时,使用值类型更简单和安全。
    • 避免不必要的动态内存分配,可以提高性能。

3. 引用类型:使用 符号

  • 引用类型与指针类似,但在语法和使用上有不同的特点。
  • 声明方式: 表示 是一个对 的引用。
  • 引用特点
    • 引用本质上是对象的别名,必须在定义时初始化,且无法更改其引用的对象。
    • 不能为 ,也没有类似指针的 或 运算符。
    • 通常用于函数参数或返回值,以避免拷贝对象而是引用现有对象。
    • 例如:

  • 适用场景
    • 当你希望函数参数传递时避免拷贝,但又不希望管理指针时,可以使用引用。
    • 作为函数返回值时,可以用于返回一个现有对象的别名。

示例代码:

 

运行结果如下: 

 

说明:

: 

  • 包含一个构造函数、析构函数和一个成员函数 。
  • 构造函数打印对象的名称,析构函数在对象销毁时打印一条消息。

  函数(指针类型)

  • 创建一个 对象的指针 ,在堆上动态分配内存。
  • 使用 运算符调用 方法,并在最后使用 释放内存。
  • 对于动态分配的对象,则需要手动释放资源。

  函数(值类型)

  • 创建一个 对象 ,在栈上分配内存。
  • 直接调用 方法,函数结束时自动调用析构函数。
  • 对于栈对象,生命周期是自动管理的;

函数(引用类型)

  • 创建一个 对象 ,并通过引用 引用该对象。
  • 通过引用调用 方法, 的析构函数将在函数结束时自动调用。
  • 引用类型提供了对象的别名,它的资源释放遵循与值类型相同的规则,都是由绑定的对象来管理。使用引用可以避免不必要的对象拷贝,同时也需要注意引用对象的生命周期。

1.悬空引用

 

是 函数中的局部对象。当函数返回时, 的生命周期结束并被销毁。然而,函数返回了一个对 的引用,这在 中保存,但此时 已经不存在了。调用 会访问已经被释放的内存,导致 未定义行为,可能会导致程序崩溃或其他不可预期的结果。

改进方案1:可以在堆上创建对象,并返回对象的指针。但这需要调用者在适当的时候手动释放内存。

 

改进方案2:如果 是可以被复制的,可以直接返回对象本身。C++ 编译器会优化返回对象的过程,不会产生多余的拷贝。

 

版权声明


相关文章:

  • jvm查看gc情况2025-04-28 11:01:00
  • c 数组 指针2025-04-28 11:01:00
  • const与指针的关系2025-04-28 11:01:00
  • java实体类设计技巧2025-04-28 11:01:00
  • 小程序 客服系统2025-04-28 11:01:00
  • c语言结构体指针定义2025-04-28 11:01:00
  • c语言pthread线程池2025-04-28 11:01:00
  • js中如何给数组添加数据2025-04-28 11:01:00
  • 线程之间如何进行通信2025-04-28 11:01:00
  • linux chcp2025-04-28 11:01:00