"如果从函数返回一个值(不是引用),那么将它绑定到调用函数中的const引用,它的生命周期将扩展到调用函数的范围."
所以:案例A.
const BoundingBox Player::GetBoundingBox(void)
{
return BoundingBox( &GetBoundingSphere() );
}
Run Code Online (Sandbox Code Playgroud)
const BoundingBox从函数返回类型的值GetBoundingBox()
变体I :(将它绑定到const引用)
const BoundingBox& l_Bbox = l_pPlayer->GetBoundingBox();
Run Code Online (Sandbox Code Playgroud)
变体II :(将它绑定到const副本)
const BoundingBox l_Bbox = l_pPlayer->GetBoundingBox();
Run Code Online (Sandbox Code Playgroud)
两者都工作正常,我没有看到l_Bbox对象超出范围.(虽然,我在变体1中理解,复制构造函数未被调用,因此稍微好于变体II).
另外,为了比较,我做了以下更改.
案例B
BoundingBox Player::GetBoundingBox(void)
{
return BoundingBox( &GetBoundingSphere() );
}
Run Code Online (Sandbox Code Playgroud)
与变体:我
BoundingBox& l_Bbox = l_pPlayer->GetBoundingBox();
Run Code Online (Sandbox Code Playgroud)
和II:
BoundingBox l_Bbox = l_pPlayer->GetBoundingBox();
Run Code Online (Sandbox Code Playgroud)
该对象l_Bbox仍然没有超出范围.如何"将它绑定到调用函数中的const引用,它的生命周期将扩展到调用函数的范围",真正将对象的生命周期延长到调用函数的范围?
我在这里错过了一些小事吗?
好吧,我们来了.我的C++书籍提出了另一个提议的做法.它说"返回值(非空)函数不应该将引用类型作为参数." 所以基本上如果你要实现这样的函数:
int read_file(int& into){
...
}
Run Code Online (Sandbox Code Playgroud)
并使用整数返回值作为某种错误指示符(忽略我们有异常的事实)然后该函数编写得很糟糕它实际上应该像
void read_file(int& into, int& error){
}
Run Code Online (Sandbox Code Playgroud)
现在对我来说,第一个更清晰,更好用.如果要忽略错误值,可以轻松完成.但是这本书暗示了后来的.请注意,本书并未说返回值函数是坏的.它宁愿说你应该只返回一个值,或者你应该只使用引用.
你对此有何看法?我的书上装满了废话吗?(再次)
我正在寻找一种方法来定义一个"基础"构造函数,它将使用默认值初始化值,然后将该基础扩展为许多专门的构造函数.
我想要的伪代码可能是这样的:
class Foo{
private:
int val;
/* ... */
public:
// Base constructor
Foo(){ /*...*/ } // This provides basic initialization of members
// Named constructors
static Foo fromString(string s){
Foo f; // Call base constructor
f.val = s.length(); // Customize base object
return f; // Return customized object
}
static Foo fromInt(int v){
Foo f;
f.val = v;
return f;
}
}
Run Code Online (Sandbox Code Playgroud)
起初,我考虑延长临时的生命周期f,但const声明阻止我编辑其成员.所以看来这已经结束了.
然后我尝试了"命名构造函数"方法(如上所示).但是,我必须先修改示例以创建对象,然后修改它,然后返回它.这似乎有效,但我有理由相信它只是一个巧合,因为它f是一个临时的,并且在函数结束时超出了范围.
我也考虑使用像auto_ptrs 这样的东西,但是我正在使用Foo对象以及auto_ptrs到Foo,这使得其余的代码"关心"对象是否通过基础构造函数创建(在这种情况下)它将是一个对象)或通过一个扩展构造函数(在这种情况下它将是一个指针).
如果它有用,在Python中,我会使用这样的东西: …