1、c++对c语言的扩展
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语言的扩展的更多相关文章
- 对于 C语言的扩展和JAVA的重载理解
哎,又被学长看成笨蛋了 ,先前学习java,自己真是什么都要忘了,弄得自己连java最重要的概念--重载,都不知道是啥,还厚着脸皮和学长说 是函数名字一样 ,但是就是函数里面的参数和参数类型不一 ...
- 嵌入式C语言自我修养 01:Linux 内核中的GNU C语言语法扩展
1.1 Linux 内核驱动中的奇怪语法 大家在看一些 GNU 开源软件,或者阅读 Linux 内核.驱动源码时会发现,在 Linux 内核源码中,有大量的 C 程序看起来“怪怪的”.说它是C语言吧, ...
- C#语言のC#扩展方法(.Net特性)
this在C#中的常见用法:1.在C#中,this关键字代表当前实例,我们可以用this.来调用当前实例的成员方法,变量,属性,字段等; 2.也可以用this来做为参数状当前实例做为参数传入方法. 3 ...
- [Objective-C语言教程]扩展(30)
类扩展与类别有一些相似之处,但它只能添加到编译时具有源代码的类中(类与类扩展同时编译). 类扩展声明的方法是在原始类的实现块中实现的,因此不能在框架类上声明类扩展,例如Cocoa或Cocoa Touc ...
- 使用C语言来扩展PHP,写PHP扩展dll
转自http://www.cnblogs.com/myths/archive/2011/11/28/2266593.html 以前写过一次PHP扩展DLL,那个是利用调用系统的COM口实现的扩展,与P ...
- GCC 对C语言的扩展
http://www.cnblogs.com/emituofo/archive/2012/07/20/2600995.html http://blog.csdn.net/andyhuabing/art ...
- windows 下 使用codeblocks 实现C语言对python的扩展
本人比较懒就粘一下别人的配置方案了 从这开始到代码 摘自http://blog.csdn.net/yueguanghaidao/article/details/11538433 一直对Python扩展 ...
- 苹果新的编程语言 Swift 语言进阶(十四)--扩展
扩展是为一个已经存在的类.结构.枚举类型添加新功能的一种方式,包括为不能存取源代码的那些已经存在的类型添加功能. 扩展类似于Objective-C语言中的类别,与类别不同的是Swift语言的扩展没有名 ...
- 一步步来用C语言来写python扩展-乾颐堂
本文介绍如何用 C 语言来扩展 python.所举的例子是,为 python 添加一个设置字符串到 windows 的剪切板(Clipboard)的功能.我在写以下代码的时候用到的环境是:window ...
随机推荐
- 14.Odoo产品分析 (二) – 商业板块(7) –制造(1)
查看Odoo产品分析系列--目录 一旦你收到了库存中所需的原材料,就可以开始生产终端产品了.ERP系统的部分功能是帮助您根据可用资源调度这些订单.其中一项资源是原产品.其他资源可以包括可用劳动力或特定 ...
- MySQL 性能优化-数据库死锁监控
MySQL性能优化-数据库死锁监控 by:授客 QQ:1033553122 1)表锁定 通过检查 table_locks_waited 和 table_locks_immediate 状态变量来分析表 ...
- 微信小程序中如何获取for循环的item相关值到JS页面的问题
今天小程序开发过程中,遇到了这个棘手的问题.由于我没有前端基础,只是知道一点儿基本的HTML标签,所以卡了好久,特此分享,望后来的你,可以有所收获. measure step 1 *.WXML: ...
- java的优点和误解 《java核心技术卷i》第一章
<java核心技术卷i>第一章主要内容包括三点: 1:Java白皮书的关键术语:描述Java的十一个关键字: 2:Java applet 3 :关于Java的常见误解 1:第一章:Ja ...
- SQL Server中如何定位Row Lock锁定哪一行数据
在SQL Server中有时候会使用提示(Hint)强制SQL使用行锁(Row Lock),前两天有个同事咨询了一个问题,如何定位Row Lock具体锁定了哪一行.其实这个问题只适合研究一下,实际意义 ...
- mssql sqlserver 优化注意事项:
摘要: 下文整理sqlserver优化中的常用知识点和注意事项 1.表上未建立合理的索引 2.服务器内存过小,导致缓存过少,数据库频繁的交互数据 3.统计信息不准确,导致索引乱用 4.网络异常,数据交 ...
- SQL SERVER启动步骤
第一步 从注册表读取SQL SERVER启动信息 (1)Audit Level:设置SQL SERVER是否记录用户登陆信息 Login Mode:设置SQL SERVER登陆类型是只接受windo ...
- 智能合约 solidity 开发的环境基本搭建
以太坊Dapp开发快速入门 以太坊为开源社区,虽然设计东西都很优秀,但是组件十分的杂乱,因此下面首先简单介绍下以太坊的一些常用组件以及各种工具介绍 Geth Geth是由以太坊基金会提供的官方客户端软 ...
- Linux下1号进程的前世(kernel_init)今生(init进程)----Linux进程的管理与调度(六)
前面我们了解到了0号进程是系统所有进程的先祖, 它的进程描述符init_task是内核静态创建的, 而它在进行初始化的时候, 通过kernel_thread的方式创建了两个内核线程,分别是kernel ...
- Hexo使用细节及各种问题
解决markdown图片不显示(返回403 forbidden).添加本地图片无法显示.修改文章page模板.同时部署发布同步到多个仓库站点(Github.coding.gitee 码云) 图片不显示 ...