C++对C的扩展、增强
C++对C的扩展
1. 双冒号::作用域运算符
代码中对同一个变量多次声明,在代码块中使用时,局部变量会将全局变量隐藏。若在代码块使用变量前添加::,表示为全局变量。
::表示作用域运算符,如常见的std::cout,std::endl;等,表示cout和endl是std作用域下的标识符。
2. 命名空间namespace
主要用来解决命名冲突的问题,如多个人开发的不同模块中使用了相同的变量名和函数名,fatal error LNK1169:找到一个或多个重定义的符号,这时可以使用命名空间,将不同的模块分隔开。
namespace QGY{
int a;
void test();
struct QGYTEST{
int b;
};
class QGYNUM{};
}
使用命名空间的注意事项:(1)必须在全局作用域下声明;(2)命名空间下可以放函数,变量、结构体和类;(3)命名空间可以嵌套命名空间;(4)命名空间是开放的,可以随时加入新成员(添加时只需要再次声明namespace,然后添加新成员即可,示例如下);(5)无名或匿名命名空间,相当于static变量;(6)可以对命名空间起别名(一般不用)
namespace QGY{
int m ;
}
3. using声明和using编译指令
using QGY::a; //声明
using namespace QGY; //编译指令
对于声明来说,如果局部范围内还有a,会出现二义性,程序不知道使用哪一个,因此应避免这种情况.
void test01(){
int a = ;
using QGY::a; //这里在声明的时候不能进行赋值,可以在下一行,a = 20;
std::cout << a << std::endl;
}
这里程序会出现错误, error C2874: using 声明导致“QGY::a”的多次声明。
对于编译指令,如果局部范围还有a,会使用局部变量。如果还有另外的命名空间也声明了a,且同时打开了其他空间,则也会出现二义性。
void test02(){
int a = ;
using namespace QGY; //这里只是打开空间,并没有指定使用
std::cout << a << std::endl;
}
void test03(){
using namespace QGY; //只是打开房间就可以访问到a,打开多个房间就会产生二义性
std::cout << a << std::endl;
}
C++对C的增强
1.全局变量检测增强
C语言会忽略对全局变量重定义的检测,但不会忽略对局部变量的检测,C++中都会报错:error C2086: “int a”: 重定义
//全局变量不会报错
int a;
int a = 10; //局部变量会报错
void test(){
int a;
int a = 10;
}
2.函数检测增强:包括函数形参类型检测,形参数目检测,函数返回值检测,C都会忽略,C++不会
//C中函数形参没有参数类型,没有返回值,调用参数过多都会忽略
int test(m, n){ } void test01(){
test(,,);
}
3.类型转换检测增强
C语言中malloc开辟内存空间时默认生成void*指针,可以转换成任意指针,C++中则不行,必须显式的进行强制转换。
4.struct增强
(1)C中strcut中不能有函数,C++中可以有,并且与class的区别在于是否有私有成员,和是否有构造函数;
(2)通过如下方式声明struct时,C语言定义使用结构体时必须使用struct,C++可以不用。
struct Person{
int a;
}; struct Person myperson; //C
Person myperson; //C++
5.bool类型增强
C语言中没有bool类型,C++中有bool类型,其中sizeof(bool)=1
6.三目运算符增强
a > b?a : b;
C语言中返回的是值,C++中返回的是变量,C语言中下面代码会报错:error C2106: “=”: 左操作数必须为左值,表明代码中为20=100,所以会报错。
void test01(){
int a = ;
int b = ;
printf("%d\n", a > b? a:b);
a > b ? a : b = ;
}
如果想改变三目运算符后的结果,可以按照如下代码进行修改
*(a > b? &a:&b) = ;
C++则不会,因为C++三目运算后为变量,因此可以进行赋值操作,其中a = 10, b = 100;
void test01(){
int a = ;
int b = ;
a > b ? a : b = ;
cout << a << " " << b << endl;
}
另外下面三种情况下的a和b的值是不同的
//a=100, b=20
(a < b ? a : b) = ; //a=10, b=100
(a > b ? a : b) = ; //a=10, b=20
a < b ? a : b = ;
最后一种情况,不会执行b=100,其中带括号的是按照我们的想法去执行代码,不带括号的话,优先级不同导致结果和预想的不同。
7.const增强
(1)是否可以修改
C语言中的全局const不可修改,是真常量,如果对其修改会出现访问冲突,另外不可以声明数组的大小(这是C的缺陷,也是为什么替代不了define);局部const为伪常量,可以进行修改,同时不可以用于声明数组的大小(真假都不可以声明数组的大小)。
const int m = ; //全局静态变量受到保护,不可修改
void test01(){
const int n = ; //伪常量,可以通过地址进行修改
int *p = &n; //可以不加强制转换
*p = ;
printf("%d\n", n); int am[n]; //n不可用于声明大小,不是常量值
}
C++不管全局还是局部都是真常量,不可修改,同时可以初始化数组,原因如下(取地址时会分配临时内存):
(2)链接属性
C语言的const默认是外部链接,C++默认是内部链接
//1.cpp
const int a = ; //2.cpp
extern const int a;
C语言中进行访问时可以的,但C++中需要在1.cpp的声明前加extern否则无法使用
(3)const分配内存
是否分配内存,我们可以根据const修饰的变量是否能够修改来确定。
编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高,但是在下列几种情况下编译器会为const定义的常量分配内存的。
(3.1)取地址时,const会分配临时内存,不可以进行间接修改
void test003(){
const int m = ;
int *p = (int *)&m;//分配临时内存,不可以进行间接修改
*p = ;
cout << m << endl;
}
(3.2)extern编译器也会为变量分配内存
因为使用了extern,我们将可能在外部文件使用该变量,而const默认的是内部链接,所以我们必须要为之分配内存的。
(3.3)用普通变量初始化const变量,会分配内存
void test003(){
int m = ;
const int b = (int *)&m; //分配内存,且可以跳过编译器检测进行间接修改,另外需要加强制转换
int *p = &b;
*p = ;
}
(3.4)自定义数据,加const也会分配内存
struct Person{
int age;
}; void test004(){
const Person person = {};//分配内存,且可以跳过编译器检测进行间接修改 Person *b = (Person*)&person;
(*b).age = ;
cout << (*b).age << endl;
}
(4)尽量用const替换define
对于常量,尽量替换因为const有数据类型检查和作用域。另外define用于宏定义时,可以用undef进行解除。但是对于有些条件编译时需要define,则不能替换。
define是应用于预处理的,而const是在编译的时候处理的。对于单纯常量,使用const与enum代替宏,对于函数形式的宏,则使用inline与template替代。
C++对C的扩展、增强的更多相关文章
- VirtualBox扩展包安装教程|VirtualBox扩展增强包怎么安装
VirtualBox是一款功能强大的免费虚拟机软件,一般我们安装VirtualBox后要安装扩展增强包,VirtualBox扩展包包含USB2.0和USB3.0控制等支持功能,如果没有装,在使用过程中 ...
- 【转载】VirtualBox 扩展增强包安装
1 扩展包作用 鼠标可自动在虚拟机和物理机中切换状态,而不用按快捷键解除独占功能 安装了扩展包后,可以解决 virtualbox 中 更改 ubuntu 分辨率无效的问题 2 原文地址 星朝 - Vi ...
- NHibernate Linq查询 扩展增强 (第九篇)
在上一篇的Linq to NHibernate的介绍当中,全部是namespace NHibernate命名空间中的IQueryOver<TRoot, TSubType>接口提供的.IQu ...
- ES6 - 对象扩展(增强字面量)
/** * 对象的扩展 * * 增强对象字面量 * * 解决问题:缩减代码 */ { /** * 1.属性简表示法 * 变量foo直接写在大括号里面.这时,属性名就是变量名, 属性值就是变量值 */ ...
- jQuery Easing动画效果扩展(转)
jQuery API提供了简单的动画效果如淡入淡出以及自定义动画效果,而今天我给大家分享的是一款jQuery动画效果扩展增强插件jquery.easing.js,使用该插件可以实现直线匀速运功.变加速 ...
- BOOST 线程完全攻略 - 扩展 - 线程消息通讯
// controlled_module_ex.hpp : controlled_module类的扩展 // 增强线程之间消息通讯 // 增加线程安全启动和安全关闭功能 // 增加定时器功能 #p ...
- BOOST 线程完全攻略 - 扩展 - 事务线程
扩展threadtimermoduleexceptionsocket 什么叫事务线程 举个例子: 我们写一个IM客户端的登录子线程,则该子线程会有这么几个事务要处理 No.1 TCP Socket物理 ...
- jQuery Easing 动画效果扩展
jQuery API提供了简单的动画效果如淡入淡出以及自定义动画效果,而今天我给大家分享的是一款jQuery动画效果扩展增强插件jquery.easing.js,使用该插件可以实现直线匀速运功.变加速 ...
- Google Chrome 下载&绿化&增强
Chrome下载 Google Chrome 已经可以在线更新,虽然比较慢! 国内常用的更新地址有两处:chromedownloads 和 shuax(耍下): https://www.chromed ...
- AOP 增强方法
Spring AOP 提供了 5 种类型的通知,它们分别是 Before Advice(前置通知).After Returning Advice(后置通知).Interception Around A ...
随机推荐
- python处理多线程之间事件通讯方法
一.什么是事件 每执行一个事情,肯定有该事情的执行后状态,那事件就是该事情发生的信号 在程序中,多线程之间需要通讯,而事件就是方便线程之间的通讯 案例: 1.服务器启动需要5秒 2.客服端启动后去链接 ...
- linux安装splunk-enterprise
一.介绍 Splunk是一款功能强大,功能强大且完全集成的软件,用于实时企业日志管理,可收集,存储,搜索,诊断和报告任何日志和机器生成的数据,包括结构化,非结构化和复杂的多行应用程序日志. 它允许您以 ...
- react 16更新
1.render新的返回类型 render方法支持两种新的返回类型:数组(由React元素组成)和字符串 2.错误处理 16之前,组件在运行期间如果执行出错,就会阻塞整个应用的渲染,这时候只能刷新页面 ...
- iOS之SceneKit.h文件简介
1.SceneKit简介 SceneKit(SK)是WWDC12推出的OS X平台的Cocos 3D渲染引擎框架.支持粒子效果,物理模拟,脚本事件,多程渲染,支持iOS平台.SceneKit整合了Co ...
- 为什么程序员都不喜欢使用switch,而是大量的 if……else if ?
作者:熊爸爸 原文:http://3g.163.com/tech/article/E02RDE6C0511SDDL.html 请用5秒钟的时间查看下面的代码是否存在bug. OK,熟练的程序猿应该已经 ...
- OpenLayers的view与layer:控制显示内容
view与layer都可以进行显示内容的控制.这两者负责的功能是由区别的. view即显示的地图容器,有以下几个属性: center:[经度,纬度] ,对应的设置函数为view.setCenter() ...
- vue-router路由跳转判断用户是否存在
router.beforeEach((to, from, next) => { //console.log("to:", (to)); //console.log(" ...
- USACO 2008 November Gold Cheering up the Cows /// MST oj24381
题目大意: 输入n,p:n个点,p条路 接下来n行输入c[]:在各个点需要花费的时间 接下来p行输入u,v,w:u点到v点的路需要花费时间w 求经过所有点且最后回到起点的最少花费时间 https:// ...
- Tomcat的优化技巧
(1)参数 minProcessors:最小空闲连接线程数,用于提高系统处理性能,默认值为10. maxProcessors:最大连接线程数,即:并发处理的最大请求数,默认值为75. acceptCo ...
- 《代码整洁之道》ch1~ch4读书笔记 PB16110698 (~3.8 第一周)
<代码整洁之道>ch1~ch4读书笔记 <clean code>正如其书名所言,是一本关于整洁代码规范的“教科书”.作者在书中通过实例阐述了整洁代码带来的种种利处以及混乱代码 ...