概述
第一个程序
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++学习笔记-----函数调用时的决议:名字查找,重载决议,可访问性检测所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复