1 C++对C的扩展

C++对C的扩展

#知识点总结#

1 C++

面向对象的方法

  1. 将数据及对数据的操作方法封装在一起,作为一个相互依存、不可分离的整体——对象。
  2. 对同类型对象抽象出其共性,形成类。
  3. 类通过一个简单的外部接口,与外界发生关系。
  4. 对象与对象之间通过消息进行通信。

• 对象由一组属性和一组行为构成。
• C语言 + 面向对象方法论===》Objective C /C++

2 C++对C的加强

2.1 namespace命名空间

指标识符的各种可见范围

C++命名空间的定义:
namespace name { … }
C中的命名空间
在C语言中只有一个全局作用域,所有的全局标识符共享同一个作用域,标识符之间可能发生冲突

C++中提出了命名空间的概念
命名空间将全局作用域分成不同的部分,不同命名空间中的标识符可以同名而不会发生冲突;命名空间可以相互嵌套;全局作用域也叫默认命名空间

2.2 “实用性”增加

C语言中的变量都必须在作用域开始的位置定义!!
C++中更强调语言的“实用性”,所有的变量都可以在需要使用时再定义。

2.3 register关键字增强

C语言中无法取得register变量地址
在C++中依然支持register关键字;C++编译器有自己的优化方式,不使用register也可能做优化;C++中可以取得register变量的地址

2.4变量检测增强

在C语言中,重复定义多个同名的全局变量是合法的
在C++中,不允许定义多个同名的全局变量
C语言中多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上

2.5 struct类型加强

C语言的struct定义了一组变量的集合,C编译器并不认为这是一种新的类型
C++中的struct是一个新类型的定义声明

2.6 C++中所有的变量和函数都必须有类型

在C语言中
int f( );表示返回值为int,接受任意参数的函数
int f(void);表示返回值为int的无参函数
在C++中
int f( );和int f(void)具有相同的意义,都表示返回值为int的无参函数
C++更加强调类型,任意的程序元素都必须显示指明类型
C语言中的默认类型在C++中是不合法的

2.2-2.6属于语法级别的增强

2.7新增Bool类型关键字

2.8三目运算符功能增强

C语言返回变量的值 ;C++语言是返回变量本身
C语言中的三目运算符返回的是变量值,不能作为左值使用
C++中的三目运算符可直接返回变量本身,因此可以出现在程序的任何地方
(a < b ? a : b )= 30;
注意:三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用
当左值的条件:要有内存空间;C++编译器帮助程序员取了一个地址而已

3 C/C++中的const

Const主要修饰指针
Const好处

  • 指针做函数参数,可以有效的提高代码可读性,减少bug;
  • 清楚的分清参数的输入和输出特性

C语言中的const变量
C语言中const变量是只读变量,有自己的存储空间

C++编译器对const常量的处理
当碰见常量声明时,在符号表中放入常量;编译过程中若发现使用常量则直接以符号表中的值替换;编译过程中若发现对const使用了extern或者&操作符,则给对应的常量分配存储空间(兼容C)
注意:C++编译器虽然可能为const常量分配空间,但不会使用其存储空间中的值。

const和#define的异同
const常量是由编译器处理的,提供类型检查和作用域检查
宏定义由预处理器处理,单纯的文本替换

4引用专题讲座

4.1引用(普通引用)

引用可以看作一个已定义变量的别名
Type& name = var;

普通引用在声明时必须用其它的变量进行初始化,
引用作为函数参数声明时不进行初始化

引用的意义
1)引用作为其它变量的别名而存在,因此在一些场合可以代替指针
2)引用相对于指针来说具有更好的可读性和实用性

引用的本质
1)引用在C++中的内部实现是一个常指针
Type& name ->Type* const name
2)C++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同。
3)从使用的角度,引用会让人误会其只是一个别名,没有自己的存储空间。这是C++为了实用性而做出的细节隐藏
4) 请仔细对比间接赋值成立的三个条件

  • 定义两个变量 (一个实参一个形参)
  • 建立关联 实参取地址传给形参
  • *p形参去间接的修改实参的值

引用结论
1)引用在实现上,只不过是把间接赋值成立的三个条件的后两步和二为一
//当实参传给形参引用的时候,只不过是c++编译器帮我们程序员手工取了一个实参地址,传给了形参引用(常量指针)
2)当我们使用引用语法的时,我们不去关心编译器引用是怎么做的
当我们分析奇怪的语法现象的时,我们才去考虑c++编译器是怎么做的

函数返回值是引用(引用当左值)
若返回栈变量,不能成为其它引用的初始值,不能作为左值使用
若返回静态变量或全局变量,可以成为其他引用的初始值,既可作为右值使用,也可作为左值使用

指针引用
C++中的指针引用作函数参数相当于C语言中的二级指针作函数参数
int getTe2(Teacher* &myp) ---- int getTe(Teacher **myp )

4.2常引用

const Type& name = var
const引用让变量拥有只读属性
常量引用初始化分为两种:
 用变量 初始化 常量引用 const int& y = x;
 用常量 初始化 常量引用 const int &m = 10;

1)Const & int e 相当于 const int * const e
2)普通引用 相当于 int *const e1
3)当使用常量(字面量)对const引用进行初始化时,C++编译器会为常量值分配空间,并将引用名作为这段空间的别名
4)使用字面量对const引用初始化后,将生成一个只读变量

5 C++对C的函数扩展

5.1 inline内联函数

C++中推荐使用内联函数替代宏代码片段
内联函数声明时inline关键字必须和函数定义结合在一起,否则编译器会直接忽略内联请求。

内联函数由 编译器处理,直接将编译后的函数体插入调用的地方
宏代码片段 由预处理器处理, 进行简单的文本替换,没有任何编译过程
当参数有自加和自减号时两者结果会有区别

1)内联函数在编译时直接将函数体插入函数调用的地方
2)inline只是一种请求,编译器不一定允许这种请求
3)内联函数省去了普通函数调用时压栈,跳转和返回的开销

5.2 默认参数

  1. C++中可以在函数声明时为参数提供一个默认值,当函数调用时没有指定这个参数的值,编译器会自动用默认值代替
  2. 如果默认参数出现,那么右边的都必须有默认参数

5.3 函数占位参数

占位参数只有参数类型声明,而没有参数名声明
函数调用时,必须写够参数

5.4 默认参数和占位参数

可以将占位参数与默认参数结合起来使用
意义:为以后程序的扩展留下线索;兼容C语言程序中可能出现的不规范写法
int func2(int a, int b, int = 0)
如果默认参数和占位参数在一起,都能调用起来
func2(1, 2);
func2(1, 2, 3);

5.5 函数重载(Overroad)

 当函数名和不同的参数搭配时函数的含义不同
 函数重载至少满足下面的一个条件:参数个数、类型、顺序不同
 函数返回值不是函数重载的判断标准
 编译器调用重载函数的准则:
将所有同名函数作为候选者
尝试寻找可行的候选函数
精确匹配实参

重载函数在本质上是相互独立的不同函数(静态链编)

函数重载遇上函数默认参数时,当不同部分只有默认参数时会存在二义性

函数重载和函数指针结合
函数指针定义 基础的语法

  1. 声明一个函数类型
    typedef void (mytypefunc)(int a, int b);
    // mytypefunc *myfuncp = NULL //定义一个函数指针,其指向函数的入口地址
  2. 声明一个函数指针类型
    typedef void (*mytypefunc)(int a, int b);
    // mytypefunc fp = NULL //通过函数指针类型定义一个函数指针
  3. 定义一个函数指针变量
    void (*myvarpfunc)(int a, int b);

当使用重载函数名对函数指针进行赋值时:

  • 根据重载规则挑选与函数指针参数列表一致的候选者
  • 严格匹配候选者的函数类型与函数指针的函数类型

#传智播客C++学习#

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值