面试题答案
一键面试1. MyClass
类对象的内存布局及指针和引用内存占用情况
- 内存布局:
MyClass
类对象的内存布局包含一个指针ptr
和一个引用ref
。指针ptr
存储的是它所指向的int
类型数据的地址,而引用ref
在底层实现上其实也是通过指针来实现的,它也占用存储地址的空间。所以MyClass
对象的内存中依次存放ptr
的地址值和ref
所对应的底层指针的地址值。 - 内存占用:在常见的32位系统中,指针(包括引用底层实现的指针)占用4字节;在64位系统中,指针(包括引用底层实现的指针)占用8字节。
2. 指针和引用适用场景及原因
- 指针适用场景:
- 动态内存分配:当需要在运行时动态分配和释放内存时,指针是必不可少的。例如,使用
new
和delete
操作符来创建和销毁对象。因为引用一旦初始化就不能再改变其绑定对象,而指针可以灵活地指向不同的内存地址。例如在实现链表、树等动态数据结构时,指针用于连接各个节点。 - 表示“无对象”情况:指针可以设置为
nullptr
(在C++11及以后)来表示它不指向任何对象,这在某些情况下非常有用,比如在查找算法中,如果未找到目标元素,返回的指针可以设为nullptr
。而引用必须始终绑定到一个有效的对象,无法表示这种“无对象”状态。
- 动态内存分配:当需要在运行时动态分配和释放内存时,指针是必不可少的。例如,使用
- 引用适用场景:
- 函数参数和返回值:当希望函数能够修改传入对象的值,同时又不想传递对象副本以提高效率时,引用作为函数参数是很好的选择。与指针相比,引用语法更简洁,并且避免了指针可能出现的空指针解引用错误。例如在
void swap(int& a, int& b)
函数中,使用引用可以直接操作传入的变量。对于函数返回值,如果返回的是局部对象的引用是不合法的,但如果返回对象是类成员或者全局对象等生命周期较长的对象,使用引用返回可以避免对象拷贝,提高效率。 - 运算符重载:在重载一些运算符(如
operator<<
用于输出流操作符重载)时,使用引用作为参数可以避免不必要的对象拷贝,同时保证对对象的直接操作。例如ostream& operator<<(ostream& os, const MyClass& obj)
,这种方式既高效又符合习惯用法。
- 函数参数和返回值:当希望函数能够修改传入对象的值,同时又不想传递对象副本以提高效率时,引用作为函数参数是很好的选择。与指针相比,引用语法更简洁,并且避免了指针可能出现的空指针解引用错误。例如在