查看: 1999| 回复: 10
跳转到指定楼层
上一主题 下一主题
收起左侧

[学C/C++] 请问 container class(例如vector)初始化后的变量是什么?

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
C++里普通的class 实例化在堆上面,ClassA* a =new ClassA();  a是reference, 传参也是 reference。 但是像container class, vector<int> b (n);,  b 好像就是个普通变量 因为传参是传值。我就感觉很困惑这个container class 是怎么初始化的?感觉是调用了constructor 应该在堆上,也就是b 应该是个reference,但其实好像就是个普通变量 初始化在 栈上面。。请问有没有大神解惑下?

上一篇:Design Pattern推荐读物
下一篇:看到几道面经题找不到leetcode上相关的
全局:
new是pointer不是reference

补充内容 (2021-04-09 03:55 +08:00):
pointer和reference跟在堆上还是在栈上没关系。new出来的object就是在堆上的,前面那个*pointer也是一个变量(type是指针),在栈上

评分

参与人数 2大米 +2 收起 理由
14417335 + 1
lichever + 1 给你点个赞!

查看全部评分

回复

使用道具 举报

推荐
ezohuya 2021-4-9 08:38:52 | 只看该作者
全局:
lichever 发表于 2021-4-9 06:49
你意思是 初始化一个vector后, b 是对象 放在栈上,但是实际数组是放在堆上,b里面只是存了指向数组的指 ...

C++里面栈上是可以初始化对象的,指针反而要特别加*嘛……一般的class也是这样的。

vector<int> *b = new vector<int>(n);
这样vector本身也在堆上,栈上只有指向vector对象的指针b。

vector<int> b;
这样vector就是在栈上的,栈上并不存在什么额外的指针变量,b就是vector本身的结构体。

评分

参与人数 2大米 +3 收起 理由
14417335 + 1
lichever + 2 很有用的信息!

查看全部评分

回复

使用道具 举报

推荐
ezohuya 2021-4-9 06:19:19 | 只看该作者
全局:
lichever 发表于 2021-4-9 06:07
请问 vector那个变量 b是指针 还是什么?根据你的说法,vector初始化的时候就是内部调用了new,那这个b应 ...

b是栈上对象啊,你可以理解成内部有一个T *data类型的指针指向实际的数组,和Java的ArrayList一个道理只不过C++里面栈上对象默认出了scope就销毁了而Java可以通过把对象传给其他对象指针来延长生命期。

评分

参与人数 2大米 +3 收起 理由
14417335 + 1
lichever + 2 很有用的信息!

查看全部评分

回复

使用道具 举报

🔗
ezohuya 2021-4-9 06:00:45 | 只看该作者
全局:
std::vector有个模板参数是allocator,allocator会去堆里分配内存所以vector类里的data数组是在堆上的长生命周期对象。
但是vector本身是分配在栈上的对象,退出作用域的时候会触发destructor。

评分

参与人数 2大米 +2 收起 理由
14417335 + 1
lichever + 1 给你点个赞!

查看全部评分

回复

使用道具 举报

🔗
 楼主| lichever 2021-4-9 06:03:01 | 只看该作者
全局:
sciencebeer 发表于 2021-4-9 03:52
new是pointer不是reference

补充内容 (2021-04-09 03:55 +08:00):

请问 vector那个变量 是指针 还是 什么东西?
回复

使用道具 举报

🔗
 楼主| lichever 2021-4-9 06:07:14 | 只看该作者
全局:
ezohuya 发表于 2021-4-9 06:00
std::vector有个模板参数是allocator,allocator会去堆里分配内存所以vector类里的data数组是在堆上的长生 ...

请问 vector那个变量 b是指针 还是什么?根据你的说法,vector初始化的时候就是内部调用了new,那这个b应该就是指针, 就像new 普通class一样,但这个b 感觉不像是 指针啊
回复

使用道具 举报

🔗
 楼主| lichever 2021-4-9 06:49:42 | 只看该作者
全局:
ezohuya 发表于 2021-4-9 06:19
b是栈上对象啊,你可以理解成内部有一个T *data类型的指针指向实际的数组,和Java的ArrayList一个道理只 ...

你意思是 初始化一个vector后, b 是对象 放在栈上,但是实际数组是放在堆上,b里面只是存了指向数组的指针。所以我可以理解成vector的初始化 比 一般的 class 多了一层封装,返回的不是指针,而是一个包装后的对象?
回复

使用道具 举报

🔗
 楼主| lichever 2021-4-9 15:43:44 | 只看该作者
全局:
ezohuya 发表于 2021-4-9 08:38
C++里面栈上是可以初始化对象的,指针反而要特别加*嘛……一般的class也是这样的。

vector *b = new v ...

哦 谢谢大神解惑,你一说结构体,我大概知道是什么意思了。
回复

使用道具 举报

🔗
jgao93 2021-4-10 00:28:18 来自APP | 只看该作者
全局:
new出来的a都带个*怎么会是reference
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表