C++ 复制静态对象的构造
C++ Copy Construction of Static Object
#include <iostream>
using namespace std;
class A
{
public:
int x;
A(){x= 30; cout << "A's constructor called " << endl;}
A(const A& obj) { cout<<"A's copy constructor called " <<endl; }
};
class B
{
public:
static A sample;
B() { cout << "B's constructor called " << endl; }
static A getSample() { return sample; }
};
A B::sample;
int main()
{
A one;
A two = B::getSample();
cout<<B::sample.x<<endl;
cout<<one.x<<endl;
cout<<two.x<<endl;
return 0;
}
上面的代码输出:
A's constructor called
A's constructor called
A's copy constructor called
30
30
-1032819680
为什么不复制构造函数将 x 的值复制到 B::getSample()
.换句话说,虽然B::getSample()=30
,为什么two.x
-1032xxxxxx
?
您已经定义了自己的复制构造函数,该构造函数不复制 x
的值。所以它没有初始化。
行为是正确的,复制构造器被调用为它们应该的样子......但:
如果你想two.x
30
,你需要在你的复制构造函数中复制x
值...在您的代码中并非如此。您只是打印A's copy constructor called
但复制构造函数不起作用。
只需将其更改为
A(const A& obj)
{
cout<<"A's copy constructor called " <<endl;
x = obj.x; // added!
}
然后,程序显示:
A's constructor called
A's constructor called
A's copy constructor called
30
30
30
两个是使用您定义的复制构造函数初始化的。在这个定义中,你没有给x赋任何值。这就是它打印垃圾的原因。
请注意
,如果未定义默认的复制构造函数,编译器将创建一个默认的复制构造函数。这将执行浅拷贝,这意味着使用标准赋值运算符 ('='( 单独复制类的每个成员。
x=obj.x;
由于这正是您无论如何都会要做的事情,因此真的没有理由覆盖。
如果您有一个没有动态分配的内存(或指针(的简单类,则此方法非常有效。但是,如果要复制指针(指向数据块(,则浅表复制不起作用。这是因为赋值运算符只是复制指针的地址,而不分配任何内存或复制指向的内容。
相关文章:
- 为什么C++在将一个对象复制到另一个对象时需要对这两个对象进行低级常量限定
- 如何在向量列表初始化时避免对象复制以及如何延长临时的生存期
- 了解在 C++ 中分配容器时的对象复制
- C++类对象复制构造函数和运算符=
- 复制 elision/RVO 会导致从同一对象复制/移动吗?
- 如何在循环内将大对象复制到omp任务中?
- 为什么当我添加一个不同的对象(复制构造函数中的参数)时调用复制构造函数?
- 无法将类构造函数中新创建的对象复制到 C++ 中的向量成员
- 将C++对象复制到指向新指针的指针处
- 将一个 OpenCV OutputArrayOfArrays 对象复制到另一个对象
- 选择性地禁用隐式对象复制
- 不能从文件到指针向量的对象复制
- 从派生对象复制构造
- OpenCV Mat对象复制速度更快
- 将子对象复制到父对象
- 为什么普通的 c++ 编译器不优化对象复制?
- C :将一个对象复制到构造函数中的另一个对象
- 使用命名对象复制构造函数
- 不必要的对象复制 - C++ STL
- 如何将一个类的对象复制到另一个类中