【问题标题】:Passing parameters to constructors with no parameters将参数传递给不带参数的构造函数
【发布时间】:2020-08-05 19:40:34
【问题描述】:

我试图了解我正在使用的程序在做什么。下面,我包含了相关的代码。

StAnaPars的指针被创建:

StAnaPars* anapars12 = new StAnaPars;

程序访问anapars12的几个成员来设置不同的分析参数。

然后,类StAnaPars的另一个指针被创建如下:

StAnaPars *anapars12_toward = new StAnaPars(*anapars12);

StAnaPars的构造函数定义为:

   23 class StAnaPars : public TObject {
   24 public:
   25   StAnaPars()
   26     : mCorrectTowerEnergyForTracks(new StjTowerEnergyCorrectionForTracksNull)
   27     , useTpc(false)
   28     , useBemc(false)
   29     , useEemc(false)
   30     , useFms(false)
   31     , useMonteCarlo(false)
   32     , randomSelectorProb(1.0)
   33     , randomSelectorAt(false)
   34     , randomSelectorSeed(0)
   35     , changeTracks(0)
   36     , changeTowers(0)
   37   {
   38   }

我的问题是,当创建第二个StAnaPars指针anapars12_toward时,我们将它设置为等于new StAnaPars(*anapars12),但是StAnaPars的构造函数不接受任何参数。那么,这基本上是在复制anapars12 和现在的anapars12_toward = anapars12 吗?那么,两个指针具有相同的信息吗?但是当StAnaPars构造函数不接受任何参数时,我们怎么能做到这一点呢?

非常感谢您的帮助!

【问题讨论】:

  • 复制构造函数

标签: c++ class pointers constructor


【解决方案1】:

这段代码使用了复制构造函数。

复制构造函数是声明为T(const T& other) 的构造函数。它可以是用户定义的,或者,当不存在用户定义的复制构造函数时,它是隐式定义的,并按成员进行复制。

如果要明确禁止复制,可以将复制构造函数声明为:

T(const T&) = delete;

复制赋值也是如此——T& operator=(const T& other)(它也是隐式定义的)。

实际上,关于隐式复制构造函数何时真正定义,有一些重要的规则。有时,它被隐式地声明为已删除。 (例如,如果该类型的成员没有复制构造函数)。可以在此处找到规则摘要:https://en.cppreference.com/w/cpp/language/copy_constructor

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    • 2023-04-04
    • 2015-10-11
    相关资源
    最近更新 更多