【问题标题】:Functions with pointer arguments in C++C++ 中带有指针参数的函数
【发布时间】:2015-09-03 22:07:15
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ function pointers constructor ampersand


    【解决方案1】:
    Item i2(i1);
    

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

    Item (const Item &);
    

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

    Item (const Item &) = delete;
    

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2018-01-03
        • 1970-01-01
        • 2019-10-20
        • 2018-09-20
        • 1970-01-01
        • 2012-09-28
        • 1970-01-01
        • 2018-08-25
        • 1970-01-01
        相关资源
        最近更新 更多