C++ C++;

C++ C++;,c++,function,pointers,constructor,ampersand,C++,Function,Pointers,Constructor,Ampersand,我在理解指针函数的某些方面遇到了一些困难。以下是我正在运行的代码: #include <iostream> using namespace std; class Item { public: Item(Item * it) { data = it->data; } Item(int d) { data = d; } void printData() { co

我在理解指针函数的某些方面遇到了一些困难。以下是我正在运行的代码:

#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();
}
那么,符号和是可选的吗?编译器是否意识到我是想传递一个指针而不是实际对象,并自行处理?我预计在这种情况下会出现编译错误。如果我的代码在不应该工作的时候工作,我会非常沮丧:-)

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

Item (const Item &);
如果不希望此项有效,可以将其删除(需要C++11):


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

如果您不想使用这两个函数,编译器将生成复制构造函数和赋值函数。您需要在类的私有范围中声明它

private:
     Item(const Item&);
     Item& operator=(const Item&);
Item (const Item &);
Item (const Item &) = delete;
private:
     Item(const Item&);
     Item& operator=(const Item&);