本文主要是介绍C++ Primer 5th笔记(chap 18 大型程序工具) 重载与命名空间,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1. using 声明或 using 指示能将某些函数添加到候选函数集
2.
对于接受类类型实参的函数来说, 其名字查找将在实参类所属的命名空间中进行。在这些命名空间中所有与被调用函数同名的函数都将被添加到候选集当中, 即使其中某些函数在调用语句处不可见也是如此
namespace NS {class Quote { / … / };void display (const Quotes) { / . .. */ }
}//Bulk_item 的基类声明在命名空间 NS 中
class Bulk_item : public NS::Quote { / ... / };int main ( ) {Bulk_item bookl;display (bookl);return 0;
}
2.1 重载与 using 声明
using 声明语句声明的是一个名字, 而非一个特定的函数
using NS::print; //正确: using声明只声明一个名字
using NS::print (int ); //错误:不能指定形参列表
一个using声明囊括了重载函数的所有版本以确保不违反命名空间的接口
一个using声明引入的函数将重载该声明语句所属作用域中已有的其他同名函数。
如果using声明出现在局部作用域中, 则引入的名字将隐藏外层作用域的相关声明。
如果 using 声明所在的作用域中己经有一个函数与新引入的函数同名且形参列表相同, 则该 using 声明将引发错误。
除此之外, using 声明将为引入的名字添加额外的重载实例,并最终扩充候选函数集的规模。
2.2 重载与 using 指示
using 指示将命名空间的成员提升到外层作用域中, 如果命名空间的某个函数与该命名空间所属作用域的函数同名, 则命名空间的函数将被添加到重载集合中
namespace libs_R_us {extern void print(int);extern void print(double);
}
void print(const std::string &);using namespace libs_R_us;
// using directive added names to the candidate set for calls to print:
// print(int) from libs_R_us
// print(double) from libs_R_us
// print(const std::string &) declared explicitly
void fooBar(int ival)
{print("Value: "); // calls global print(const string &)print(ival); // calls libs_R_us::print(int)
}
2.3 跨越多个 using 指示的重载
如果存在多个 using 指示, 则来自每个命名空间的名字都会成为候选函数集的一部分
eg.
在全局作用域中, 函数 print 的重载集合包括 print (int ) 、 print (double ) 和print (long double), 尽管它们的声明位于不同作用域中, 但它们都属于 main 函数中 print 调用的候选函数集
namespace AW {int print(int);
}
namespace Primer {double print(double);
}// using directives:
// form an overload set of functions from different namespaces
using namespace AW;
using namespace Primer;
long double print(long double);int main() {print(1); // calls AW::print(int)print(3.1); // calls Primer::print(double)return 0;
}
这篇关于C++ Primer 5th笔记(chap 18 大型程序工具) 重载与命名空间的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!