我正在从 C 指针过渡到 C++ 指针,现在正在学习 auto_ptr。这是我试过的程序:
#include <iostream>
#include <memory>
#include "Car.h"
using namespace std;
typedef auto_ptr<Car> CarPtr;
int main() {
CarPtr au_ptr1(new Car());
CarPtr au_ptr2 = new Car();
Car *norm_ptr1 = new Car();
Car *norm_ptr2(new Car());
int *i_ptr1=new int();
int *i_ptr2(new int());
}
像下面这样的语句是什么意思?
int *i_ptr2(new int());
Car *norm_ptr2(new Car());
上面提到的语句编译成功。下面的语句抛出编译错误 - CarPtr au_ptr2 = new Car();
这是为什么?
提前致谢
最佳答案
它确实有一个复制构造函数,但是转换构造函数是显式的,这就是导致错误的原因:
explicit auto_ptr (X* p=0) throw();
这意味着 Car*
无法隐式转换为 auto_ptr<Car>
, 这就是
CarPtr au_ptr2 = new Car();
尝试去做。这称为复制初始化,相对于:
CarPtr au_ptr1 (new Car());
这是值初始化。第一个版本将尝试创建一个临时的 CarPtr
来自Car*
并用它来初始化 au_ptr2
.第二种直接调用拷贝构造函数。
像这样的语句
int *i_ptr2(new int());
简单地用括号中的值对指针进行值初始化。
关于c++ - 指针有拷贝构造函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12723605/