C++名字查找和重载

  重载函数的定义:在同一作用域内的几个函数名字相同但形参列表不同,称为重载函数。这里有一个重要的前提就是:同一个作用域;

  而如果重载函数是定义在不同的作用域,那么一旦编译器在当前作用域找到所需的名字,编译器就会忽略掉外层作用域中的同名实体。剩下的工作就是在检查函数调用是否有效。

  因为这C++中,名字的查找发生在类型检查之前,如果在当前作用域找到了名字,若是有多个名字,进行参数匹配。如果当前作用域只有一个名字,则会直接忽略外层作用域,直接进行类型检查。

  类的继承体系也符合这种情况,因此除了覆盖继承而来的虚函数之外,最好不要重用其他基类中定义的名字。这样的话派生类中的名字只会简单的覆盖基类中同名的成员。

时间: 2024-11-08 23:10:46

C++名字查找和重载的相关文章

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

作用域屏蔽名字:内层作用域中声明的名字将隐藏外层作用域中声明的同名实体. 同名??C++有关同名的除了变量之外,也就是函数重载了!! [作用域对于函数重载的限制] 1. 在不同的作用域中无法重载函数名 2. 函数匹配时,编译器首先寻找对该函数名的声明,一旦在当前作用域中找到了所需的名字,编译器就会忽略掉外层作用域中的同名实体,剩下的工作就是检查函数调用是否有效了 #include <iostream> using namespace std; void print(double); void

模板中的名字查找问题

问题起源 先看下面很简单的一小段程序. `#include <iostream>` template <typename T> struct Base { void fun() { std::cout << "Base::fun" << std::endl; } }; template <typename T> struct Derived : Base<T> { void gun() { std::cout &l

类作用域中名字查找的思考(《C++ primer》第四版P382)

1.问题的引入 1).观察以下第一块代码: #include <iostream> using namespace std; class Screen{ public: void test(){ dummy_fcn( ); } void dummy_fcn( ){ } }: 此代码编译无错误............... 2).再看以下第二块代码: #include <iostream> using namespace std; void test(){ dummy_fcn( );

C++ Primer笔记3_默认实参_类初探_名字查找与类的作用域

1.默认函数实参 在C++中,可以为参数指定默认值,C语言是不支持默认参数的,Java也不支持! 默认参数的语法与使用: (1)在函数声明或定义时,直接对参数赋值.这就是默认参数: (2)在函数调用时,省略部分或全部参数.这时可以用默认参数来代替. 注意事项: (1)函数默认值只能赋值一次,或者是在声明中,或者是在定义中,都可以. (2)默认参数定义的顺序为自右到左.即如果一个参数设定了缺省值时,其右边的参数都要有缺省值.比如int f(int a, int b=1,int c=2,int d=

C++中名字隐藏,名字查找优先于类型检查

题目 C++中名字隐藏是什么? 解答 让我们通过一个例子来讲解C++中的名字隐藏.在C++中,如果一个类里有一个重载的方法, 你用另一个类去继承它并重写(覆盖)那个方法.你必须重写所有的重载方法, 否则未被重写的方法会因为名字相同而被隐藏,从而使它在派生类中不可见. 请看例子: class FirstClass{ public: virtual void MethodA(int); virtual void MethodA(int, int); }; void FirstClass::Metho

名字查找

定义:寻找与所用名字最匹配的声明的过程 1. 首先,在名字所在的块中寻找其他声明语句,只考虑在名字的使用之前出现的声明(确认是否是局部变量) 2. 如果没找到,继续查找外围作用域,继续向其他地方扩散寻找,确认是否是全局变量 3. 如果最后还是没有找到,那么程序会报错 对于定义在类内部的成员函数来说,解析规则有所区别, (1) 首先,编译成员的声明 (2) 直到类全部可见后才编译函数体. 按照这种两阶段的方式处理类可以简化类代码的组织方式,因为成员函数体 直到整个类可见后才会被处理,所以它能使用类

c++ 中的函数查找

template <class T> class visibility { public: void say(double d){}; private: void say(int i){}; void say(T t){}; }; int _tmain(int argc, _TCHAR* argv[]) { visibility<char*> v; v.say(123); // error C2248: 'visibility<T>::say' : cannot acc

揭秘:C++编译器的函数编译流程

http://www.cnblogs.com/zhenjing/archive/2010/10/20/1856309.html C++中的类型查找过程相对简单,基本上就是名字查找,这里不再介绍. 对于 .cpp 文件中调用的一个函数 ( 或成员函数 ), 编译器主要做了下面三件事情 : 1 名字查找 . 先在所在编译单元中可见名字实体中进行名字查找 .(1) 类成员函数优先 ( 对象所在的类 -> 基类 ). 一经找到就停止查找 . (2 )如果没有 ,在相应的名字空间中做进一步的搜索 ; (3

使用C++编译器的编译流程

C++中的类型查找过程相对简单,基本上就是名字查找,这里不再介绍.你可以学习C++编程-基础知识篇教程. 对于 .cpp 文件中调用的一个函数 ( 或成员函数 ), 编译器主要做了下面三件事情 :1.名字查找 . 先在所在编译单元中可见名字实体中进行名字查找 .(1) 类成员函数优先 ( 对象所在的类 -> 基类 ). 一经找到就停止查找 . (2 )如果没有 ,在相应的名字空间中做进一步的搜索 ; (3) 如果还没有 , 会根据函数参数所在的名字空间中查找 (keoning 查找 ).2.重载