C++ 是否有必要使";=&引用;当我们将一个类的一个共享ptr分配给另一个类时,运算符?

C++ 是否有必要使";=&引用;当我们将一个类的一个共享ptr分配给另一个类时,运算符?,c++,C++,我有一个类,其中有多个指针作为数据成员 Class A { int* a; int* b; int c; } std::shared_ptr<A> Aa = std::make_shared<A>(); std::shared_ptr<A> Ab = std::make_shared<A>(); Ab = Aa; A类 { int*a; int*b; INTC; } std::shared_ptr Aa=std::make

我有一个类,其中有多个指针作为数据成员

Class A
{
    int* a;
    int* b;
    int c;
}
std::shared_ptr<A> Aa = std::make_shared<A>();
std::shared_ptr<A> Ab = std::make_shared<A>();
Ab = Aa;
A类
{
int*a;
int*b;
INTC;
}
std::shared_ptr Aa=std::make_shared();
std::shared_ptr Ab=std::make_shared();
Ab=Aa;
假设所有“Aa”数据成员(以及指针)都是用一些数据初始化的 我可以直接完成上述共享ptr任务吗? 还是需要重载赋值运算符?
请帮助..

std::shared_ptr
只是一个智能指针,它不关心它所持有的对象的成员,只关心对象本身

Aa
分配给
Bb
将销毁
Bb
持有的
A
对象,然后共享
Aa
持有的
A
对象的所有权

重载
operator=
与是否使用
std::shared\u ptr
无关。无论
A
对象是如何创建的,或者它的生命周期是如何管理的,
A
都负责管理它自己的成员,方法是遵循

如果一个类需要一个用户定义的析构函数、一个用户定义的复制构造函数或一个用户定义的复制赋值操作符,那么它几乎肯定需要这三个操作符

由于存在用户定义的析构函数、复制构造函数或复制赋值运算符会阻止移动构造函数和移动赋值运算符的隐式定义,因此需要移动语义的任何类都必须声明所有五个特殊成员函数

如果
A
的成员引用了
A
负责释放/释放的外部数据/资源,则
A
需要实现适当的构造函数、析构函数和赋值操作符来正确管理这些成员

如图所示,您的
A
类可能违反了3/5/0规则,但很难说清楚,因为您没有说明如何使用数据初始化成员

例如,这将是一种违反,因为
a
没有析构函数来释放它所拥有的
new
'ed
int
s:

A类
{
公众:
int*a;
int*b;
INTC;
};
B类:公共A
{
};
std::shared_ptr Aa=std::make_shared();
a->a=新整数(123);
a->b=新整数(456);
a->c=7890;
std::shared_ptr Bb=std::make_shared();
Bb=Aa;
鉴于
a
不拥有它所指向的
int
s,因此这不会违反规定:

A类
{
公众:
int*a;
int*b;
INTC;
};
B类:公共A
{
};
INTA=123;
int b=456;
std::shared_ptr Aa=std::make_shared();
a->a=&a;
a->b=&b;
a->c=7890;
std::shared_ptr Bb=std::make_shared();
Bb=Aa;
假设
A
负责为
int
s分配内存,3/5/0实现的一致性规则可能更像这样:

A类
{
公众:
std::唯一的ptr a;
std::唯一的ptr b;
int c=0;
A()=默认值;
A(常数A和src):
a(std::make_unique(*src.a)),
b(标准::使_唯一(*src.b)),
c(src.c)
{
}
A(A&&src):
a(标准::移动(src.a)),
b(标准::移动(src.b)),
c(src.c)
{
src.c=0;
}
virtual~A()=默认值;
A运算符=(A右侧)
{
标准:掉期(a,rhs.a);
标准:掉期(b,rhs.b);
标准:互换(c,rhs.c);
归还*这个;
}
};
B类:公共A
{
};
std::shared_ptr Aa=std::make_shared();
a->a=std::使_唯一(123);
a->b=std::使_唯一(456);
a->c=7890;
std::shared_ptr Bb=std::make_shared();
Bb=Aa;

以所示的方式将一个共享指针分配给另一个共享指针并不涉及在类
a
上调用复制构造函数,因此不需要定义它

std::shared_ptr<A> Aa = std::make_shared<A>();
std::shared_ptr<A> Bb = std::make_shared<B>();
Bb = Aa; // Copy assignment for shared_ptr (you now have two pointers to the same data)
<>但是你应该考虑如果你正在用对象切片创建问题:
什么是
B
?它是否继承自
A
?如果类确实需要赋值运算符,为了安全起见,您应该有一个赋值运算符(以及一个复制构造函数和析构函数来完成赋值)。让一个程序因意外复制而出轨真糟糕。你的B类定义是什么?
class
根本无法编译。很抱歉造成混淆,这里只有一个a类。两个共享指针(Aa和Ab)都属于相同的类类型。我已经相应地编辑了代码。
std::shared_ptr<A> Aa = std::make_shared<A>();
std::shared_ptr<A> Bb = std::make_shared<B>();
*Bb = *Aa;