名字查找先于类型检查:函数重载与作用域

作用域屏蔽名字:内层作用域中声明的名字将隐藏外层作用域中声明的同名实体

同名??C++有关同名的除了变量之外,也就是函数重载了!!

【作用域对于函数重载的限制】

1. 在不同的作用域中无法重载函数名

2. 函数匹配时,编译器首先寻找对该函数名的声明,一旦在当前作用域中找到了所需的名字,编译器就会忽略掉外层作用域中的同名实体,剩下的工作就是检查函数调用是否有效了

#include <iostream>

using namespace std;

void print(double);
void print(string);

int main()
{
	int a = 10;
	double d = 3.14;
	string s = "hello";
	void print(int);	// 隐藏外面作用域的print
	print(a);
	print(d);		// 调用的是print(int),输出3
//	print(s);		// 错误:print(string)被隐藏掉了
	return 0;
}

void print(int x)
{
	cout << x << endl;
}

void print(double x)
{
	cout << x << endl;
}

void print(string x)
{
	cout << x << endl;
}

小结:在C++中,名字查找发生在类型检查之前

原文地址:https://www.cnblogs.com/xzxl/p/8638866.html

时间: 2024-11-08 20:43:32

名字查找先于类型检查:函数重载与作用域的相关文章

函数重载与复制构造函数

函数重载与复制构造函数   一.函数重载 1.普通函数重载 用main函数多次重复调用一个相同名字但是不同类型的函数来处理不同类型的数据. 如 void func(int); void func(double); float func(float); void func(double); 2.成员函数的重载 我们可以将函数的重载推广到类的成员函数. Class  boy { Public: void  sum(); void  sum(int  x, int  y); } 二.函数的默认参数 在

c++-内联函数和函数重载和默认参数和函数指针

内联函数 C++ 内联函数是通常与类一起使用.如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方. 对内联函数进行任何修改,都需要重新编译函数的所有客户端,因为编译器需要重新更换一次所有的代码,否则将会继续使用旧的函数. 如果想把一个函数定义为内联函数,则需要在函数名前面放置关键字 inline,在调用函数之前需要对函数进行定义.如果已定义的函数多于一行,编译器会忽略 inline 限定符. 在类定义中的定义的函数都是内联函数,即使没有使用 inline 说

C++名字查找和重载

重载函数的定义:在同一作用域内的几个函数名字相同但形参列表不同,称为重载函数.这里有一个重要的前提就是:同一个作用域: 而如果重载函数是定义在不同的作用域,那么一旦编译器在当前作用域找到所需的名字,编译器就会忽略掉外层作用域中的同名实体.剩下的工作就是在检查函数调用是否有效. 因为这C++中,名字的查找发生在类型检查之前,如果在当前作用域找到了名字,若是有多个名字,进行参数匹配.如果当前作用域只有一个名字,则会直接忽略外层作用域,直接进行类型检查. 类的继承体系也符合这种情况,因此除了覆盖继承而

javascript函数参数、返回值类型检查

实现带参数.返回值类型声明的js函数: 类型定义:window.Str = Type.Str = Type.define('STRING', Type.isStr);var Per = Type.define('PERSON', function(p){    return p && p.type === 'person' && p.name;}); 定义函数:var addStr = Str(function(a, b){  return a + b;}, Str, St

C语言不进行类型检查 和函数可以不进行前向声明

编译器为gcc4.5 #include <stdio.h> int main() { printf("%d\n",add(3)); printf("%d\n",add('c')); printf("%d\n",add(3.2)); return 0; } int add(int a) { return a; } C 语言可以不进行前向声明,前提是定义的函数必须是 int型返回值和int型的形参. C语言不进行类型检查 和函数可以不进行

使用装饰器进行函数类型检查

动态类型的特性使得Python函数在被调用时,其参数类型不易被知晓.或者,为了动态支持多类型,实际参数的类型由调用者提供.如下: def add(x, y): return x + y print(add(2, 3)) # 5 print(add('Hello', ' World')) # Hello World 上面的例子可以看出,函数参数并没有指定类型,使得该函数支持多种类型,这也正是Python语言的特殊之处. 但有时候,我们想限制函数的参数类型.这时很多人会想到类型提示(Type Hin

基于 Python 3 新增的函数注解(Function Annotations )语法实现参数类型检查功能

2016-01-06 python python 3 / Function Annotations 函数注解(Function Annotations) 类型检查 参考资料 函数注解(Function Annotations) 函数注解语法 可以让你在定义函数的时候对参数和返回值添加注解: def foobar(a: int, b: "it's b", c: str = 5) -> tuple: return a, b, c a: int 这种是注解参数 c: str = 5 是

函数重载

重点: 1.重载函数:同一作用域内的几个函数名字相同但形参列表不同. NOTE: main函数不能重载. 2.两个函数如果只有返回类型不同,是不可以的. 3.Typedef  A  B  :B是A的别名. 4.顶层const没有区分:&const , *const 底层const 可区分:const& ,const*. 5.只能把const对象(或指向const的指针)传递给const形参: 相反,非常量可以转换成const. 6.是否重载函数要看哪个更容易理解. 7.函数的参数和返回类型

C++基础补遗篇—函数重载与Extern C

问题引出 之前提到C存在命名冲突问题,新的C++专门为此引入了namespace机制加以改进(后文介绍),此外还有另一种机制: int add(int i, int j) {    return i+i;  } float add(float a, float b, floatc)  {    return a+b+c;   } void main() { int a = add(8, 9); float b = add(7.7, 8.8, 9.9); } 上例在C环境下不成立,因为C编译器不允