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

(Ab)使用构造函数和析构函数进行副作用的不良做法?备择方案?

使用构造函数和析构函数进行副作用的不良做法是将副作用与对象的生命周期绑定在一起,这可能导致代码的可读性和可维护性下降。副作用是指对外部环境产生的可观察的状态变化,例如修改全局变量、写入文件、发送网络请求等。

这种做法存在以下问题:

  1. 可读性差:将副作用与对象的构造和析构混在一起,使得代码难以理解和调试。
  2. 可维护性差:当需要修改副作用时,需要同时修改构造函数和析构函数,增加了代码的复杂性和出错的可能性。
  3. 难以测试:由于副作用与对象的生命周期绑定,测试时需要创建和销毁对象,增加了测试的复杂性和耗时。

备选方案是将副作用与对象的生命周期解耦,可以通过以下方式实现:

  1. 使用单独的方法来执行副作用:将副作用的代码放在一个独立的方法中,通过调用该方法来执行副作用。这样可以使代码更加清晰和可读。
  2. 使用工厂模式:将对象的创建和副作用的执行分离,通过工厂模式来创建对象,并在需要执行副作用时调用相应的方法。
  3. 使用依赖注入:将副作用的代码封装在独立的类或模块中,并通过依赖注入的方式将其注入到需要使用的对象中。

通过以上备选方案,可以提高代码的可读性、可维护性和可测试性,减少不必要的耦合。

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

相关·内容

使用Python类构造函数函数

1、问题背景当使用Python类时,可以使用构造函数函数来初始化清理类实例。构造函数在创建类实例时自动调用,而函数在删除类实例时自动调用。...在上面的代码示例中,Person类具有一个构造函数__init__一个函数__del__。...函数__del__在Person类实例被删除时被调用,它将类实例的人口计数population减1。...问题是,如果我在程序中显式地删除Person类实例,函数__del__是否会被自动调用,或者我是否需要在“main”程序/类中添加一些东西,如上面的代码示例所示?...2、解决方案函数__del__会在垃圾回收器收集对象时自动调用,而不是在丢失对对象最后一个引用时,也不是在执行del object时调用。

10910

【C++】继承 ⑥ ( 继承中构造函数函数 | 类型兼容性原则 | 父类指针 指向 子类对象 | 使用 子类对象 为 父类对象 进行初始化 )

地方 , 都可以使用 " 公有继承 " 派生类 ( 子类 ) 对象 替代 , 该 派生类 ( 子类 ) 得到了 除 构造函数 函数 之外 所有 成员变量 成员方法 ; 功能完整性 :..." 公有继承 " 派生类 ( 子类 ) 本质上 具有 基类 ( 父类 ) 完整功能 , 使用 基类 可以解决问题 , 使用 公有继承派生类 都能解决 ; 特别注意 : " 保护继承 " ..." 私有继承 " 派生类 , 是 不具有 基类 完整功能 , 因为 最终继承 后派生类 , 无法在 类外部调用 父类 公有成员 保护成员 ; 2、类型兼容性原则应用场景 " 类型兼容性原则...); } 2、使用 子类对象 为 父类对象 进行初始化 定义父类对象 , 可以直接使用 子类对象 进行初始化操作 ; // II....类型兼容性原则 : 使用 子类对象 为 父类对象 进行初始化 Parent parent = child; 3、完整代码示例 #include "iostream" using namespace

22620

AB test 业务价值、原理流程实际案例

PM或者项目经理确定正式上线日期 • 效果验证评估 。使用假设检验方法通过构造统计量或者p-value来判断实验结果核心指标是否有显著差异。...A/B实验中原假设就是 指「新策略没有效果」。 假设H1:是实验者想要收集证据予以⽀持假设,与原假设互斥。A/B实验中假设就是指「新策略有效果」。...5.1 检验方式 检验方式分为两种:双侧检验单侧检验。 单侧检验又分为两种:左侧检验右侧检验。 双侧检验:假设没有特定⽅向性,形式为「≠」这种检验称为双侧检验。...基本步骤如下: 1、建立假设 2、给出未知参数一个估计量 3、构造统计量Z,要求当H0成立时可以求解Z分位数 4、以Z为基础,根据假设实际意义,构造一个拒绝域W表达形式 5、确定拒绝域W中临界值...比如,为了提升公司营收,在公司产品某个app内嵌入了广告,但这种增加营收方式是以降低用户使用体验代价来进行,因此一个方面的优化可能会导致另一方面的劣化。

1.3K40

内联函数 c-浅谈内联函数与宏定义区别详解

构造函数函数容易让人误解成使用内联更有效。要当心构造函数函数可能会隐藏一些行为,如“偷偷地”执行了基类或成员对象构造函数函数。...所以不要随便地将构造函数函数定义体放在类声明中。   一个好编译器将会根据函数定义体,自动地取消不值得内联(这进一步说明了inline不应该出现在函数声明中)。   ...第9章 类构造函数函数与赋值函数   构造函数函数与赋值函数是每个类最基本函数。它们太普通以致让人容易麻痹大意,其实这些貌似简单函数就象没有顶盖下水道那样危险。   ...每个类只有一个函数一个赋值函数,但可以有多个构造函数(包含一个拷贝构造函数,其它称为普通构造函数)。...原因如下:   (1)如果使用“缺省无参数构造函数“缺省函数”,等于放弃了自主“初始化”“清除”机会,C++发明人好心好意白费了。

62740

构造函数函数

一、构造函数函数由来 类数据成员不能在类声明时候初始化,为了解决这个问题? 使用构造函数处理对对象初始化。...构造函数是一种特殊成员函数,与其他函数不同,不需要用户调用它,而是创建对象时候自动调用。函数是对象不再使用时候,需要清理资源时候调用。...(2)类初始化构造函数关系 常用初始化方式大概有以下5种: ClassTest ct1("ab"); ClassTest ct2 = "ab"; ClassTest ct3 = ct1; ClassTest...三、类函数函数构造函数作用相反,释放对象使用资源,并销毁非static成员。 (1)内存泄漏 下面代码有何隐患?...在mian函数执行完毕之后,ctct1分别调用函数,所以delete两次同一块内存空间,所以程序会崩溃。下面的输出结果也验证了我们猜想是正确。建议在这种情况下采用深拷贝进行操作。

1.8K20

控制对象创建方式(禁止创建栈对象or堆对象)创建数量

可以将构造函数函数设为私有的,这样系统就不能调用构造/函数了,当然就不能在栈中生成对象了。...所以,如果将构造函数函数都声明为private会带来较大副作用,最好方法是将函数声明为private,而构造函数保持为public。...再进一步,将函数设为private除了会限制栈对象生成外,还有其它影响吗?是的,这还会限制继承。如果一个类不打算作为基类,通常采用方案就是将其函数声明为private。...//对hash_ptr指向对象进行操作 hash_ptr->destroy() ; hash_ptr = NULL ; //防止使用悬挂指针 现在感觉是不是好多了,生成对象释放对象操作一致了。...如果我们想让对象产生个数不是一个,而是最大为N(N>0)个。可以在类内部设置一个静态计数变量,在调用构造函数时,该变量加1,当调用函数时,该变量减1。

1.9K20

《Effective C++》读书笔记(二):构造赋值运算(条款05~条款12)

而对于类中自定义类型,它们会自动调用构造函数,如果是别的类自定义类型,则会到它们自己类中去调用它们构造函数。在多态中,基类先构造,然后再是派生类构造。...做法比较简单,就是使用try{} catch(...) {};捕获,在catch主体内,可以选择使用abort()来结束程序,也能进行其它操作,比如记下失败等待。...理由是:在构造期间,基类构造函数virtual函数不会下降到派生类阶层。...只要我们换一个思路,自底向上地传入信息,即先用static特性,把派生类一些必要数据进行初始化,然后传递给基类就可以了。 总结:我们不要再构造期间调用virtual函数了。...做法就是在派生类中拷贝构造函数赋值重载中调用基类拷贝构造赋值函数

34110

【深入浅出C#】章节 4: 面向对象编程基础:构造函数函数

构造函数函数在对象生命周期中起着关键作用。构造函数确保对象在创建时具有合适初始化状态,而函数则确保对象在销毁时进行必要清理操作。...开发者应该根据具体需求合理设计使用构造函数函数,遵循最佳实践,以确保程序正确性可靠性。...同时,函数调用是由垃圾回收器控制,因此无法确定函数被调用的确切时间点。因此,在大多数情况下,使用函数来释放非托管资源可能不是最佳做法。...在一些情况下,可以使用IDisposable接口Dispose方法来显式释放非托管资源,但这并不是手动调用函数替代方案。Dispose方法应该由调用方显式调用,而不是由函数调用。...通过合理使用构造函数函数,并遵循最佳实践,可以提高代码可读性、可维护性,并确保对象在创建和销毁过程中正确行为。 四、总结 构造函数函数是面向对象编程中重要概念。

37320

构造管“生”对象?管“埋”对象?C++中构造还没整明白?

OOP语言(例如Java,C ++,C#)使开发人员可以在问题空间中进行思考,并使用软件对象来表示抽象问题空间实体进行建模从而解决问题。因此OOP会更聚焦于问题域!...对象来自于类实例化,谁负责实例化对象呢?这就是类中构造函数活,那么函数就是销毁对象。所以构造函数管生,函数管埋。...函数没有参数,也没有返回类型。 具有函数对象不能成为联合成员。 函数应在该类public部中声明。 程序员无法访问函数地址。 一个类有且仅有一个函数。...如果没有显式定义函数,编译器会自动生成一个默认函数。 既然函数构造函数反向操作,对于对象管"埋",那么什么时候“埋”呢?...OOP语言(例如Java,C ++,C#)使您可以在问题空间中进行思考,并使用软件对象来表示抽象问题空间实体以解决问题。

54020

copy-and-swap 是什么

其中复制构造函数函数实现起来比较容易,但是赋值运算符(=)要复杂许多,而 copy-and-swap 就是实现赋值运算符(=)完美解决方案。它既能避免代码冗余,还可以提供 强异常安全保证。...那 copy-and-swap 是怎么实现呢?大致思路是:先用复制构造函数创建一个副本,然后利用函数swap交换其成员数据,当作用域退出,副本函数会自动调用。...这里有三个注意点:一,复制构造函数应该是可用;二,这里swap并非指std::swap,而是需要我们自己写,而且需要保证swap不会抛出异常;三:函数也应该是可用。...以一个例子来更深入地理解 我们先定义一个类,管理一个动态数组,并实现它复制构造函数函数, #include // std::copy #include ...(例如,mArray 置为 nullptr,mSize 置为 0),这样 swap 之后,那个右值可以安全进行

81810

《Effective C++》学习笔记

构造//赋值运算 条款05:了解C++默默编写并调用哪些函数 当没有声明时,编译器会自动为类创建默认构造函数函数、复制构造函数赋值构造函数,但如果成员变量中包含引用、const这些不能被改变值...条款08:别让异常逃离析函数 函数不要抛出异常,如果函数中调用函数可能抛出异常,函数应该捕捉并记录下来然后吞掉他(不传播)或结束程序。...条款09:绝不在构造过程中调用虚函数构造函数函数中不要去调用虚函数,因为子类在构造/时,会调用父类构造/函数,此时其中函数是调用父类实现,但这是父类函数可能是纯虚函数...对于循环操作,在循环前还是中进行构造,取决于赋值操作与构造+操作成本对比。...循环前:1个构造函数+1个函数+n个赋值操作 循环后:n个构造函数+n个函数 条款27:尽量少做转型操作 尽量避免使用转型cast(包括C类型转换C++四个新式转换函数),特别是注重效率代码中避免用

1.1K20

《Effective C++》读书笔记(2):构造赋值运算

款5、了解C++默认编写并调用哪些函数 通常情况下,如果代码中没有声明构造函数、拷贝构造函数、拷贝运算符、函数,编译器会在需要时创建他们,但这往往只能满足编译器需求,很可能无法满足程序需求.../函数是只是调用基类非静态成员变量构造函数/函数;生成函数是非虚,除非基类有虚函数。...virtual函数 C++构造过程是先构造基类再构造子类、先初始化再进入构造函数体;过程相反。...对于派生类构造函数而言,进入其中时基类部分已构造完而派生类部分未构造完,对象类型是基类,故而此时调用虚函数,实际上使用是基类函数函数同理。...进入函数后派生类部分呈未定义值,对象类型是基类,调用是基类函数。 总而言之,在构造函数函数中虚函数行为有特殊变化;为了避免出错,不要在其过程中使用函数

13930

C++ 构造函数函数

本文主要介绍了类对象通过拷贝函数进行初始化,分析了类对象内存模型,以及通过this指针来实现更复杂功能。最后介绍了函数基础知识。...之所以说它特殊,是因为C++已经自动为构造函数提供了名称使用语法,程序员只需要提供方法定义即可,即:类名(形参列表)。...那么输出就变成了: p1 age:20 p2 age:50 p3 age:50 4、函数构造函数创建对象后,程序负责跟踪该对象,知道其过期为止。当对象过期时,程序自动调用函数完成清理工作。...与构造函数一样,C++默认提供了一个空函数,定义为:~类名( )。...输出为: 调用函数 调用函数

94000

C++ 成员对象封闭类

上例中,如果 CCar 类不定义构造函数,则会使用默认无参构造函数,那么下面的语句会编译出错: CCar car; 因为编译器不明白 CCar 类中 tyre 成员对象该如何初始化。...具体做法是: 通过封闭类构造函数初始化列表。 构造顺序 封闭类对象生成时,先执行所有成员对象构造函数,然后才执行封闭类构造函数。...成员对象构造函数执行顺序,与在封闭类定义成员对象顺序一致。 当封闭类对象消亡时,只需要记住一句话:先构造对象,后。 所以由于封闭类是最后才被构造,所以封闭类对象最先。...通过下面的代码例子,就更能明白封闭类成员函数构造顺序了: ?...执行结果: CTyre 构造函数 CEngine 构造函数 CCar 构造函数 CCar 函数 CEngine 函数 CTyre 函数 封闭类复制构造函数 当封闭类执行复制构造函数时,

66830

C++ 类使用规范建议

缺点:在构造函数中执行操作引起问题有: (1) 构造函数中不易报告错误,尽量不要使用异常,原因是因为在构造函数中抛出异常,在概念上将被视为该对象没有被成功构造,因此当前对象函数就不会被调用,那么就容易造成内存泄露...5.函数 函数(destructor) 与构造函数作用相反,当对象结束其生命周期时(例如对象所在函数已调用完毕),程序自动执行函数,释放对象占用内存资源。...使用函数需要注意以下几点: (1)如果基类还有虚函数,那么函数要申明为virtual。这么做原因是类对象时候能够动态调用函数,防止内存泄露。...(2)一般情况下,应该避免在构造函数函数中调用虚函数,如果一定要这样做,程序猿必须清楚,这时对虚函数调用其实是实调用。可参考博客:C++不要在构造函数函数中调用虚函数。...15.小结 关于类注意事项使用规范,总结一下: (1)不在构造函数中做太多逻辑相关初始化; (2)编译器提供默认构造函数不会对变量进行初始化,如果定义了其他构造函数,编译器不再提供,需要编码者自行提供默认构造函数

1.8K20

关于C++函数返回值拷贝优化问题

这是函数 可以发现fun()函数在返回BigObj对象时候没有进行拷贝,这是由于编译期帮我们做了拷贝优化。...移动语义 但是编译器堆函数返回值拷贝优化并不是能完全实现,有一些特殊情况下会失效。所以比较保险做法是定义移动构造函数,当没有拷贝优化时候可以通过移动语义避免低效拷贝。...这是移动构造函数 这是函数 这是函数 可以看到关闭拷贝优化以后,在定义了移动构造函数时候,函数返回零时对象时候会调用移动构造函数,转义所有权,减少数据拷贝。...但是移动构造也会生成一个新对象,所以输出结果中会调用两次函数,第一次函数函数中定义零时对象,第二次是函数返回值返回后对象。...注释掉上面的移动构造函数,我们可以看到输出结果如下: 这是默认构造函数 这是拷贝构造函数 这是函数 这是函数 这个结果是在预料之中,没有拷贝优化,没有移动构造函数情况下,程序会调用拷贝构造函数

14110

万字长文【C++】高质量编程指南

是 C++/C语言标准函数,对于非内部数据类型对象而言,它无法满足动态对象要求,对象在创建同时要自动执行构造函数,对象在消亡之前要自动执行函数,库函数不在编译器控制权限之内,不能执行构造...,但是如果函数体内执行代码时间相比于函数调用开销大,将没有收益 2,函数体内代码比较长,使用内联将导致内存消耗代价较高 3,函数体内出现循环,那么执行函数体内代码时间要比函数调用开销大 4,不要随便地将构造函数函数定义体放在类声明中...8.4.类设计 8.4.1.构造函数函数与赋值函数 每个类只有一个函数一个赋值函数,但是可以有多个构造函数,包含一个拷贝构造函数,其他成为普通构造函数。...根据经验,不少难以察觉程序错误是由于变量没有被正确初始化或清除造成,因此把对象初始化放在构造函数,把清除工作放在函数,当对象被创建时候,构造自动执行,对象消亡时,自动执行,不要担心忘记对象初始化清除工作了...如果成员对象按照初始化表次序进行构造,将导致函数无法得到唯一逆序。

1.4K20

关于C++函数返回值拷贝优化问题

移动语义但是编译器堆函数返回值拷贝优化并不是能完全实现,有一些特殊情况下会失效。所以比较保险做法是定义移动构造函数,当没有拷贝优化时候可以通过移动语义避免低效拷贝。...CMAKE_CXX_FLAGS} -fno-elide-constructors")add_executable(CxxTutorial main.cpp)通过配置关闭拷贝优化以后,我们执行上面的程序,输出结果如下:这是默认构造函数这是移动构造函数这是函数这是函数可以看到关闭拷贝优化以后...但是移动构造也会生成一个新对象,所以输出结果中会调用两次函数,第一次函数函数中定义零时对象,第二次是函数返回值返回后对象。...注释掉上面的移动构造函数,我们可以看到输出结果如下:这是默认构造函数这是拷贝构造函数这是函数这是函数这个结果是在预料之中,没有拷贝优化,没有移动构造函数情况下,程序会调用拷贝构造函数。...如果不能进行拷贝优化,在有定义移动构造函数时候,则会调用移动构造函数进行返回值对象所有权转义,减少不必要拷贝。最后,这两种情况失效时候,才会调用拷贝构造函数进行对象深拷贝。

30640

Google C++编程风格指南(四)之类相关规范

5.函数 函数(destructor) 与构造函数作用相反,当对象结束其生命周期时(例如对象所在函数已调用完毕),程序自动执行函数,释放对象占用内存资源。...使用函数需要注意以下几点: (1)如果基类还有虚函数,那么函数要申明为virtual。 这么做原因是类对象时候能够动态调用函数,防止内存泄露。...(2)一般情况下,应该避免在构造函数函数中调用虚函数,如果一定要这样做,程序猿必须清楚,这是对虚函数调用其实是实调用。可参考博客:C++不要在构造函数函数中调用虚函数。...15.小结 关于类注意事项使用规范,总结一下: 不在构造函数中做太多逻辑相关初始化; 编译器提供默认构造函数不会对变量进行初始化,如果定义了其他构造函数,编译器不再提供,需要编码者自行提供默认构造函数...参考文献 [1] C++构造函数函数中抛出异常注意事项 [2]C++不要在构造函数函数中调用虚函数 [3]百度文库.Google C++编码规范中文版 [4]李健.编写高质量代码

83421
领券