2015-06-18 79 views
3

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

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

所以,是&是可选的?编译器是否意识到我打算传递一个指针而不是实际的对象并自己照顾它?我希望在这种情况下编译错误。我变得非常沮丧,如果我的代码工作时,它不应该:-)

回答

6
Item i2(i1); 

这工作,因为他并没有叫你的用户定义构造函数需要一个指针,它是调用隐式生成拷贝构造函数有签名:

Item (const Item &); 

如果你不希望这是有效的,可以将其删除(需要C++ 11):

Item (const Item &) = delete; 

如果你的编译器不支持C + +11,你可以宣布它是私密的。

2

如果你不想使用这两个函数,编译器会生成拷贝构造函数和赋值函数。你需要在私人范围内申报

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