在函数中使用参数和声明有什么区别

时间:2012-11-29 23:14:21

标签: c++ parameters

我遇到了一个对我没用的问题但是通过使用参数解决了。 基本上,这有效:

void Inventory:: showInventory(char input)
{
    //char input[80];
    //cin >> input;
    //char inventoryRequest[] = "i";
    //int invent = strcmp (input,inventoryRequest);
    //compare the player input to inventoryRequest (i) to see if they want to look at inventory.
    if(input == 'i')
    {
    cout<< "\nYou have " << inventory.size() << " items.\n";
    cout << "----------------Inventory----------------\n";
    cout<< "\nYour items:\n";
    for (int i= 0; i< inventory.size(); ++i)
        cout<< inventory[i] << endl;
    }
    cout << "\n-----------------------------------------\n\n\n";


}

而不是:

void Inventory:: showInventory()
{
         char input;
    //char input[80];
    //cin >> input;
    //char inventoryRequest[] = "i";
    //int invent = strcmp (input,inventoryRequest);
    //compare the player input to inventoryRequest (i) to see if they want to look at inventory.
    if(input == 'i')
    {
    cout<< "\nYou have " << inventory.size() << " items.\n";
    cout << "----------------Inventory----------------\n";
    cout<< "\nYour items:\n";
    for (int i= 0; i< inventory.size(); ++i)
        cout<< inventory[i] << endl;
    }
    cout << "\n-----------------------------------------\n\n\n";


}

基本上我认为这是一样的。但显然不是第一个工作而第二个工作没有。 任何人都可以对此有所了解。

3 个答案:

答案 0 :(得分:4)

在第一个示例中,input是一个参数。它将由呼叫者初始化,无论他们选择传递什么值。

在第二个示例中,input是未初始化的变量。在分配之前读取它(正如你所做的那样)是未定义的行为,因为它当时包含垃圾。

答案 1 :(得分:1)

void Inventory:: showInventory(char input)

^这允许参数传递。

这意味着您可以调用someInv.showInventory('s')并将一些值传递给该方法,并且您传入的值将被分配给input,以便在方法的本地范围内使用。


void Inventory:: showInventory()

^这不;它只是在方法的局部范围内声明input,但是您无法从方法外部向input分配一些值。

此外,这实际上改变了方法的signature。因此,someInv.showInventory('s')之类的调用将失败,除非您的方法具有与char相同的名称

答案 2 :(得分:0)

在第一种情况下,当您调用它时,您会将char传递给该函数:inventory.showInventory('i')。这正是参数的用途。它们允许您将一些值传递给要处理的函数 - 与数学函数的参数完全相同。

在第二种情况下,您有一个未初始化的变量input,并且您尝试将其与'i'进行比较,从而导致未定义的行为。