C++中带指针参数的函数

Val*_*rio 3 c++ constructor pointers function ampersand

我在使用指针理解函数的某些方面时遇到了一些困难.这是我正在运行的代码:

#include <iostream>

using namespace std;

class Item
{
public:

    Item(Item * it)
    {
        data = it->data;
    }

    Item(int d)
    {
        data = d;
    }

    void printData()
    {
        cout << data << endl;
    }

private:
    int data;
};

int main()
{
    Item i1(79);
    Item i2(i1);

    i1.printData();
    i2.printData();
}
Run Code Online (Sandbox Code Playgroud)

这段代码有效,问题是我不明白为什么!Item类的构造函数需要一个指针,但我将一个对象传递给它,而不是指向该对象的指针.如果我通过使用实际传递指针,代码也可以工作:

Item i2(&i1);
Run Code Online (Sandbox Code Playgroud)

那么,&符号是可选的吗?编译器是否认识到我的意思是传递指针而不是实际的对象并自己处理它?我希望在这种情况下出现编译错误.如果我的代码在不应该的时候工作,我会非常沮丧:-)

Tar*_*ama 6

Item i2(i1);
Run Code Online (Sandbox Code Playgroud)

这是因为它不调用用户定义的构造函数,它接受一个指针,它调用隐式生成的具有签名的复制构造函数:

Item (const Item &);
Run Code Online (Sandbox Code Playgroud)

如果您不希望它有效,可以删除它(需要C++ 11):

Item (const Item &) = delete;
Run Code Online (Sandbox Code Playgroud)

如果您的编译器不支持C++ 11,您可以将其声明为私有.