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++的更多相关文章

  1. 你所不知道的setInterval

    在你所不知道的setTimeout记载了下setTimeout相关,此篇则整理了下setInterval:作为拥有广泛应用场景(定时器,轮播图,动画效果,自动滚动等等),而又充满各种不确定性的这set ...

  2. 你所不知道的setTimeout

    JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成.它们向任务队列添加定时任务.初始接触它的人都觉得好简单 ...

  3. 你真的会玩SQL吗?你所不知道的 数据聚合

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

  4. 你所不知道的linq(二)

    上一篇说了from in select的本质,具体参见你所不知道的linq.本篇说下from...in... from... in... select 首先上一段代码,猜猜结果是什么? class P ...

  5. 你所不知道的SQL Server数据库启动过程,以及启动不起来的各种问题的分析及解决技巧

    目前SQL Server数据库作为微软一款优秀的RDBMS,其本身启动的时候是很少出问题的,我们在平时用的时候,很少关注起启动过程,或者很少了解其底层运行过程,大部分的过程只关注其内部的表.存储过程. ...

  6. 你所不知道的SQL Server数据库启动过程(用户数据库加载过程的疑难杂症)

    前言 本篇主要是上一篇文章的补充篇,上一篇我们介绍了SQL Server服务启动过程所遇到的一些问题和解决方法,可点击查看,我们此篇主要介绍的是SQL Server启动过程中关于用户数据库加载的流程, ...

  7. Android中Context详解 ---- 你所不知道的Context

    转自:http://blog.csdn.net/qinjuning/article/details/7310620Android中Context详解 ---- 你所不知道的Context 大家好,  ...

  8. 你所不知道的html5与html中的那些事第三篇

    文章简介: 关于html5相信大家早已经耳熟能详,但是他真正的意义在具体的开发中会有什么作用呢?相对于html,他又有怎样的新的定义与新理念在里面呢?为什么一些专家认为html5完全完成后,所有的工作 ...

  9. 你所不知道的 URL

    0.说明 第一幕 产品:大叔有用户反映账户不能绑定公众号.大叔:啊咧咧?怎么可能,我看看?大叔:恩?这也没问题啊,魏虾米.大叔:还是没问题啊,挖叉类.大叔:T T,话说产品姐姐是不是Java提供接口的 ...

  10. 你所不知道的五件事情--java.util.concurrent(第二部分)

    这是Ted Neward在IBM developerWorks中5 things系列文章中的一篇,仍然讲述了关于Java并发集合API的一些应用窍门,值得大家学习.(2010.06.17最后更新) 摘 ...

随机推荐

  1. 从两个集合里排除重复的写法(适用:DB表和字段都很多,表间有关联的情况)

    获取其中一张表bulletinred为1的内容: public IList<BRShow> GetBulInfo() { var result = from a in ((Entities ...

  2. javee学习-通过ServletContext对象实现数据共享

    1,设置值. ServletContext context = this.getServletConfig().getServletContext();//获得ServletContext对象 // ...

  3. zlib压缩解压示例

    #include <stdio.h> #include <string.h> #include <assert.h> #include "zlib.h&q ...

  4. 九度OJ 1082 代理服务器 -- 贪心算法

    题目地址:http://ac.jobdu.com/problem.php?pid=1082 题目描述: 使用代理服务器能够在一定程度上隐藏客户端信息,从而保护用户在互联网上的隐私.我们知道n个代理服务 ...

  5. 九度OJ 1076 N的阶乘 -- 大数运算

    题目地址:http://ac.jobdu.com/problem.php?pid=1076 题目描述: 输入一个正整数N,输出N的阶乘. 输入: 正整数N(0<=N<=1000) 输出: ...

  6. nodejs -formidable模块实现图片上传。

    var form = new formidable.IncomingForm(); form.uploadDir="/localnonobank/test/images/";   ...

  7. Leetcode 解题 Longest Substring without repeating charcater python

    原题: Given a string, find the length of the longest substring without repeating character For example ...

  8. 简单的介绍下WPF中的MVVM框架

    最近在研究学习Swift,苹果希望它迅速取代复杂的Objective-C开发,引发了一大堆热潮去学它,放眼望去各个培训机构都已打着Swift开发0基础快速上手的招牌了.不过我觉得,等同于无C++基础上 ...

  9. 服务器慢 mysql-bin.000001文件占满磁盘的原因与解决

    发现 VPS 服务器上的网站反应超级慢,简单的重启.重启各主要服务,发现mysql 的反应极其不正常. 一方面是问题,这与站点访问量有关.开始时从mysql 的配置文件 my.cnf 考虑,但志文工作 ...

  10. 在ADS上由于volatile惹得祸

    C语言关键字volatile是一个危险的东东,笔者再用ADS做S3C2440定时器中断实验就因为这个关键字出了错.出现错误情况的准确描述是:定义一个变量时没有用volatile关键字,而且紧接着whi ...