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

3

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

#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个回答

5
Item i2(i1);

这段代码之所以有效,是因为它没有调用你定义的接受指针参数的构造函数,而是调用了隐式生成的拷贝构造函数,其签名如下:
Item (const Item &);

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

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


2

如果您不想使用复制构造函数和赋值函数,编译器将生成这两个函数。为了避免这种情况,您需要在类的私有范围内声明它们。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接