c++ - 带/不带指针的函数原型使用区别
问题描述
我正在学习简单的 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()
?
解决方案
第一个程序的问题是您实际上并没有调用自己的swap
函数。在文件的顶部,您有:
using namespace std;
这会std::swap
进入范围,这就是您实际调用的函数。如果您cout
在自己的语句中添加一个语句,您swap
会发现它实际上从未被调用过。或者,如果你声明你的swap
before main
,你会得到一个模棱两可的电话。
请注意,此代码不需要像这样运行,因为iostream
不一定会std::swap
进入范围,在这种情况下,您将收到无法swap
调用的错误。
在第二个程序中,调用swap(&a, &b)
失败,因为没有std::swap
接受 2 个临时指针的重载。如果你swap
在调用之前声明你的函数main
,那么它会调用你自己的函数。
您的代码中真正的错误是using namespace std;
. 永远不要这样做,你会避免这种性质的问题。
推荐阅读
- android - Flutter:主从布局中的自定义 Appbar、浮动操作按钮和 BottomSheet
- functional-programming - SICP 3.6 - 兰德过程和局部状态变量
- javascript - Mocha 连接到错误的 javascript 文件
- javascript - 如何在 React 或 create-react-app 中列出源文件夹内容?
- php - 是否有用于 PHP 的 PostgreSQL SQL 查询字符串解析器?
- mysql - 如何从 Node.js 将汉字插入 MySQL 数据库?
- python-3.7 - 不启动 Python Django ver 3.7.1 django ver 3.0.4
- php - 使 Avatar 也成为超链接
- python - 单击下拉菜单中的所有组合并在 Selenium + Python 中打印文本结果:等待功能不起作用
- javascript - JavaScript“keydown”工作不正确