为什么C++复制构造函数会失败
Why will C++ copy constructor fail?
#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 编译器上是非法
相关文章:
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- 在构造函数中分配内存失败是如何冒泡的
- 函数返回时,带指针的复制构造函数失败
- MPICH 的 MPI_Comm_dup() 在复制构造函数中失败
- 引用构造函数时链接失败
- 类模板在其构造函数中的模板变量推导失败
- 构造函数SFINAE和继承在clang中失败
- 为什么即使直接构造函数有效,template_back也会失败
- 在 if 语句中调用重载构造函数失败
- 继承的构造函数,在 clang++3.9 中编译,在 g++ 7 中失败
- C ++回测问题:如何检查构造函数在假定失败时是否失败(给定输入的无效参数)
- 构造函数中的错误处理而不会失败
- 在构造函数中设置变量失败?
- C++模板化类默认构造函数失败
- 在 GCC 中工作的外行构造函数模板在 Clang 中失败
- STD :: MAP EMPLECE通过显式构造函数失败
- 可变参数模板构造函数的演绎指南失败
- 没有空构造函数的编译失败
- 打开不存在的文件时如何使流构造函数失败?
- c++尝试失败构造函数