对象何时创建完成

yaletracy 2019-03-22 04:02:24
C++类对象到底什么时候创建完成,是在进入构造函数函数体之前吗?有没有大佬解释一下
...全文
438 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
小陆zi 2019-03-27
  • 打赏
  • 举报
回复
能使用this不代表对象完成了吧。 初始化列表这个东西就是这么龟腚的吧、不能用this、我觉得是初始化列表不再类内。而只有在类内才能用this 其实还有一种情况: 在初始化列表中还能初始化父类的成员变量,假设可以使用this,那么这个this是只能在子类中使用,不能用来初始化父类的成员变量。
cwenhe0324 2019-03-27
  • 打赏
  • 举报
回复
引用 6 楼 jiht594 的回复:
[quote=引用 5 楼 yaletracy 的回复:] [quote=引用 4 楼 jiht594的回复:][quote=引用 3 楼 yaletracy 的回复:] [quote=引用 1 楼 cwenhe0324的回复:]内存在进入构造函数前就已经申请完,但是一个对象的创建是要包括对象的初始化的(也就是调用构造函数),构造函数里面主要是负责各个成员以及基类的初始化工作
你的意思应该就是对象的创建是在进入构造函数之前完成的吧[/quote] 我觉得是构造函数执行完成。构造函数就是给你构造对象用的。[/quote] 如何解释初始化列表无法通过this指针初始化给成员变量,而在构造函数中却可以?先有对象再有this指针这点应该是没问题的,所以在构造函数中使用this指针时对象是不是已经创建完成?[/quote] 个人觉得构造函数只是一个约定、在这里完成对象的构造。并不是强制的、保证应该构造的东西在构造函数内完成就可以了。 能使用this不代表对象完成了吧。 初始化列表这个东西就是这么龟腚的吧、不能用this、我觉得是初始化列表不再类内。而只有在类内才能用this 我觉得不需要太关注这个东西。。。 [/quote] c++的构造函数是必须的,即使你没有写,编译器也会默认加上一个无参构造,构造函数里面会实现虚函数的地址修改之类的,需要注意在子类构造函数跟父类构造函数的this指针是不一样的,如下代码,会先打印base,然后打印drived,因为在Base的构造函数里面print的虚函数地址还没有被替换


class Base
{
public:
Base()
{
this->print()
}

virtual void print()
{
std::cout<<"base";
}
};

class Drived: public Base
{
public:
Drived()
{
this->print();
}
virual void print()
{
std::cout<<"drived";
}
};
cwenhe0324 2019-03-27
  • 打赏
  • 举报
回复
引用 2 楼 yaletracy 的回复:
[quote=引用 1 楼 cwenhe0324的回复:]内存在进入构造函数前就已经申请完,但是一个对象的创建是要包括对象的初始化的(也就是调用构造函数),构造函数里面主要是负责各个成员以及基类的初始化工作
可以把对象初始化列表分开讲吗,如果你讲的不是初始化列表的话,那构造函数应该是完成对象的赋值工作吧,而不是初始化工作[/quote] 对的,是先按初始化列表进行初始化然后再调用到构造函数赋值的
ooolinux 2019-03-25
  • 打赏
  • 举报
回复
new一个对象实际上包含两步,分配内存,然后在该内存上调用构造函数。分配内存后,原始内存不是一个对象。
jiht594 2019-03-25
  • 打赏
  • 举报
回复
引用 5 楼 yaletracy 的回复:
[quote=引用 4 楼 jiht594的回复:][quote=引用 3 楼 yaletracy 的回复:]
[quote=引用 1 楼 cwenhe0324的回复:]内存在进入构造函数前就已经申请完,但是一个对象的创建是要包括对象的初始化的(也就是调用构造函数),构造函数里面主要是负责各个成员以及基类的初始化工作

你的意思应该就是对象的创建是在进入构造函数之前完成的吧[/quote]
我觉得是构造函数执行完成。构造函数就是给你构造对象用的。[/quote]
如何解释初始化列表无法通过this指针初始化给成员变量,而在构造函数中却可以?先有对象再有this指针这点应该是没问题的,所以在构造函数中使用this指针时对象是不是已经创建完成?[/quote]
个人觉得构造函数只是一个约定、在这里完成对象的构造。并不是强制的、保证应该构造的东西在构造函数内完成就可以了。

能使用this不代表对象完成了吧。
初始化列表这个东西就是这么龟腚的吧、不能用this、我觉得是初始化列表不再类内。而只有在类内才能用this

我觉得不需要太关注这个东西。。。

ooolinux 2019-03-25
  • 打赏
  • 举报
回复
构造函数实际上包含隐含的代码,即使是空的构造函数也是做了不少事情的。
yaletracy 2019-03-22
  • 打赏
  • 举报
回复
引用 4 楼 jiht594的回复:
[quote=引用 3 楼 yaletracy 的回复:]
[quote=引用 1 楼 cwenhe0324的回复:]内存在进入构造函数前就已经申请完,但是一个对象的创建是要包括对象的初始化的(也就是调用构造函数),构造函数里面主要是负责各个成员以及基类的初始化工作

你的意思应该就是对象的创建是在进入构造函数之前完成的吧[/quote]
我觉得是构造函数执行完成。构造函数就是给你构造对象用的。[/quote] 如何解释初始化列表无法通过this指针初始化给成员变量,而在构造函数中却可以?先有对象再有this指针这点应该是没问题的,所以在构造函数中使用this指针时对象是不是已经创建完成?
jiht594 2019-03-22
  • 打赏
  • 举报
回复
引用 3 楼 yaletracy 的回复:
[quote=引用 1 楼 cwenhe0324的回复:]内存在进入构造函数前就已经申请完,但是一个对象的创建是要包括对象的初始化的(也就是调用构造函数),构造函数里面主要是负责各个成员以及基类的初始化工作

你的意思应该就是对象的创建是在进入构造函数之前完成的吧[/quote]
我觉得是构造函数执行完成。构造函数就是给你构造对象用的。
yaletracy 2019-03-22
  • 打赏
  • 举报
回复
引用 1 楼 cwenhe0324的回复:
内存在进入构造函数前就已经申请完,但是一个对象的创建是要包括对象的初始化的(也就是调用构造函数),构造函数里面主要是负责各个成员以及基类的初始化工作
你的意思应该就是对象的创建是在进入构造函数之前完成的吧
yaletracy 2019-03-22
  • 打赏
  • 举报
回复
引用 1 楼 cwenhe0324的回复:
内存在进入构造函数前就已经申请完,但是一个对象的创建是要包括对象的初始化的(也就是调用构造函数),构造函数里面主要是负责各个成员以及基类的初始化工作
可以把对象初始化列表分开讲吗,如果你讲的不是初始化列表的话,那构造函数应该是完成对象的赋值工作吧,而不是初始化工作
cwenhe0324 2019-03-22
  • 打赏
  • 举报
回复
内存在进入构造函数前就已经申请完,但是一个对象的创建是要包括对象的初始化的(也就是调用构造函数),构造函数里面主要是负责各个成员以及基类的初始化工作

64,652

社区成员

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

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