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

Functions with pointer arguments in C++

本文关键字:参数 函数 指针 C++      更新时间:2023-10-16

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

#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);

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

Item i2(i1);

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

Item (const Item &);

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

Item (const Item &) = delete;

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

编译器

将生成复制构造函数并赋值函数,如果你不想使用这两个函数。 你需要在类的私有范围内声明它

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