我只想澄清一些事情,想象一下我们有功能签名:
1)int* X(){}
2)int Y(){}
3)int& Z(){}
我正在尝试找出上面可以返回的值类型的详尽可能性。下面显示了上述函数体的可能实现:
1)
int* X(){
int* b = new int(6);
return b;
}
2)
int Y(){
int b = 6;
return b;
}
或
int Y(){
int* b = new int(6);
return *b;
}
编辑:2)如果b未被删除,因内存泄漏而不好。
3)
int& Z(){
int b = 6;
return b;
}
编辑:3)不好,因为一旦函数返回,b将超出范围。
我有什么遗漏可以从上述任何3个功能签名中退回吗?更喜欢冒险,怎么样:
int* X(){
int b = 6;
return reinterpret_cast<b>;
}
和
int X(){
int* b = new int(6);
return reinterpret_cast<b>;
}
? (我对reinterpret_cast
的理解可能是错误的......)
答案 0 :(得分:1)
int Y(){
int* b = new int(6);
return b*;
}
这有语法错误。要取消引用b
,您可以执行*b
。尽管如此,这是一个非常糟糕的实现,因为它会泄漏内存。 1}}动态分配永远不会被破坏。
int
这也很糟糕,因为您正在返回对局部变量的引用。当函数返回时,局部变量int& Z(){
int b = 6;
return b;
}
将被销毁,并且您将留下对不存在的对象的引用。
答案 1 :(得分:0)
int* X(){}
当你必须返回指向整数
的地址时int Y(){}
用于返回简单整数
int& Z(){}
这是不同的,
你在Z()
中没有任何论据,因此它没用。
它必须像
int& Z(int &a)
{
//code body
return (a);
}
并将其返回给引用变量