vector中为什么不能存储对象的引用?

FoxBryant 2011-04-28 10:38:56
如题~

为什么不能这样定义一个向量:vector <int &> v;
而类似的引用:void Func(int &v);却可以呢?

此问题在http://www.lampchina.net/ask/MTM4OTkwNQ.html也有讨论,但小弟没看明白是怎么回事,
话说引用必须初始化,但为什么函数的参数传递可以不初始化呢?

求解~ 谢谢!
...全文
2125 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
FoxBryant 2011-11-15
  • 打赏
  • 举报
回复
哦,终于搞清楚了:
容器中保存的是“值”而非“引用”。
向容器中执行插入时,会执行值拷贝,因为引用必须在定义时指定引用对象且不允许改变使其指向其它对象,所以不能存放“引用”类型。
至于函数声明/定义中的引用,是参数的一种传递方式。只有在执行函数调用时才会为其分配空间,即在调用时才是实际定义,而此时会通过实际参数对其进行初始化。

结贴,谢谢大家!
xmu_才盛 2011-04-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 loaden 的回复:]
引用就像门牌号。
被引用的就像房子。
如果房子还没有建好,门牌号还有意义吗?
[/Quote]

这个经典。
欣客 2011-04-29
  • 打赏
  • 举报
回复
可以这样理解: 引用需要初始化,且不能改变引用指向新的对象。
而vector执行的时候是需要执行copy的,把以前的对象放在vector开辟的内存中,
这样破坏了引用不能指向新的对象。
所以在编译的时候提示错误,不知道我有没有解释清楚。
Defonds 2011-04-29
  • 打赏
  • 举报
回复
向量需要为他们存放起来
luciferisnotsatan 2011-04-29
  • 打赏
  • 举报
回复
引用是个别名,编译后的程序里,名称就没了,什么都不是了。
你可以用指针。
太乙 2011-04-28
  • 打赏
  • 举报
回复
因为vector是模板:
std::vector<T, std::allocator<T> >
而std::allocator<T>内部:

typedef _Tp* pointer;
这肯定有问题了……
老邓 2011-04-28
  • 打赏
  • 举报
回复
引用就像门牌号。
被引用的就像房子。
如果房子还没有建好,门牌号还有意义吗?
老邓 2011-04-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 foxbryant 的回复:]
话说引用必须初始化,但为什么函数的参数传递可以不初始化呢?
[/Quote]
参数为引用时,需要传递一个 左 值。
例如:
void test(int& i)
{

}

void constRefTest(const int& i)
{

}

int main()
{
int i = 8;
// test(2); // 错误
test(i); // 正确
constRefTest(6); // 正确,隐式转化
constRefTest(i); // 正确
return 0;
}
老邓 2011-04-28
  • 打赏
  • 举报
回复
引用在定义时,被引用的对象就要求一定是存在的
pengzhixi 2011-04-28
  • 打赏
  • 举报
回复
你怎么初始化呢?你见过引用数组吗?

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧