环球速读:如何使用using声明防止命名冲突?命令空间的using声明
1、概述
【资料图】
我们用到的库函数基本上都属于命名空间std的,在程序使用的过程中要显示的将这一点标示出来,如std::cout。这个方法比较烦琐,而我们都知道使用using声明则更方便更安全。
这个我们程序员肯定都知道了,今天突发奇想就想对using整理一下。
2、命令空间的using声明
我们在书写模块功能时,为了防止命名冲突会对模块取命名空间,这样子在使用时就需要指定是哪个命名空间,使用using声明,则后面使用就无须前缀了。例如:
using std::cin;//using声明,当我们使用cin时,从命名空间std中获取它int main(){int i;cin >> i;//正确:cin和std::cin含义相同cout << i;//错误:没有对应的using声明,必须使用完整的名字return 0;}
需要注意的是每个名字需要独立的using声明。例如:
using std::cin;//必须每一个都有独立的using声明using std::cout; using std::endl;//写在同一行也需要独立声明
位于头文件的代码一般来说不应该使用using声明。因为头文件的内容会拷贝到所有引用它的文件中去,如果头文件里有某个using声明,那么每个使用了该头文件的文件就都会有这个声明,有可能产生名字冲突。
3、在子类中引用基类成员
在子类中对基类成员进行声明,可恢复基类的防控级别。有三点规则:
在基类中的private成员,不能在派生类中任何地方用using声明。在基类中的protected成员,可以在派生类中任何地方用using声明。当在public下声明时,在类定义体外部,可以用派生类对象访问该成员,但不能用基类对象访问该成员;当在protected下声明时,该成员可以被继续派生下去;当在private下声明时,对派生类定义体外部来说,该成员是派生类的私有成员。在基类中的public成员,可以在派生类中任何地方用using声明。具体声明后的效果同基类中的protected成员。
例如:
class Base {protected: void test1() { cout << "test1" << endl; } void test1(int a) {cout << "test2" << endl; } int value = 55;}; class Derived : Base //使用默认继承{public: //using Base::test1;//using只是声明,不参与形参的指定 //using Base::value; void test2() { cout << "value is " << value << endl; }};
我们知道class的默认继承是private,这样子类中是无法访问基类成员的,即test2会编译出错。但是如果我们把上面注释的声明给放开,则没有问题。
注意:using::test1只是声明,不需要形参指定,所以test1的两个重载版本在子类中都可使用。 但是在往下派生,则只能使用无参函数,具体什么原因就不知道了…
4、使用using起别名
相当于传统的typedef起别名。
typedef std::vectorintvec;using intvec= std::vector;//这两个写法是等价的
这个还不是很明显的优势,在来看一个列子:
typedef void (*FP) (int, const std::string&);
若不是特别熟悉函数指针与typedef,第一眼还是很难指出FP其实是一个别名,代表着的是一个函数指针,而指向的这个函数返回类型是void,接受参数是int, const std::string&。
using FP = void (*) (int, const std::string&);
这样就很明显了,一看FP就是一个别名。using的写法把别名的名字强制分离到了左边,而把别名指向的放在了右边,比较清晰,可读性比较好。比如:
typedef std::string (* fooMemFnPtr) (const std::string&); using fooMemFnPtr = std::string (*) (const std::string&);
来看一下模板别名。
templateusing Vec = MyVector; // usageVecvec;
若使用typedef
templatetypedef MyVectorVec; // usageVecvec;
当进行编译的时候,编译器会给出error: a typedef cannot be a template的错误信息。
那么,如果我们想要用typedef做到这一点,需要进行包装一层,如:
templatestruct Vec{ typedef MyVectortype;};// usageVec::type vec;
正如你所看到的,这样是非常不漂亮的。而更糟糕的是,如果你想要把这样的类型用在模板类或者进行参数传递的时候,你需要使用typename强制指定这样的成员为类型,而不是说这样的::type是一个静态成员亦或者其它情况可以满足这样的语法,如:
templateclass Widget{ typename Vec::type vec;};
然而,如果是使用using语法的模板别名,你则完全避免了因为::type引起的问题,也就完全不需要typename来指定了。
templateclass Widget{ Vecvec;};
一切都会非常的自然,所以于此,模板起别名时推荐using,而非typedef。
感谢大家,我是假装很努力的YoungYangD(小羊)。
标签:
相关推荐:
最新新闻:
- d盘打不开怎么办? b盘打不开解决方法
- 电磁调速电机是什么原理?电磁调速电机常见故障分析
- 如何理解KMT字符串匹配算法?如何计算出KMT数组?
- 天天热门:NCBI-BLAST在线使用教程详细攻略(图解)
- 全球信息:【RL】算法简介与实现 Value-Based-Learning算法
- 电阻的单位是什么?SMT贴片电阻510R与510K的区别在哪?
- 环球看热讯:【企业版】Mule3的新增特点-云连接
- 天天观焦点:对数的计算公式是什么?对数的计算公式性质及推导过程
- 环球速读:如何使用using声明防止命名冲突?命令空间的using声明
- 当前视点!戴尔XPS15/17笔记本2023款发布:搭载13代酷睿+40系显卡
- 对标比亚迪唐,领克大5座SUV领克08来了,或搭载魅族Flyme Auto车机
- 世界微动态丨《爆衣战士 零》Steam页面上线 支持简繁体中文
- 打赢了!科比坠机照片泄露案其遗孀获赔2885万美元
- 报道:iPhone16Pro有望采用屏下面容 2026年用上屏下摄像头
- 微美全息开发基于图像处理的动态手势交互系统:全球热点评
- 环球观速讯丨努比亚发布裸眼3D平板电脑
- 努比亚Z50 Ultra影像参数公布:35mm+85mm最佳拍档_天天聚看点
- 新华三集团亮相CHINC,以数字技术助力智慧医院高质量发展-百事通
- 新华三:以融合网络技术支撑智慧医院全场景业务数字变革 今热点
- 全球规模最大锂资源采选冶一体化项目在新疆和田启动_今日观点
- 《守望先锋2》匹配机制糟糕 开发者回应
- 停售6年的PS3再次获得固件更新 提高了系统性能_天天热门
- SOC射击新游《The Front》登陆Steam 预告片首曝
- 《最终幻想16》将不会有多个难度选项 新游戏+包含新战斗-每日精选
- Windows 11发布更新 iPhone也能连接PC了_天天日报
- 热点聚焦:融合创新,领军2023!鸿合科技联手合作伙伴加速推进幼教数字化
- 首发2399元!vivo S16新配色“春日悠蓝”今天正式预售_天天热文
- 世界快看:ChatGPT赋能?微软或将人工智能引入Windows 11
- 天天热资讯!VMware在MWC 2023发布创新成果,帮助扩展电信运营商和企业的5G能力
- 全球快资讯:iPhone SE 4今年发布:6.1英寸全面屏 京东方提供
- 国风城镇叠叠乐 《重檐》Steam页面上线
- 全球消息!新疆队宣布退出CBA联赛捐献全部资产 周琦做出回应
- 房东纠纷 英国国家电子游戏博物馆团队被锁在门外|新要闻
- 新动态:《最终幻想16》试玩版将于发售前两周推出 支持存档继承
- 【新要闻】北欧游戏展被员工指控 调查结果:或违反《反歧视法》
- SteamDeck二月热门游戏 《霍格沃兹之遗》登顶_每日快讯
- crampfish_世界看点
- 国产动作游戏《斩妖行2》开发中 沙漠截图欣赏-快消息
- 环球新动态:三星980 PRO固态硬盘大促:1TB 649元
- 天天快资讯丨印度把苹果坑了:代工还是富士康靠谱
- 环球微资讯!库存压力来了:显卡销量暴跌43%!
- 苹果重启iPhone SE 4:京东方屏幕!|环球速看
- 环球快看点丨捡漏!4K IPS显示器659元
- PLC触摸屏一体机是什么?触摸屏控制PLC的原理有哪些?
- 设备管理器打不开如何解决?设备管理器打不开解决方法
- u盘读写速度是多少?查看u盘读写速度的方法
- PS阈值主要用来做什么?PS阈值抠图教程
- 怎么将esd格式转换成iso格式?esd文件转换iso的方法
- 路由器的核心功能是什么?推荐几款核心路由器及相应报价
- 路由器管理员密码是什么?路由器的管理员密码详细介绍
- directx9.0c是什么软件?directx9.0c如何安装使用?
- 汉翔大将军手写板驱动怎么用?汉翔大将军手写板驱动安装说明常见问题解答
- Word目录怎样做?Word目录怎么自动生成?Word目录操作方法介绍
- 弹出winlogon.exe应用程序错误怎么办?winlogon.exe应用程序错误原因分析及解决方法
- SmartPrinter支持哪些格式?SmartPrinter文档转换方法
- Usb无法识别的原因是什么?电脑usb无法识别的处理步骤
- 本地连接不见了怎么办?本地连接不见了原因分析及解决方案介绍
- 940MX显卡怎么样?GeForce 940MX详细测评
- 拳头账号怎么注册?拳头账号密码忘了怎么找回?
- tcpip.sys文件造成电脑蓝屏怎么解决?tcpip.sys文件造成电脑蓝屏修复方法
- 全球即时:小米无线键鼠套装2开售:首发价89 元
- 12G+512G旗舰机超值价2149元!
- 苹果MR头显隔空打字:iPhone要酸了|全球观天下
- iPhone 15 Pro Max曝光:更厚更重了
- 2023年最完美全面屏!努比亚Z50 Ultra官宣3月7日发布
- 香奈儿回应2万包包15分钟断了:可以就近选择精品店进行售后评估 环球热讯
- Xbox老板:《使命召唤》不会学《霍格沃茨之遗》搞独占内容-环球要闻
- 《最终幻想16》的故事有浪漫色彩 兄弟家庭国家之爱|新要闻
- 沧海电视剧李山魁找组织是第几集_电视剧内容介绍 环球通讯
- 环球热消息:梅西FIFA最佳连续三年第一票投给内马尔:姆巴佩顺位第二
- 《杀手》开发商开发新IP:在线幻想RPG游戏
- 今亮点!2023款欧拉好猫电车上市,售价12.98-16.58万元
- 吉田直树表示《最终幻想16》不会有多种难度选项-每日热讯
- 致敬魂斗罗《地狱之魂》即将更新双人合作玩法|世界视讯
- 创作者们的利器!耕升RTX 4070 Ti星极幻姬OC带你领略AI绘画的世界|天天头条