C ++中声明和定义中的不同类型

时间:2014-11-28 11:02:27

标签: c++

我正在阅读一段代码并发现了一件奇怪的事情。声明了一个函数如下:

void func(int, int*);

但后来被定义为

void func(int a, int &p) { ... }

代码在Linux下的gcc中正确编译。这怎么可能?(它已被构建为C文件)

3 个答案:

答案 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*);

声明一个功能intint*

此:

void func(int a, int &p) { ... }

声明并定义一个采用intint&的函数。他们有不同的功能。调用看到两者的代码将根据重载分辨率调用适当的代码。

答案 2 :(得分:0)

我无法理解你的问题,但我猜你在参数b / w函数调用和函数定义的映射时很困惑,尤其是指针。 使用锁和键概念来理解指针。假设p是指针变量。 &amp; p是它的地址。

现在假设&amp;正在锁定。你想要访问价值p指向,所以你需要一把钥匙。现在我给你*钥匙打开你的&amp;锁定。 因此*(&amp; p)将为您提供存储在地址p指向的值。