你所不知道的C++
C++与C的不同
C++从诞生之初就号称和C是兼容的,正是这种兼容,使C++得以迅猛发展,然而也正是这种兼容,让C++背上了沉重的历史包袱。且不论其利弊,让我们来看看C++在兼容C的那部分中,与C语言有什么不同。
1. bool
在C语言中,没有bool类型,我们通常的做法是:
1: #ifndef FALSE
2: #define FALSE 0
3: #endif
4:
5: #ifndef TRUE
6: #define TRUE (!(FALSE))
7: #endif
而在C++中,事情简单了很多,bool是内置类型,true和false也是C++的关键字,我们可以直接使用。
2. 类型转换
C语言允许void *类型隐式转换为其他类型指针,而C++不允许。比如我们使用malloc申请内存,在C和C++中的写法是不一样的:
1: // C
2: char *a = malloc(10);
3:
4: // C++
5: char *a = (char*)malloc(10);
当然,将其他指针类型转换为void *在两种语言中都是可以的,因为它是“向上类型转换”。
3. 字符常量的大小
在C和C++中,char类型都是占用1个字节。但是字符常量在两种语言中大小却是不一样的,在C中,字符常量与int类型一样,32位机器上占用为4个字节,而C++中,字符常量与char类型一样,占用为1个字节。
1: // C, output:1 4
2: char a = 'a';
3: printf("%d %d\n", sizeof(a), sizeof('a'));
4:
5: // C++, output:1 1
6: char a = 'a';
7: cout<<sizeof(a)<<" "<<sizeof('a')<<endl;
4. const变量
const变量在C语言中声明时可以不初始化,它的值根据作用域而定(如果是全局变量或static变量,初始化为0,否则为垃圾值),而在C++中声明时必须被初始化,且默认仅本文件内可见。在C中,const变量不能用于数组的声明(C99中引入的可变数组除外),而在C++中,const变量可以用在数组声明中标明数组大小。
5. 函数的声明
同样的函数声明void f();在C中,调用该函数时,可以传入任意个数的参数,但是在函数中无法正常取到传入参数的值。而在C++中,这样的函数声明就是说:我不接受任何参数。
1: // C, output: hello
2: void f()
3: {
4: printf("hello\n");
5: }
6:
7: int main(int argc, char *argv[])
8: {
9: f(1, 2, 3, 4);
10:
11: return 0;
12: }
13:
14: // C++, compile error: too many arguments to function 'void f()'
15: void f()
16: {
17: cout<<"hello"<<endl;
18: }
19:
20: int main(int argc, char *argv[])
21: {
22: f(1, 2, 3, 4);
23:
24: return 0;
25: }
如何在C语言中声明不接受任何参数的函数呢?答案是:
1: // C, function f accept no arguments
2: void f(void)
3: {
4: printf("hello\n");
5: }
此外,在C语言中,在调用函数的时候不一定需要函数已经声明,找不到合式的函数声明时,编译器会默认生成一个返回类型为int的函数声明,只有在链接时如果找不到函数实现才会报错;而在C++中,调用函数时要求该函数必须已经声明,否则在编译阶段就会产生错误。
6. 结构体
在C语言中,声明结构体变量时必须有struct关键字,而在C++中,struct和class是一样的,仅用结构体名称就可以声明变量。
此外,空结构体的大小在C和C++也也有差异,C语言中为0,而C++中为1。
1: // C, output:0 0
2: struct str_empty {
3:
4: };
5: int main(int argc, char *argv[])
6: {
7: struct str_empty s;
8: printf("%d %d\n", sizeof(struct str_empty), sizeof(s));
9:
10: return 0;
11: }
12:
13: // C++, output: 1 1
14: struct str_empty {
15:
16: };
17: int main(int argc, char *argv[])
18: {
19: str_empty s;
20: cout<<sizeof(str_empty)<<" "<<sizeof(s)<<endl;
21:
22: return 0;
23: }
7. 函数默认参数
在C和Java中,都没有函数默认参数,而在C++和Python中,都可以提供默认参数。
你所不知道的C++
C++一直以来就是一个庞然大物,而随着它的发展,又不断被加入新的东西,现在的C++的复杂程度实在是让人望而生畏。这里且看看C++中有哪些比较有用而又很少被人提及的功能。
1. explict
2. function-try-block
3. 重载类型转换操作符
4. 指向成员的指针
你所不知道的C++的更多相关文章
- 你所不知道的setInterval
在你所不知道的setTimeout记载了下setTimeout相关,此篇则整理了下setInterval:作为拥有广泛应用场景(定时器,轮播图,动画效果,自动滚动等等),而又充满各种不确定性的这set ...
- 你所不知道的setTimeout
JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成.它们向任务队列添加定时任务.初始接触它的人都觉得好简单 ...
- 你真的会玩SQL吗?你所不知道的 数据聚合
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...
- 你所不知道的linq(二)
上一篇说了from in select的本质,具体参见你所不知道的linq.本篇说下from...in... from... in... select 首先上一段代码,猜猜结果是什么? class P ...
- 你所不知道的SQL Server数据库启动过程,以及启动不起来的各种问题的分析及解决技巧
目前SQL Server数据库作为微软一款优秀的RDBMS,其本身启动的时候是很少出问题的,我们在平时用的时候,很少关注起启动过程,或者很少了解其底层运行过程,大部分的过程只关注其内部的表.存储过程. ...
- 你所不知道的SQL Server数据库启动过程(用户数据库加载过程的疑难杂症)
前言 本篇主要是上一篇文章的补充篇,上一篇我们介绍了SQL Server服务启动过程所遇到的一些问题和解决方法,可点击查看,我们此篇主要介绍的是SQL Server启动过程中关于用户数据库加载的流程, ...
- Android中Context详解 ---- 你所不知道的Context
转自:http://blog.csdn.net/qinjuning/article/details/7310620Android中Context详解 ---- 你所不知道的Context 大家好, ...
- 你所不知道的html5与html中的那些事第三篇
文章简介: 关于html5相信大家早已经耳熟能详,但是他真正的意义在具体的开发中会有什么作用呢?相对于html,他又有怎样的新的定义与新理念在里面呢?为什么一些专家认为html5完全完成后,所有的工作 ...
- 你所不知道的 URL
0.说明 第一幕 产品:大叔有用户反映账户不能绑定公众号.大叔:啊咧咧?怎么可能,我看看?大叔:恩?这也没问题啊,魏虾米.大叔:还是没问题啊,挖叉类.大叔:T T,话说产品姐姐是不是Java提供接口的 ...
- 你所不知道的五件事情--java.util.concurrent(第二部分)
这是Ted Neward在IBM developerWorks中5 things系列文章中的一篇,仍然讲述了关于Java并发集合API的一些应用窍门,值得大家学习.(2010.06.17最后更新) 摘 ...
随机推荐
- 开发一个完整的JavaScript组件
作为一名开发者,大家应该都知道在浏览器中存在一些内置的控件:Alert,Confirm等,但是这些控件通常根据浏览器产商的不同而形态各异,视觉效果往往达不到UI设计师的要求.更重要的是,这类内置控件的 ...
- 关于IOS网络通信的学习
最近由于需要在看关于网络通信方面的知识,所以在网上找了找关于网络解释方面的知识.找了半天没有找到一篇能详细解释通讯流程的,心里忍不住就万马奔腾了.没办法,谁让自己想学呢!于是又找了找,觉得没有满意的. ...
- 05_Excel操作_02_模拟Web环境的User列表导出
[思路解释] 在正式上到WebProject之前,准备模拟一下WebProject后台的导出流程. 主要都写在ExcelService层,在Excel的Service层,首先要获得UserList,即 ...
- Scala - 正则表达式匹配例子
壹Try胜仟言 别忘了 import scala.util.matching._ scala> var s = "a_b_c_d_e"s: String = a_b_c_d_ ...
- @using (Html.BeginForm())收集
一 ,制定表单提交方式和路径 1,指明(视图,控制器,提交方式,参数) <%using(Html.BeginForm("Index","Home",For ...
- Activity的窗口对象(Window)的创建过程分析
与Activity组件所关联的窗口对象的实际类型为PhoneWindow,后者是从Window类继承下来的. Activity.Window和PhoneWindow三个类的关系如下 PhoneWind ...
- WPF 得一些问题汇总
1.CallMethodAction <TextBox Height="30" Name="txtUserName" Width="160&qu ...
- 分享一下 Eclipse 插件 PyDev 的安装
想趁暑假学习一下python,学好语言好的开发环境是基础.因为安装有eclipse,所以想安装PyDev插件作为python开发环境.本来以为是一件简单的事情,结果整整弄了一下午各种装不上,度娘上的几 ...
- C#中的反射 Assembly.Load() Assembly.LoadFrom()
一些关于C#反射的知识,估计也就最多达到使用API的程度,至于要深入了解,以现在的水平估计很难做到,所以下面此篇文章,以作为一个阶段的总结. 对于反射的总结,我想从以下几个方面展开,首先是反射程序集, ...
- 【技巧】DataGridView,ListView重新绑定时保持上次滚动位置
(1)DataGridView 今天在项目时遇到一个问题,将DataTable绑定到DataGridView,其中一列为CheckBox列,当我修改该列值时,触发CellValueChanged事件. ...