2026/4/18 12:24:36
网站建设
项目流程
海口 网站制作公司,成都租车公司网站,哪里不好就去建设,wordpress最大上传文件目录
值返回
引用返回
二者的区别
生命周期
可以安全引用返回的情况 返回函数参数#xff08;传入的引用#xff09;
返回成员变量
返回动态分配的对象#xff08;但通常是返回指针#xff09;
禁止返回的类型
返回局部变量 返回临时对象
返回局部指针指向的对象…目录值返回引用返回二者的区别生命周期可以安全引用返回的情况返回函数参数传入的引用返回成员变量返回动态分配的对象但通常是返回指针禁止返回的类型返回局部变量返回临时对象返回局部指针指向的对象复制代码试一下总结在c中函数可以返回值by value也可以返回引用by reference。两者的根本区别在于返回的是对象的副本还是对象本身值返回返回对象的副本调用者得到的是全新的独立对象。// 值返回返回类型不带 string function1() { // 返回string值 string local hello would; return local; // 返回local的副本 }引用返回返回对象的引用别名调用者得到的是已有对象的另一个名称不创建新对象。// 引用返回返回类型带 string function2() { // 返回string引用 static string global world; return global; // 返回global的引用别名 } // const引用返回 const string function3() { // 返回const string常量引用 static string global world; return global; // 返回不能修改的引用 }二者的区别最主要的判断方式是其函数类型后是否跟着 若其跟着即为返回对象的引用 不创建新的对象生命周期值返回例子如下string version1(const string s1, const string s2) { string temp;//创建局部变量temp在栈上 temp s2 s1 s2;//计算s2s1s2赋值给temp return temp;//创建temp的副本临时对象作为返回值 } //函数结束temp被销毁栈帧弹出 //主函数中用返回值初始化或赋值给result调用拷贝构造函数或赋值运算符即可以得出version1返回的是值 并且在返回后temp被销毁 而其return的是temp的副本与temp本身的销毁无关 完全的独立引用返回version3 当函数结束后temp就被销毁了所以返回的引用将指向一个不再存在的对象这会导致未定义行为。注意不要返回局部变量的引用或指针可以安全引用返回的情况返回静态局部变量const string getDefaultName() { static string defaultName Default; // 静态变量 return defaultName; // 安全生命周期为整个程序不会随着函数结束而销毁 }返回函数参数传入的引用 string appendStars(string str) { str ***; return str; // 安全str的生命周期由调用者管理 }返回成员变量class Person { private: string name; public: const string getName() const { return name; } // 安全 string getName() { return name; } // 安全但有风险 };返回动态分配的对象但通常是返回指针string* createDynamicString() { return new string(Dynamic); // 返回指针调用者需delete }禁止返回的类型返回局部变量const string badFunction() { string local Local; // 局部变量 return local; // 致命错误返回后将指向无效内存 }返回临时对象const string badFunction2() { return string(Temporary); // 临时对象语句结束就销毁 }返回局部指针指向的对象string badFunction3() { string* ptr new string(Dynamic); return *ptr; // 危险内存泄漏风险调用者不知道需要delete }总结 注意不要返回局部变量的引用或指针复制代码试一下//strquote.cpp -- different designs #includeiostream #includestring using namespace std; string version1(const string s1, const string s2); const string version2(string s1, const string s2); //has side effect const string version3(string s1, const string s2); //bad design int main() { string input; string copy; string result; cout Enter a string: ; getline(cin, input); copy input; cout Your string as entered: input endl; result version1(input, ***); cout Your string enhanced: result endl; cout Your original string: input endl; result version2(input, ###); cout Your string enhanced: result endl; cout Your original string: input endl; cout Resetting original string.\n; input copy; result version3(input, ); cout Your string enhanced: result endl; cout Your original string: input endl; return 0; } string version1(const string s1, const string s2) { string temp; temp s2 s1 s2; return temp; } const string version2(string s1, const string s2) //has side effect { s1 s2 s1 s2; //safe to return reference passed to function return s1; } const string version3(string s1, const string s2) //bad design { string temp; temp s2 s1 s2; //unsafe to return reference to local variable return temp; }此代码可以帮助你观察与理解值返回与引用返回的区别总结场景值返回引用返回返回计算结果✅ 推荐⚠️ 需确保对象有效返回局部创建的对象✅ 安全❌ 绝对禁止返回输入参数⚠️ 可能低效✅ 高效返回静态数据⚠️ 可能拷贝✅ 高效链式调用❌ 不能链式✅ 支持链式函数修改参数❌ 不能修改✅ 可以修改多线程安全✅ 线程安全⚠️ 需同步访问