C++学习笔记-----函数调用时的决议:名字查找,重载决议,可访问性检测
2017-07-09 23:27
471 查看
第一个程序
程序在编译的过程中会报错,而不是返回7,原因如下:
编译器在对func(7)这个调用进行决议时,主要做了三件事情,依次如下:
名字查找:在做其他事情之前,编译器会查找所有函数名为func的函数作为候选,查找时不受访问权限的限制,也就是说候选列表中有func(double)和func(int)两个函数。
重载决议:目的是在候选列表中找到唯一一个最佳匹配,程序中的参数为7,是int,所以选择的函数为func(int)。
可访问性检查:编译器进行访问行检测,确定被选定的函数是否可以被调用。
综上,在进行可访问性检查时发现,func(int)函数处于private作用域中,不能够被调用,所以在对func(7)进行调用时会报错。
编译过程会报错:无法访问private成员,函数myClass::func(int)不可访问。
第二个程序
在调用func(7)时同样会进行上述的三步决议,
名字查找:找到func(double)和func(unsigned)两个函数。
重载决议:由于7是int类型,在函数列表中没有一个函数与之匹配,所以出现二义性,即编译器也不知道选择哪个函数比较好。所以在重载决议时就会发生错误
可访问性检测:显然还没有检测可访问性就已经出错
编译过程会报错:对重载函数的调用不明确。
第三个程序
这个程序包含一个全局函数func(int),一个类内部的函数func(std::string);
程序通过test接口调用func(7)函数,同样也需要进行决议:
名字查找:名字查找的规则是倘若在一个作用域中找到至少一个名字匹配的函数,就不再去外层作用域中进行寻找。本程序中首先在类内部作用域中寻找,找到std::string func(std::string);函数,而后停止。换句话说,候选函数只有func(std::string);一个,而没有func(int);
重载决议:7是int类型,候选函数列表中没有与之匹配或者可以进行转换的函数,导致在重载决议处发生错误。
可访问性检测:仍然没有进行到这里。
编译过程会报错:没有从int到std::string的适当转换。
class myClass { public: myClass() {} double func(double n) { return n; } private: int func(int n) { return n; } }; int main() { myClass mc; mc.func(7); //报错 return 0; }
程序在编译的过程中会报错,而不是返回7,原因如下:
编译器在对func(7)这个调用进行决议时,主要做了三件事情,依次如下:
名字查找:在做其他事情之前,编译器会查找所有函数名为func的函数作为候选,查找时不受访问权限的限制,也就是说候选列表中有func(double)和func(int)两个函数。
重载决议:目的是在候选列表中找到唯一一个最佳匹配,程序中的参数为7,是int,所以选择的函数为func(int)。
可访问性检查:编译器进行访问行检测,确定被选定的函数是否可以被调用。
综上,在进行可访问性检查时发现,func(int)函数处于private作用域中,不能够被调用,所以在对func(7)进行调用时会报错。
编译过程会报错:无法访问private成员,函数myClass::func(int)不可访问。
第二个程序
class myClass { public: myClass() {} double func(double n) { return n; } private: unsigned func(unsigned n) { return n; } //不是int而是unsigned }; int main() { myClass mc; mc.func(7); //报错 return 0; }
在调用func(7)时同样会进行上述的三步决议,
名字查找:找到func(double)和func(unsigned)两个函数。
重载决议:由于7是int类型,在函数列表中没有一个函数与之匹配,所以出现二义性,即编译器也不知道选择哪个函数比较好。所以在重载决议时就会发生错误
可访问性检测:显然还没有检测可访问性就已经出错
编译过程会报错:对重载函数的调用不明确。
第三个程序
#include <string> int func(int); //全局函数 class myClass { public: double test() { return func(7); //调用哪个? } private: std::string func(std::string) //类内部函数 { return "hello world!"; } }; int main() { myClass mc; mc.test(); }
这个程序包含一个全局函数func(int),一个类内部的函数func(std::string);
程序通过test接口调用func(7)函数,同样也需要进行决议:
名字查找:名字查找的规则是倘若在一个作用域中找到至少一个名字匹配的函数,就不再去外层作用域中进行寻找。本程序中首先在类内部作用域中寻找,找到std::string func(std::string);函数,而后停止。换句话说,候选函数只有func(std::string);一个,而没有func(int);
重载决议:7是int类型,候选函数列表中没有与之匹配或者可以进行转换的函数,导致在重载决议处发生错误。
可访问性检测:仍然没有进行到这里。
编译过程会报错:没有从int到std::string的适当转换。
相关文章推荐
- C++基础学习笔记----第四课(函数的重载、C和C++的相互调用)
- C++学习笔记-----在重载的赋值运算函数中调用拷贝构造函数
- C++基础学习笔记----第四课(函数的重载、C和C++的相互调用)
- C++学习笔记:重载 函数调用符()
- Lua学习笔记(6) : 在Lua中调用C++之函数
- C++学习笔记二十 - 调用后面的函数需要先声明
- C++学习笔记(13)——利用对象、引用、指针调用虚函数
- C++之:函数调用的名字查找与继承
- C++学习笔记->函数重载
- C++学习笔记之 函数重载和函数指针在一起
- c++学习笔记之函数重载与const的关系
- 新手学习C++笔记5:函数的调用
- VS2010 C++ 学习笔记(一) 引用 函数参数默认值 函数重载 内联inline
- c++学习笔记(四):函数按指针调用和按引用调用
- Effective C++学习笔记 条款05:了解C++默默编写并调用的哪些函数
- C++学习笔记51——在构造函数和析构函数中调用虚函数
- C++学习笔记17——函数重载
- Effective c++学习笔记——条款5:了解C++默默编写并调用哪些函数
- C++学习笔记(八):函数重载、函数指针和函数对象
- C++学习笔记23,类内函数重载