为什么C++复制构造函数会失败

Why will C++ copy constructor fail?

本文关键字:失败 构造函数 复制 C++ 为什么      更新时间:2023-10-16
#include <iostream>
#include <string>
using namespace std;
class A
{
public:
    A() { i=1; j=2;};
    A (A &obj) { i= obj.i+100; j= obj.j+100;};
     int i;
     int j;
};
class B:public A
{
public:
    B():A() {i=10; j=20; k=30;};
    B(A &obj) {  A::A(obj); k=10000; };//
    int k;
};
int main()
{ 
    A dog;
    B mouse(dog);
    cout<<mouse.i<<endl;
    cout<<mouse.k<<endl;
    return 0;
}

我尝试为派生类编写一个复制构造函数,该构造函数利用基类的复制构造函数。我希望mouse.i应该是 101,但实际上编译结果是 1。mouse.k的值为 10000,这是预期的。我想知道我的代码有什么问题。

在此构造函数中:

B(A &obj) {  A::A(obj); k=10000; };

A::A(obj); 不初始化基子对象;相反,它会创建一个也称为 obj 的本地对象。相当于A::A obj;,相当于A obj;。[更新:或者它可能做了其他事情,或者它可能格式不正确 - 无论如何,这是错误的。

您想使用初始化器列表:

B(A & obj) : A(obj), k(10000) {}

此外,你几乎肯定希望构造函数参数是A const &的,以允许从常量对象或临时对象构造。

您必须使用初始化列表来调用父级的构造函数(并且您也应该为所有其他成员执行此操作):

B(A const& obj) : A(obj), k(10000) {}

此外,复制时不会修改原始对象,因此应const引用它。这将允许您从常量对象(或通过常量引用)进行复制,从而提高常量正确性。

你应该像这样初始化基类:

B(A &obj):A(obj) {  k=10000; }

(更多关于这一点,请参阅调用超类构造函数的规则是什么?还有一个旁注:将const用于复制构造函数参数:

A (const A &obj) {...}

编辑

初始化实例成员的首选方法是通过初始化列表,因此您的 ctor 将如下所示

B(A &obj):A(obj), k(10000) { }
#include <iostream>
#include <string>
using namespace std;
class A
{
public:
A()
{
    i=1;
    j=2;
}
A (A &obj)
{
    i= obj.i+100;
    j= obj.j+100;
}
 int i;
 int j;
};
class B:public A
{
public:
B():A() {i=10; j=20; k=30;}
B(A &obj)
:A(obj)
 {
  //A::A(obj);
  k=10000;
  }//
int k;
};
int main()
{
    A dog;
    B mouse(dog);
    cout<<mouse.i<<endl;
    cout<<mouse.k<<endl;
    return 0;
}

这对我来说是工作

B(A &obj)
{
    A::A(obj)
}

在 gcc 编译器上是非法