首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

什么事情最好不要在构造函数中完成?

在构造函数中完成的事情可能会导致一些问题,因为构造函数通常用于初始化对象的状态。以下是一些建议避免在构造函数中完成的事情:

  1. 执行耗时的操作:构造函数应该尽量快地完成对象的初始化,而不是执行耗时的操作。如果需要执行耗时的操作,可以将其放在单独的方法中,并在需要时调用该方法。
  2. 抛出异常:构造函数应该尽量避免抛出异常。如果在构造函数中发生异常,可能会导致对象创建失败,从而引发其他问题。
  3. 调用虚方法或重写方法:由于构造函数是在对象创建时调用的,因此在构造函数中调用虚方法或重写方法可能会导致意外的行为。应该避免在构造函数中调用虚方法或重写方法。
  4. 访问可变的静态变量:由于静态变量是在类加载时初始化的,因此在构造函数中访问可变的静态变量可能会导致意外的行为。应该避免在构造函数中访问可变的静态变量。

总之,构造函数应该仅用于初始化对象的状态,而不是执行复杂的操作或调用其他方法。如果需要执行复杂的操作或调用其他方法,应该将其放在单独的方法中,并在需要时调用该方法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++不要在构造函数和析构函数调用虚函数

但是为什么在构造函数调用虚函数,实际上没有发生动态联编呢? 1. 不要在构造函数调用虚函数的原因 第一个原因,在概念上,构造函数的工作是为对象进行初始化。...在构造函数完成之前,被构造的对象被认为“未完全生成”。...所以,一个类的构造函数在执行时,并不能保证该函数所能访问到的虚指针就是当前被构造对象最后所拥有的虚指针,因为后面派生类的构造函数会对当前被构造对象的虚指针进行重写,因此无法完成动态联编。...2.不要在析构函数调用虚函数的原因 同样的,在析构函数调用虚函数函数的入口地址也是在编译时静态决定的。也就是说,实现的是实调用而非虚调用。 考察如下例子。...从概念上说,析构函数是用来销毁一个对象的,在销毁一个对象时,先调用该对象所属类的析构函数,然后再调用其基类的析构函数,所以,在调用基类的析构函数时,派生类对象的“善后”工作已经完成了,这个时候再调用在派生类定义的函数版本已经没有意义了

2.7K30

C++核心准则C.82:不要在构造函数或析构函数调用虚函数

C.82: Don't call virtual functions in constructors and destructors C.82:不要在构造函数或析构函数调用虚函数 Reason...到目前为止,被调用的函数应该只属于构造对象本身,而不是可能存在于派生类的某个覆盖函数。那样做非常难理解。...最坏的情况,在构造函数或者析构函数中直接或间接调用一个没有实现的纯虚函数会导致没有定义的行为。...从构造函数和析构函数调用虚函数并不是本身有什么错误。这种调用的语义是安全的。然而,经验表明这样的调用很少是必须的,很容易扰乱维护者,如果被新手使用会成为错误源。...提示来自构造函数或析构函数的虚函数调用。

73250

《架构即未来》之可扩展性组织的人员配置(中二)

输入参数到领导力函数后,会返回一个结果,这个结果就可以反映出个人有效地改变和影响行为的能力。 领导力函数的有些参数,与你能否通过创新或者凭毅力做出什么事情有关系。...最好的领导人所共同拥有的几个特性,包括以身作则、刚自用、努力完成使命,同时留意和同情组织的需要、及时决策、给团队授权、和股东的利益保持一致。...严于律己,徇私枉法,行为的方式应和你期望自己的组织的表现一样。 刚愎自用 任何一个公司的任何一个职位都不允许自我意识膨胀。过度自夸的言行与打造最好的团队背道而驰,随着时间的推移将会侵蚀股东的价值。...好的领导会确保那些产生最多价值的人得到最好的奖赏,确保那些表现远在一般人之上的人能够得到应有的休假。 关爱并不意味着要在组织内部实行福利或者终身雇用制度。关爱也并不意味着要去设置容易达成的目标。...从与个人讨论,变成与团队研究如何激励大家来完成任务。 愿景 总的来说,领导在愿景和使命上面往往没有投入足够的精力。一般情况下,可以在年度计划会议,安排一到两个小时有关愿景和使命的讨论。

62740

ThinkingInJava对this关键字的介绍

个人总结: this关键字必须写在构造方法内部 在构造函数,如果你指定构造器之间的调用关系,那么编译器会给你加上super();目的是在初始化当前对象时,先保证了父类对象先初始化。...所以,你指定了构造函数间的调用,那么this()必须在第一行,以保证在执行任何动作前,对象已经完成了初始化。 构造函数只能被构造函数调用,因为对象只会初始化一次。...(也就找不到对应对象),所以对this()或super()的调用只能在构造方法的第一行实现,防止异常。...在构造方法内部,只能调用一个构造方法 类似this()和super()这样的方法被称为构造方法,顾名思义,他的作用就是在JVM堆构建出一个指定类型的对象,如果你调用了两个这种形式的方法,岂不是代表着构建出了两个对象...非构造方法不能在方法内部调用构造方法 在普通的成员方法,如果调用super()或者this(),你是想要重新创建一个对象吗?抱歉Java为了保证自身对象的合理性,不允许你做这样的操作。

40030

前端经典面试题解密:Vue 的生命周期到底做了什么事清?(源码详解)

本篇文章就从一个完整的流程开始,详细讲解各个生命周期之间发生了什么事情。 注意本文涉及 keep-alive 的场景和错误处理的场景。...(渲染过程不会变的那些节点,优化性能)。 根据 ast,生成 render 函数。...因为我们需要在这段过程中去 观察 这个函数读取了哪些响应式数据,将来这些响应式数据更新的时候,我们需要重新执行 updateComponent 函数。...createComponent 函数内部,会做这样的一件事情: Ctor = baseCtor.extend(Ctor) 在普通的场景下,其实这就是 Vue.extend 生成的构造函数,这个函数可以理解为继承自...它会去调用 子组件 的构造函数

1.1K20

C++的六大“天选之子“拷贝构造与与运算符重载

金句分享: ✨别在最好的年纪,辜负了最好的自己.✨ 一、“拷贝构造函数” 拷贝构造函数: 只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用...,但是只会完成"浅拷贝"(下面讲)… 2.2 自定义"拷贝构造函数" #include using std::cin; using std::cout; using std::endl...浅拷贝:按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝 深拷贝: 示例: 栈类没有显式定义拷贝构造函数,编译器自动生成的拷贝构造是浅拷贝带来的问题....当一个对象作为参数传递给函数时,拷贝构造函数会被调用来创建一个新的对象,该新对象与传递的对象具有相同的属性和属性值,但是它们在内存是独立的。 若未显式定义,编译器会生成默认的拷贝构造函数。...默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝.

13410

【笔记】《Effective C++》条款1-25

由于是编译期技术, 这个技巧在TMP也很常用 宏函数由于避免了函数调用开销因此可以带来很高的执行效率, 但是要记得宏函数每个变量最好都加上小括号, 保证生成出的代码不会那么容易遇到优先级问题 对于宏函数我们还应该用...对于自定类型, 则应该在构造函数完善地初始化 对于类的成员, 尽可能不要在构造函数内再初始化自己的元素, 因为在进入构造函数之前自定类型就会被调用默认初始化了, 构造函数内进行的实际上是拷贝构造, 但又要注意内置类型并不会调用默认初始化..., 是先构造基类, 然后逐级向上构造的, 底层构造完成前, 派生类的相关变量都是未定义的....析构函数尽管调用顺序相反但是思路一致 所以不要在析构/构造过程调用虚函数 补偿方法是将需要让派生类执行的函数以非虚函数的形式写好, 然后将其所需的变量通过构造函数构造初值列中进行传递....而不是friend, friend时常带来麻烦最好还是谨慎使用 25 考虑写出一个抛异常的swap函数 swap函数非常重要, 在编程很常使用, 因此一定要适当地实现它.

97530

asyncawait 和 promise

在语义上要理解,async表示函数内部有异步操作 另外注意,一般 await 关键字要在 async 关键字函数的内部,await 写在外面会报错。 2.await 在等什么?...一段代码执行时,会先执行宏任务的同步代码: 如果执行遇到 setTimeout之类宏任务,那么就把这个 setTimeout 内部的函数推入「宏任务的队列」,下一轮宏任务执行时调用。...如果执行遇到 promise.then() 之类的微任务,就会推入到「当前宏任务的微任务队列」,在本轮宏任务的同步代码执行都完成后,依次执行所有的微任务1、2、3。...执行new Promise() Promise构造函数是直接调用的同步代码,所以 console.log('promise1'): ?...在我们这个例子,就是 Promise.resolve(undefined) 正常处理完成,并返回其处理结果。那么 await async2() 就算是执行结束了。

66010

简历做好这3点,求职成功率高几倍

基本信息: (姓名/性别/毕业院校/电话/邮箱/居住地/期望地) 优化要点: 清晰罗列出以上信息,这样HR就不用在接下来的电话沟通或面试再去追问这些内容,建立我们接下来电话沟通对你的熟悉度。...点评:非常清晰的告诉简历阅读者自己做了什么事情,负责了什么样的事情,用了什么技术栈,且逻辑。 2 工作期望 个人评价 优化要点: 对自己有一个全方位的一个描述总结,让别人更好的解读你。...即使写个人评价,也一定记得写上工作期望。 注意事项: 完全看不出个性特点,写和没写没什么区别。...我希望过于依赖别人,即使没有后端没有设计没有产品经理,我依然想要把这个产品做到完美。毕竟全栈才能最高效地解决问题。 我对工作的态度:第一,要高效完成自己的本职工作。第二,要在完成的基础上寻找完美。...自己几斤几两从进门的举止就能看出一二,几句自我介绍是否能说明白也决定了五六分,蒙不了什么鸟都见过的HR,所以最好有前辈指导演练一下。

53650

Spark 源码(3) - Master 启动之持久化引擎和选举代理

二、持久化引擎的创建 new 了这个对象,我们去看它的构造方法: new ZooKeeperPersistenceEngine(conf, serializer) 首先从配置获取存储到 Zookeeper...选举代理,就是提供了一种组件,来实现主备 Master 的选举,它使用了 Curator 框架提供的 LeaderLatch 来实现的 在 ZooKeeperLeaderElectionAgent 的构造...LeadershipStatus.LEADER 第二件事是做了选举之后的一些逻辑,点进去可以看到,给自己发送了一个 ElectedLeader 消息: self.send(ElectedLeader) 那我们需要在...,给自己发送一个 CompleteRecovery 消息 CompleteRecovery 消息主要是最后检查一下刚刚恢复出来数据的准确性,此处细看。...至此,Master 就启动完成了。 四、总结 本次我们主要阅读了 Master 启动时,如何初始化持久化引擎以及选举代理,选举成功之后,都做了些什么事情,对于 Master 启动过程有了初步的了解。

34410

C++ 合成默认构造函数的真相

什么事情?像下面这段代码,默认构造函数”被需要“了吗?...以下四种情况的类,编译器总是需要默认构造函数完成某些工作: 1. 含有类对象数据成员,该类对象类型有默认构造函数。   ...b; //... }; int main() { B b; //编译至此时,编译器将为B合成默认构造函数 return 0; }   被合成的默认构造函数做了什么事情?...如果设计者没有定义任何一个默认构造函数,则编译器会合成一个默认构造函数完成上述操作,否则,编译器将在每一个构造函数插入代码来完成相同的事情。...这个指针的安插,编译器将会在合成默认构造函数完成,同样的,如果设计者已经写了多个构造函数,那么编译器不会重新写默认构造函数,而是把虚基类指针的安插代码插入已有的构造函数

75730

【Android基础】Android利用Intent与其他应用交互

Android系统的一个重要特性就是一个应用程序可以调用另外一个应用程序来完成用户的请求动作。...数据形式依赖于你想要做什么事情,数据可以是一个Uri,也可以是其他数据类型(基本数据类型或者对象)之一。数据不是必须的,你的Intent可以包含data。...如果你的数据(data)是Uri,可以利用Intent( action,Uri)的构造函数方便的创建Intent,下面的例子就是创建一个打电话的Intent,数据就是一个包含电话号码的Uri: Uri...Intent数据是有数据类型的,这个数据类型叫做MIME类型,默认情况下系统通过数据包含的Uri数据来确定数据的MIME类型,如果数据包含Uri,那么你需要调用setType()设置Intent数据的...验证Intent是否有效: 尽管Android系统内置的应用程序(比如:电话,邮件,日历)能够保证一些Intent肯定会被响应,但是你在发送一个Intent之前最好是要验证一下Intent能否会被系统处理

883100

【c++】类和对象(三)构造函数和析构函数

: int main() { Date d1; d1.Print(); return 0; } 这个默认生成的函数并没有做什么事情 我们可能会产生疑惑:不实现构造函数的情况下,编译器会生成默认的构造函数...,对内置类型不做处理,自定义回去调用他的默认构造 我们发现调用了A的构造 C++11 针对内置类型成员初始化的缺陷,又打了补丁,即:内置类型成员变量在类声明时可以给默认值。...因此,这个类设计在逻辑上等同于提供了两个默认构造函数,这在C++是不允许的,会导致编译错误 问题在于,当尝试创建一个传递任何参数的Date对象(如Dated1;),编译器将无法确定应该调用哪个构造函数...析构函数:与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。...,我们定义一个栈,如果写析构函数,则会发生内存泄漏 c语言中,我们主动调用Destroy函数 关于编译器自动生成的析构函数,是否会完成一些事情呢?

12410

【笔记】《C++Primer》—— 第7章:类

const,当创建const对象时,对象是在构造初始化完成后(执行构造函数体前的瞬间)获得const属性的 当没有任何构造函数时编译器会默认生成一个构造函数,初始化(值初始化,默认构造或用初始值赋值)类内的各种成员...在构造函数函数体间用冒号连接一段以逗号分隔的调用串,调用名为函数的成员,即为构造函数的初始值列表,可以很方便地在函数体是空时完成构造函数对值的赋值且如随后将要提到的,此方法有时必不可少 ?...对于类的名字查找过程有几处不同,首先处理类的成员的声明,再当类全部可见后再编译函数体 对于声明的所有名称都需要在使用前即可见,因此我们要把需要用到的名字在函数声明前就保证已经被声明了 然后对于声明的类型名...C11增加了“委托构造函数”,即我们可以简化之前重载多个类似的构造函数的代码,我们可以在构造函数初始值列调用非委托的构造函数了 ?...对于委托构造函数函数体,委托者会依次执行被委托的函数函数体,完成初始化后才执行自己的函数体 想使用默认构造函数时,方法是初始化对象时不使用后面的调用运算符(即小括号对),如直接写Test a; 当构造函数只接受一个实参时

58320

【干货】2016Java高薪面试题第三波

不受检查的异常不需要在方法或者是构造函数上声明,就算方法或者是构造函数的执行可能会抛出这样的异常,并且不受检查的异常可以传播到方法或者是构造函数的外面。...相反,受检查的异常必须要用throws语句在方法或者是构造函数上声明。 问:JavaException和Error有什么区别? 答:Exception和Error都是Throwable的子类。...放在现实场景中就是,当上级交待给你的任务无法完成的时候,使用异常。 异常的目的是将这个问题传递给调用方解决。 就像在现实环境,搞不定的时候找老板一样。...实现了远程接口的类应该声明被实现的远程接口,给每一个远程对象定义构造函数,给所有远程接口的方法提供实现。 问:什么是Servlet?...问:System.gc()和Runtime.gc()会做什么事情? 答:这两个方法用来提示JVM要进行垃圾回收。但是,立即开始还是延迟进行垃圾回收是取决于JVM的。 问:创建线程有几种不同的方式?

59240
领券