C/C++:01. C过渡到C++


前言


1 C++和C的历史渊源

C++ 读作“C加加”,是“C Plus Plus”的简称。顾名思义,C++ 是在C语言的基础上增加新特性,玩出了新花样,所以叫“C Plus Plus”。随着 C++ 的流行,它的语法也越来越强大,已经能够很完善的支持面向过程编程、面向对象编程(OOP)和泛型编程,几乎成了一门独立的语言,拥有了自己的编译方式。 所以C和C++真正分家了。

2 C++中的class和C中的struct

C++中的Class 是C中的 Struct的 更高级版本,所以在学C++时候,虽然它也支持结构体,但class对结构体进行了一些扩展,使得它更好用,尽量都使用class没毛病。

3 C++命名空间(名字空间)详解

命名空间是为了解决合作开发时的命名冲突问题,如下:个体在自己的命名空间内使用同样的变量名。

namespace Li{
	FILE* fp = NULL;
}
namespace Han{
	FILE* fp = NULL;
}

3.1 namespace 是C++中的关键字,用来定义一个命名空间,语法格式为:

namespace name{
	//vaiables, functions, classes.
}

name是命名空间的名字,它里面可以包含变量、函数、类、typedef、#define 等,最后由{ }包围。

3.2 namespace的使用规范

使用域解析操作符::

Li::fp = fopen("one.txt", "r");  //使用小李定义的变量 fp
Han::fp = fopen("two.txt", "rb+");  //使用小韩定义的变量 fp

使用using关键字

或者声明整个命名空间 using namespace Li

using Li::fp;  
fp = fopen("one.txt", "r");  //使用小李定义的变量 fp
Han :: fp = fopen("two.txt", "rb+");  //使用小韩定义的变量 fp

如果命名空间 Li 中还定义了其他的变量,那么同样具有 fp 变量的效果。在 using 声明后,如果有未具体指定命名空间的变量产生了命名冲突,那么默认采用命名空间 Li 中的变量。

4 C++头文件和std命名空间

4.1 C和C++头文件历史变革

  1. 早期,C++不支持命名空间,没有自己的编译器,将C++翻译成C再通过C编译器进行编译。这时依然使用C语言的库,也开发了一些自己的库。
  2. 后来,C++引入了命名空间,打造的第一个命名空间就是std标准命名空间,即原来头文件里面实现的内容都在stl命名空间中重写了。
  3. C++现状
    1. 旧的 C++ 头文件,如 iostream.h、fstream.h 等将会继续被支持,尽管它们不在官方标准中。这些头文件的内容不在命名空间 std 中。

    2. 新的 C++ 头文件,如 iostream、fstream 等包含的基本功能和对应的旧版头文件相似,但头文件的内容在命名空间 std 中。
      注意:在标准化的过程中,库中有些部分的细节被修改了,所以旧的头文件和新的头文件不一定完全对应。

    3. 标准C头文件如 stdio.h、stdlib.h 等继续被支持。头文件的内容不在 std 中。

    4. 具有C库功能的新C++头文件具有如 cstdio、cstdlib 这样的名字。它们提供的内容和相应的旧的C头文件相同,只是内容在 std 中。

5 C++ 的标准输入输出

cout 和 cin 都是 C++ 的内置对象,而不是关键字,cout 和 cin 就分别是 ostream 和 istream 类的对象,只不过它们是由标准库的开发者提前创建好的,可以直接拿来使用。

6 C++ newdelete运算符简介

C++除了支持malloc和free之外,还增加了两个新的关键词 new 和delete,new用来动态分配内存,delete用来释放内存。

int *p = new int;  //分配1个int型的内存空间
delete p;  //释放内存

int *p = new int[10];  //分配10个int型的内存空间
delete[] p;

C++中,建议使用 new 和 delete 来管理内存,它们可以使用C++的一些新特性,最明显的是可以自动调用构造函数和析构函数

7 C++ inline内联函数详解

使用内联函数的初衷函数调用时有时间和空间开销的,程序在执行一个函数之前需要做一些准备工作,要将实参、局部变量、返回地址以及若干寄存器都压入栈中,然后才能执行函数体中的代码;函数体中的代码执行完毕后还要清理现场,将之前压入栈中的数据都出栈,才能接着执行函数调用位置以后的代码。

这种在函数调用处直接嵌入函数体的函数称为内联函数(Inline Function),又称内嵌函数或者内置函数。

内联函数的定义规范:在函数头加inline

inline void swap(int *a, int *b)
{///}

注意,要在函数定义处添加 inline 关键字,在函数声明处添加 inline 关键字虽然没有错,但这种做法是无效的,编译器会忽略函数声明处的 inline 关键字。

8 C++ 函数的默认参数详解

如下 :如果调用func的时候没有传递参数,就使用默认值(默认值只能放在形参最后,即后面的变量使用默认赋值)

//带默认参数的函数
void func(int n, float b=1.2, char c='@'){
    cout<<n<<", "<<b<<", "<<c<<endl;
}

9 C++函数的重载

void swap1(int *a, int *b);      //交换 int 变量的值
void swap2(float *a, float *b);  //交换 float 变量的值
void swap3(char *a, char *b);    //交换 char 变量的值
void swap4(bool *a, bool *b);    //交换 bool 变量的值

函数的重载的规则:

  • 函数名称必须相同。
  • 参数列表必须不同(个数不同、类型不同、参数排列顺序不同等)。
  • 函数的返回类型可以相同也可以不相同。
  • 仅仅返回类型不同不足以成为函数的重载。

10 C++ 引用

10.1 参数传递带来的problem

参数传递其实就是一次赋值过程,而赋值是对内存进行拷贝,耗时耗力(尤其是数组、结构图、对象)。

10.2 C/C++传递数组

C/C++禁止在函数调用的时候直接传递数组的内容,而是强调传递数组指针,而对于结构体和对象没有这种限制。

10.3 引入引用(Reference)

引用是一种比指针更加便捷的传递聚合类型(除了char int float等基本类型)数据的方式。
引用可以看做是数据的一个别名,通过这个别名和原来的名字都能够找到这份数据,也可以修改这份数据。引用类型类似于Windows中的快捷方式,通过这些快捷方式和可执行程序本身都可以运行程序。

引用的定义

  • 引用的定义方式类似指针,只是用&取代了*
    type &name = data;
  • type 是被引用的数据的类型,name 是引用的名称,data 是被引用的数据。引用必须在定义的同时初始化,并且以后也要从一而终,不能再引用其它数据,这有点类似于常量(const 变量)

&的三种用法

  • 定义时使用&是定义引用变量 如:type &name = data;
  • 使用时使用&表示去地址
  • &的第三种用法是位运算中的与运算

总结

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值