1.类型增强

检查更加严格

  • 比如,把一个 const 类型的指针赋给非 const 类型的指针。c 语言中可以通的过,但是在 c++中则编不过去

    const int a = ;
    int b = a;
    const int *pa = &a;
    int *pb = pa;

增加bool类型

  • c语言中使用0和!0来表示逻辑的真假,但是在c++中使用bool类型表示逻辑的真(true)假(false);

    bool flag = true;
    bool flag1 = false;
    cout<<"flag = "<<flag<<endl; //
    cout<<"flag = "<<flag1<<endl; //
    cout<<sizeof(bool); //

真正的枚举

  • c 语言中枚举本质就是整型,枚举变量可以用任意整型赋值。而 c++中枚举变量,只能用被枚举出来的元素初始化。

      enum num {one = , two, three};
    int a = one;
    cout<< a <<endl; //
    cout<< three <<endl; //

表达式的值可被赋值

  • c 语言中表达式通常不能作为左值的,即不可被赋值,c++中某些表达式是可以赋值的。

    int a, b, c = ;
    (a = b) = ;
    cout<< a << b <<endl;
    (a>c?b:c) = ;
    cout<< "a = "<< a << " b = " << b << " c = " << c <<endl; // a=20 b=50 c=10

2.输入与输出(cin/cout)

cin && cout

  • cin 和 cout 是 C++的标准输入流和输出流。他们在头文件 iostream 中定义

    cout<<"your name is: "<<name<<endl;
    cout<<"your age is: "<<age<<endl;

格式化

  • 包含于头文件 #include <iomanip> 中
  • 设置域宽及位数:对于实型,cout 默认输出六位有效数据,setprecision(4) 可以设置有效位数,setprecision(n)<<setiosflags(ios::fixed)合用,可以设置小数点右边的位数。
      float i = 1.33333;
    cout<< i <<endl; //1.33333
    cout<<setw()<<i<<endl //_1.33333
    <<setw()<<<<endl //__100
    <<setprecision()<<setiosflags(ios::fixed)<<i<<endl; //1.3333

按进制输出

  • 按十六进制、十进制、八进制、默认十进制 输出
      //按十六进制、十进制、八进制、默认十进制 输出
    int m = ;
    cout<< hex << m << endl; // f
    cout<< dec << m << endl; //
    cout<< oct << m << endl; //
    cout<< setbase() << m << endl;//

 设置填充符

  • 还可以设置域宽的同时,设置左右对齐及填充字符

    //还可以设置域宽的同时,设置左右对齐及填充字符。
    cout<<setw()<<<<endl; //______1234
    cout<<setw()<<setfill('')<<<<endl; //
    cout<<setw()<<setfill('')<<setiosflags(ios::left)<<<<endl; //
    cout<<setw()<<setfill('-')<<setiosflags(ios::right)<<<<endl;//------1234

3.函数重载(function overload)

 函数重载规则:

  • 函数名相同;
  • 参数的类型,个数, 顺序不同,均可构成函数重载;
  • 返回类型不同则不能构成重载;
    void func(int a); //ok
    void func(char a); //ok
    void func(char a,int b); //ok
    void func(int a, char b); //ok
    char func(int a); //与第一个函数有冲突
    void func(int a)
    {
    cout<< "func(int a)" <<endl;
    }
    void func(int a, char b)
    {
    cout<< "func(int a, char b)" <<endl;
    }
    void func(char b, int a)
    {
    cout<< "func(char b, int a)" <<endl;
    } int main(void)
    {
    int a; char b;
    func(a); //func(int a)
    func(a,b); //func(int a, char b)
    func(b,a); //func(char b, int a)
    return ;
    }

函数匹配原则

  • 严格匹配,找到则调用;
  • 通过隐士转换寻求一个匹配;
    void func(int a)
    {
    cout<< "func(int a)" <<endl;
    }
    void func(double c)
    {
    cout<< "func(double a)" <<endl;
    }
    int main(void)
    {
    func(); //func(int a)
    func(2.2); //func(double a)
    return
    }

重载底层实现

  • c++利用name mangling(倾轧)技术,来改名函数名,区分参数不同的同名函数;
  • 实现原理:用 v-c- i-f- l- d 表示 void char int float long double 及其引用。上例中的函数根据条件的不同,可能被倾轧成如下函数:
      func_i(a);    //func(int a)
    func_f(a,b); //func(int a, char b)
    func_l(b,a); //func(char b, int a)

extern "C"

  • 倾轧name mangling 发生在两个阶段,.cpp 编译阶段,和.h 的声明阶段。只有两个阶段同时进行,才能匹配调用。
  • 我们知道C++是能够兼容C的,如果我们有了一个C语言的头文件和其对应的库,在C++中如何使用它呢?在include该头文件的时候当然要加入extern "C",否则按照C++的符号进行符号修饰,那么在库中就会找不到该符号了。
  • 使用extern “C”, 告诉编译器按照c语言的规则进行编译。

4.操作符重载(operator overload)

5.默认参数

6.引用

7.内存管理(new/delete operation)

 new/delete 与 malloc/free的区别:

  • malloc/free属于c库函数,new/delete属于c++关键字;

申请单变量

申请多维数组

8.内联函数(inline function)

9.类型增强

10.命名空间(namespace)

" :: ":作用域运算符

11.系统string类

12.一些建议

1、c++对c语言的扩展的更多相关文章

  1. 对于 C语言的扩展和JAVA的重载理解

    哎,又被学长看成笨蛋了  ,先前学习java,自己真是什么都要忘了,弄得自己连java最重要的概念--重载,都不知道是啥,还厚着脸皮和学长说  是函数名字一样  ,但是就是函数里面的参数和参数类型不一 ...

  2. 嵌入式C语言自我修养 01:Linux 内核中的GNU C语言语法扩展

    1.1 Linux 内核驱动中的奇怪语法 大家在看一些 GNU 开源软件,或者阅读 Linux 内核.驱动源码时会发现,在 Linux 内核源码中,有大量的 C 程序看起来“怪怪的”.说它是C语言吧, ...

  3. C#语言のC#扩展方法(.Net特性)

    this在C#中的常见用法:1.在C#中,this关键字代表当前实例,我们可以用this.来调用当前实例的成员方法,变量,属性,字段等; 2.也可以用this来做为参数状当前实例做为参数传入方法. 3 ...

  4. [Objective-C语言教程]扩展(30)

    类扩展与类别有一些相似之处,但它只能添加到编译时具有源代码的类中(类与类扩展同时编译). 类扩展声明的方法是在原始类的实现块中实现的,因此不能在框架类上声明类扩展,例如Cocoa或Cocoa Touc ...

  5. 使用C语言来扩展PHP,写PHP扩展dll

    转自http://www.cnblogs.com/myths/archive/2011/11/28/2266593.html 以前写过一次PHP扩展DLL,那个是利用调用系统的COM口实现的扩展,与P ...

  6. GCC 对C语言的扩展

    http://www.cnblogs.com/emituofo/archive/2012/07/20/2600995.html http://blog.csdn.net/andyhuabing/art ...

  7. windows 下 使用codeblocks 实现C语言对python的扩展

    本人比较懒就粘一下别人的配置方案了 从这开始到代码 摘自http://blog.csdn.net/yueguanghaidao/article/details/11538433 一直对Python扩展 ...

  8. 苹果新的编程语言 Swift 语言进阶(十四)--扩展

    扩展是为一个已经存在的类.结构.枚举类型添加新功能的一种方式,包括为不能存取源代码的那些已经存在的类型添加功能. 扩展类似于Objective-C语言中的类别,与类别不同的是Swift语言的扩展没有名 ...

  9. 一步步来用C语言来写python扩展-乾颐堂

    本文介绍如何用 C 语言来扩展 python.所举的例子是,为 python 添加一个设置字符串到 windows 的剪切板(Clipboard)的功能.我在写以下代码的时候用到的环境是:window ...

随机推荐

  1. phpcms中content主要使用的详情列表关系

    从首页(index.html)中点开的内容网页叫单网页(page.html) 从列表(list.html)中点开的网页叫内容页(show.html) 从导航栏的栏目中下拉的列表栏目叫栏目列表页(cat ...

  2. iOS----------被拒原因

    推荐地址:https://developer.apple.com/app-store/review/guidelines/cn/ 目录 1.条款与条件 2.功能 3.元数据 4.位置 5.推送通知 6 ...

  3. Nginx 配置下载附件让浏览器提示用户是否保存

    Nginx配置下载附件让浏览器提示用户是否保存   by:授客  QQ:1033553122   测试环境 nginx-1.10.0 问题描述: 前端页面,IE11浏览器下请求下载附件模板,针对xls ...

  4. Git 结合Git使用Bitbucket进行代码版本管理流程规范与实践

    结合Git使用Bitbucket进行代码版本管理流程规范与实践   By:授客 QQ:1033553122   目录 目录 1 一. 测试环境 2 二. 新建项目 2 三. 新建公有版本库 3 四. ...

  5. javascript:正则表达式、一个表单验证的例子

    本文内容: 正则表达式 正则表达式的使用方法 正则表达式的特殊匹配字符 正则表达式修饰符 利用正则表达式进行表单验证的例子 首发日期:2018-05-13 正则表达式: 正则表达式的使用方法: 首先创 ...

  6. MyBatis笔记----(2017年)最新的报错:Cannot find class [org.apache.commons.dbcp.BasicDataSource] for bean with name 'dataSource' defined in class path resource [com/ij34/mybatis/applicationContext.xml]; nested e

    四月 05, 2017 4:56:11 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRef ...

  7. C#-基本语法(三)

    关键词 关键字,是一些被C#规定了用途的重要单词 在Visual Studio的开发环境中,关键字被标识为蓝色 例如: using:导入命名空间 class:声明类 static:静态 void:无返 ...

  8. 自动化测试基础篇--Selenium中JS处理浏览器弹窗

    摘自https://www.cnblogs.com/sanzangTst/p/7692454.html 浏览器弹窗: 现在大多数网站都会使用自定义弹窗,使用Selenium自带的方法暂时处理不了,这时 ...

  9. git 使用命令删除远程分支和本地分支

    删除远程分支命令: git push origin   :<远程分支名称> git push origin --delete <远程分支名称> 删除本地分支: git bran ...

  10. kmp算法python实现

    kmp算法python实现 kmp算法 kmp算法用于字符串的模式匹配,也就是找到模式字符串在目标字符串的第一次出现的位置比如abababc那么bab在其位置1处,bc在其位置5处我们首先想到的最简单 ...