在 C++ 中通过引用 return 变量或对象是否可以?
Is it ok to return a variable or object by reference in C++?
所以我很好奇在 C++ 中是否可以通过引用将变量或对象从一个文件传递到另一个文件,如下例所示。
字符串示例:
int main() {
//
std::cout << GetName() << std::endl;
}
std::string name = "Paul";
std::string& GetName() {
return name;
}
对象示例:
int main() {
//
std::cout << GetEmployee().GetAge() << std::endl;
}
Employee employee;
Employee& GetEmployee() {
return employee;
}
是的,这是安全的,因为在这种情况下引用的变量仍然存储在 class 中。
如果变量超出范围就不行了。
是的,以上方法有效,但不常用。它之所以有效,是因为在您的情况下,地址为 return 的对象是静态的。以下将不起作用:
std::string& GetName() {
std::string name = "Paul";
return name;
}
注意,编译器可能会让你这样做,但是由于变量name
分配在栈上,它的地址在方法结束后指向未分配的栈space,并访问它将导致未定义的行为。
这些代码示例中的问题不在于具有静态存储持续时间的变量是通过引用return编辑的。您可以通过引用 return 此类变量,因为它们在退出函数后仍然存在。
问题是您应该避免在文件范围内声明变量。
注意你不能return从函数引用到具有自动存储持续时间的对象,因为它们在退出函数后将不存在。
所以我很好奇在 C++ 中是否可以通过引用将变量或对象从一个文件传递到另一个文件,如下例所示。
字符串示例:
int main() {
//
std::cout << GetName() << std::endl;
}
std::string name = "Paul";
std::string& GetName() {
return name;
}
对象示例:
int main() {
//
std::cout << GetEmployee().GetAge() << std::endl;
}
Employee employee;
Employee& GetEmployee() {
return employee;
}
是的,这是安全的,因为在这种情况下引用的变量仍然存储在 class 中。
如果变量超出范围就不行了。
是的,以上方法有效,但不常用。它之所以有效,是因为在您的情况下,地址为 return 的对象是静态的。以下将不起作用:
std::string& GetName() {
std::string name = "Paul";
return name;
}
注意,编译器可能会让你这样做,但是由于变量name
分配在栈上,它的地址在方法结束后指向未分配的栈space,并访问它将导致未定义的行为。
这些代码示例中的问题不在于具有静态存储持续时间的变量是通过引用return编辑的。您可以通过引用 return 此类变量,因为它们在退出函数后仍然存在。
问题是您应该避免在文件范围内声明变量。
注意你不能return从函数引用到具有自动存储持续时间的对象,因为它们在退出函数后将不存在。