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

时间:2015-06-18 10:11:11

标签: 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()
    {
        cout << data << endl;
    }

private:
    int data;
};

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

    i1.printData();
    i2.printData();
}

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

实际传递指针,代码也可以工作
Item i2(&i1);

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

2 个答案:

答案 0 :(得分:6)

Item i2(i1);

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

Item (const Item &);

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

Item (const Item &) = delete;

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

答案 1 :(得分:2)

编译器会生成复制构造函数并赋值函数,如果你不想使用这两个函数。你需要在类

的私有范围内声明它
private:
     Item(const Item&);
     Item& operator=(const Item&);