gpt4 book ai didi

c++ - 为什么赋值运算符调用构造函数?

转载 作者:可可西里 更新时间:2023-11-01 15:03:52 26 4
gpt4 key购买 nike

我只是在玩弄以了解智能指针并尝试制作我的智能指针,但我遇到了一种我不完全理解的情况。这是代码:

#include <iostream>
template <class T>
class Holder
{
private:
T * obj;
public:
Holder(T * tt) : obj(tt)
{
std::cout << "ctor : " << tt->dummy << std::endl;
}
T * operator -> ()
{
return obj;
}
operator bool()
{
return obj;
}
T * const get() const
{
return obj;
}
void reset() {swap(0);}
void swap(T * other)
{
obj = other;
}
Holder & operator = (const Holder& holder)
{
obj = holder.get();
return *this;
}
Holder(const Holder & holder) : obj(holder.get()) {}
};

class A
{
public:
int dummy;
A(int a) : dummy(a) {}
};

int main ()
{
A * a = new A(1);
Holder<A> holder(a);
A * b = new A(2);
holder = b;

std::cout << holder->dummy << std::endl;

return 0;
}

代码编译并在 holder = b; 行调用 Holder 类的构造函数。我以为编译器会报错。不是赋值运算符,为什么要调用构造函数?

最佳答案

holder = b尝试从 b 分配至 Holder . b类型为 A* , 和 holder类型为 Holder<A> .

Holder模板定义来自相同 Holder 的另一个实例的赋值类型,所以编译器从 A* 寻找一个转换Holder<A> .它找到构造函数并使用它。

只接受一个参数的构造函数可以用于隐式转换,除非您用 explicit 标记它们关键字。

关于c++ - 为什么赋值运算符调用构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4383015/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com