编程C++ 后端开发工程师

C++中参数传递方式的继承是如何工作的(按值传递、按指针传递、按引用传递),每种方式有什么潜在问题?

用 Hintsage AI 助手通过面试

回答。

在C++中,函数的参数(包括方法的成员)可以通过以下方式传递:

  • 按值(by value): 在函数内部创建对象的副本。原始对象不被修改,但如果存在动态资源,可能会发生不正确的复制!
  • 按指针(by pointer): 传递地址。可以修改原始对象,可能出现nullptr,因缺少检查和内存管理而带来的危险。
  • 按引用(by reference): 与指针类似,但语法与普通变量相同。引用必须是有效的,不能重新定向,但使用const可以减少复制开销。

示例:

void foo(int value); // 按值传递 void foo(int* ptr); // 按指针传递 void foo(const int& ref); // 按引用传递(适合大型对象!)

在按引用传递时可能实现优化(复制消除),对于大型对象建议使用const &。对于指针,始终检查nullptr

有陷阱的问题。

const MyClass& objMyClass obj在函数参数中有什么区别?

回答:

const MyClass&不复制对象,而是提供只读访问(适合大型对象)。MyClass obj总是做副本,这在对象较大或缺少正确复制(例如,未实现深复制)时成本高。

void process(const std::string& s); // 不复制 void process(std::string s); // 复制

由于对主题细节的不熟悉而导致的实际错误示例。


故事 在公司数学结构库中,程序员决定通过按值传递大的容器来加速工作。这在每次函数调用时造成了可观的开销——性能降低了一半。


故事 在用户管理模块中使用指针而未检查nullptr。在访问无效指针时有时会发生随机崩溃,调试花费了几个月。


故事 在图像处理项目中,部分函数按值接受对象,而部分函数按引用接受。对于某个类未实现深复制,导致内存泄漏和在按值传递后资源的隐性共享。