c++综述
来源:互联网 发布:盛势网络剧海外版480p 编辑:程序博客网 时间:2024/06/03 22:56
C语言作为结构化和模块化语言能够得心应手的处理小规模的程序,但是当一个问题需要高度抽象和建模时,C语言便力不从心,c++语言便在贝尔实验室被bs博士创造出来,其最初的名字为 c with class ,后来更名为c++,其含义为在完全兼容c的基础上,扩展了c的语法,增加了面向对象的特性,加入了STL 等。
1 c++ 对C 的扩展
1.1 类型检查更加严格
const 常量在c 语言中可通过指针对其修改,在C语言中人们称const 不是真正的常量,而是一个只读变量,但在c++中常量变成了真正的常量,例:
const int a = 10; int* pa = &a;在c++编译环境中,会提示 初始化”: 无法从“const int *”转换为“int *” 的 错误。
1.2 布尔类型
c++中加入了真正的 bool 类型, 其值为 true 或者 false
1.3 枚举类型
在C语言中枚举本质是一个整形,而在c++中则变成可真正的枚举, 定义的枚举变量只能用枚举中的元素初始化
1.4 cin cout 流对象
cin cout 的格式化控制 ----- 需要加入头文件 #include <iomanip>
setprecision(n) 用于设置有效位数
setw(n) 用于设置域宽
setfill(“char”) 设置 填充字符
setiosflags(ios::left) 左对齐 setiosflags(ios::right) 右对齐
1.4 函数重载
前期对此知识点有过接触,这里简单重温一下
重载规则:函数名相同, 参数个数、 类型、参数顺序不同可构成重载,注意 返回类型不能决定重载
函数重载匹配的规则:严格按照参数匹配,有则调用。参数的隐式转换也可以寻求重载 匹配但有时会引发重载的二义性 ambiguous 例如 int对于 long double两种函数入参
类型,则会编译出现二意性错误。
重载的底层实现: 底层采用 倾轧(name manling)的技术,相同函数名但不同的入参其在底层函数名并不相同。由于c++ 完全兼容c 语言,可以使用extern "C" 的方法,
在源文件和头文件避免函数被倾轧,使得c++代码兼容C语言风格。
1.5 操作符重载(operator overload)
c++中认为 操作符便是函数,函数便可以重载,(其实c++中并不是所有的操作符都可以重载),我们看一个经典的例子:
Complex operator+(Complex a, Complex b){Complex ret;ret.real = a.real + b.real;ret.image = a.image + b.image;return ret;}
此函数便实现了 + 操作符 在复数运算中的重载;在 计算 Complex 类型变量的加法时便可以直接使用 + 操作符;
1.6 c++中的默认参数
默认参数一般在声明处使用就可以,默认参数的使用规则:
默认参数在函数参数列表中要从右到左使用,不可以跳跃。
默认参数函数不可以和函数重载同时使用,否则容易引发二义性错误
1.7 c++中的引用
c++ 中引入了应用的概念,其为变量的别名,在使用时不会开辟内存空间,即本质是一个声明。关于应用这里有几点需要说明:
1 引用不会占用内存,其地址与其引用的变量有相同的地址,且类型与原变量类型保持一致。
2 引用在声明的同时必须初始化,且一经初始化便不可更改。可以对引用再次引用,使一个变量能够具有多个别名。例:
int a = 10;int& ra = a;int& raa = ra;
3 引用多用在 函数的形参中,这样可以代替原来C语言中的 指针形参。 在这里 引用的本质是指针,是对裸露的内存地址做了一次包装,所以这里如果在对引用取地址就变得没有意义,违背了程序设计者的初衷。所以这里便又得出了一个使用规则,这里作为第四条总结一下。
4 可以定义指针的引用但不可以定义引用的指针。这里还有一个变体规则,可以定义数组的引用,但不可以定义引用的数组。例如
int arr[2] = {0,1};int (&rarr)[2] = arr;这样来声明一个数组的引用是没有问题的,但是下面
int & rarr[2] = {0,1};这样来声明引用的数组是非法的,其本质,是使用的引用的引用。ps 数组可以看作一个指针。
最后总结一下,说一千道一万,引用和指针有一个很大的区别,指针的指针合法,引用的引用非法。
- c/c++内存分配综述
- 《数据结构(C语言版)》综述
- C\C++ struct && class 综述
- C/C++——宏综述
- 综述
- 第一篇:C/S模式下Notes开发语言综述
- C/S模式下Notes开发语言综述
- 有线数字视频广播(DVB-C)系统综述(一)
- 有线数字视频广播(DVB-C)系统综述(二)
- 有线数字视频广播(DVB-C)系统综述(三)
- 【温故而知新】C和C++5:STL容器技术综述
- Objective-C 【内存管理&手动内存管理 综述】
- linux 下 C 编程和make的方法 (一、综述:为什么学这些)
- 一种基于Qt的可伸缩的全异步C/S架构服务器实现(一) 综述
- 一种基于Qt的可伸缩的全异步C/S架构服务器实现(一) 综述
- 一种基于Qt的可伸缩的全异步C/S架构服务器实现(一) 综述
- 一种基于Qt的可伸缩的全异步C/S架构服务器实现(一) 综述
- IDS综述
- Selenium with Python中文翻译(二)
- NAT模式下无法连接本地VM虚拟机的解决方案
- JVM类加载机制详解
- HBase数据恢复 (总结14)
- Codeforces Round #368 (Div. 2) E. Garlands 二维树状数组 暴力
- c++综述
- Viewpager的竖直切换及其子fragment之间的点击跳转
- 项目2
- HBase原理讲解 (总结15)
- Java线程的5种状态及状态间的转换
- 猜谜 —— 英文回文(递归)
- LeetCode 12. Integer to Roman
- 简单的Filter+Servlet+反射,实现Servlet中有多个方法可以执行
- 【Java并发编程】并发编程大合集