首页 > 解决方案 > 带/不带指针的函数原型使用区别

问题描述

我正在学习简单的 C++ 教程。

#include <iostream>
using namespace std;

int main()
{
  int a = 1, b = 2;

  cout << "Before swapping " << endl;
  cout << "a = " << a << endl;
  cout << "b = " << b << endl;

  swap(a,b);

  cout << endl;
  cout << "After swapping " << endl;
  cout << "a = " << a << endl;
  cout << "b = " << b << endl;

  return 0;
}

void swap(int &n1, int &n2)
{
  int temp;
  temp = n1;
  n1 = n2;
  n2 = temp;
}

上面的代码工作正常(g++ 和 icc),但是如果我在函数中使用指针,如果我没有在程序的开头包含原型,代码就会失败。

#include <iostream>
using namespace std;

void swap(int*, int*);  // The code fails if I comment this line.

int main()
{
  int a = 1, b = 2;

  cout << "Before swapping" << endl;
  cout << "a = " << a << endl;
  cout << "b = " << b << endl;

  swap(&a, &b);

  cout << endl;
  cout << "After swapping" << endl;
  cout << "a = " << a << endl;
  cout << "b = " << b << endl;

  return 0;
}

void swap(int* n1, int* n2)
{
  int temp;

  temp = *n1;
  *n1 = *n2;
  *n2 = temp;
}

据我所知,C++编译过程是自上而下的,所以int main()遇到之前提供函数信息的第二段代码似乎更合理。我的问题是,为什么即使之前没有函数知识,第一个代码也能正常工作int main()

标签: c++pointersreference

解决方案


第一个程序的问题是您实际上并没有调用自己的swap函数。在文件的顶部,您有:

using namespace std;

这会std::swap进入范围,这就是您实际调用的函数。如果您cout在自己的语句中添加一个语句,您swap会发现它实际上从未被调用过。或者,如果你声明你的swapbefore main,你会得到一个模棱两可的电话。

请注意,此代码不需要像这样运行,因为iostream不一定会std::swap进入范围,在这种情况下,您将收到无法swap调用的错误。

在第二个程序中,调用swap(&a, &b)失败,因为没有std::swap接受 2 个临时指针的重载。如果你swap在调用之前声明你的函数main,那么它会调用你自己的函数。

您的代码中真正的错误是using namespace std;. 永远不要这样做,你会避免这种性质的问题。


推荐阅读