值类型和引用类型:
| 值类型 | 引用类型 |
存储方式 | 直接存储数据本身 | 存储的是数据的引用,数据存储在数据堆中 |
内存分配 | 分配在栈中的 | 分配在堆中 |
效率 | 效率高,不需要地址转换 | 效率较低,需要进行地址转换 |
内存回收 | 使用完后立即回收 | 使用完后不立即回收,而是交给GC处理回收 |
赋值操作 | 创建一个新对象 | 创建一个引用 |
类型扩展 | 不易扩展,所有值类型都是密封(seal)的,所以无法派生出新的值类型 | 具有多态的特性方便扩展 |
实例分配 | 通常是在线程栈上分配的(静态分配),但是在某些情形下可以存储在堆中 | 总是在进程堆中分配(动态分配) |
值类型的变量赋值只是进行数据复制,创建一个同值的新对象,而引用类型变量赋值,仅仅是把对象的引用的指针赋值给变量,使它们共用一个内存地址。
值类型数据是在栈上分配内存空间,它的变量直接包含变量的实例,使用效率相对较高。而引用类型数据是分配在堆上,引用类型的变量通常包含一个指向实例的指针,变量通过指针来引用实例。
引用类型一般都具有继承性,但是值类型一般都是封装的,因此值类型不能作为其他任何类型的基类。
引用和指针的区别是:
引用总是指向一个对象,指针可能不指向对象;引用不能用const修饰,而指针可以;引用创建时必须初始化,而指针则可以在任何时候被初始化
C++中的友元函数说法正确的是:友元函数是不能被继承的;友元函数没有this指针