我正在阅读一段代码并发现了一件奇怪的事情。声明了一个函数如下:
void func(int, int*);
但后来被定义为
void func(int a, int &p) { ... }
代码在Linux下的gcc中正确编译。这怎么可能?(它已被构建为C文件)
答案 0 :(得分:3)
#include<iostream>
#include<string>
// overloads, nothing to do with func(int, int&)
int func(int, int*);
int func(int, short);
int func(int, std::string);
int func(int a, int& b) {
return a;
}
int main() {
int x;
std::cout << func(4, x) << std::endl;
return 0;
}
也就是说,采用不同参数的函数是完全不同的函数(即使它们具有相同的名称)。据说这些函数有不同的签名。
答案 1 :(得分:2)
定义和声明均指不同的功能。更具体地说,是对同一函数名的不同重载。
此:
void func(int, int*);
声明一个功能int
和int*
。
此:
void func(int a, int &p) { ... }
声明并定义一个采用int
和int&
的函数。他们有不同的功能。调用看到两者的代码将根据重载分辨率调用适当的代码。
答案 2 :(得分:0)
我无法理解你的问题,但我猜你在参数b / w函数调用和函数定义的映射时很困惑,尤其是指针。 使用锁和键概念来理解指针。假设p是指针变量。 &amp; p是它的地址。
现在假设&amp;正在锁定。你想要访问价值p指向,所以你需要一把钥匙。现在我给你*钥匙打开你的&amp;锁定。 因此*(&amp; p)将为您提供存储在地址p指向的值。