文章目录
- 前言
- 1 C++和C的历史渊源
- 2 C++中的`class`和C中的`struct`
- 3 C++命名空间(名字空间)详解
- 3.1 `namespace` 是C++中的关键字,用来定义一个命名空间,语法格式为:
- 3.2 `namespace`的使用规范
- 使用域解析操作符`::`
- 使用`using`关键字
- 4 C++头文件和`std`命名空间
- 4.1 C和C++头文件历史变革
- 5 C++ 的标准输入输出
- 6 C++ `new`和`delete`运算符简介
- 7 C++ `inline`内联函数详解
- 8 C++ 函数的默认参数详解
- 9 C++函数的重载
- 10 C++ 引用
- 10.1 参数传递带来的problem
- 10.2 C/C++传递数组
- 10.3 引入`引用`(Reference)
- 引用的定义
- 总结
前言
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++头文件历史变革
- 早期,C++不支持命名空间,没有自己的编译器,将C++翻译成C再通过C编译器进行编译。这时依然使用C语言的库,也开发了一些自己的库。
- 后来,C++引入了命名空间,打造的第一个命名空间就是
std
,标准命名空间,即原来头文件里面实现的内容都在stl
命名空间中重写了。 - C++现状
-
旧的 C++ 头文件,如 iostream.h、fstream.h 等将会继续被支持,尽管它们不在官方标准中。这些头文件的内容不在命名空间 std 中。
-
新的 C++ 头文件,如 iostream、fstream 等包含的基本功能和对应的旧版头文件相似,但头文件的内容在命名空间 std 中。
注意:在标准化的过程中,库中有些部分的细节被修改了,所以旧的头文件和新的头文件不一定完全对应。 -
标准C头文件如 stdio.h、stdlib.h 等继续被支持。头文件的内容不在 std 中。
-
具有C库功能的新C++头文件具有如 cstdio、cstdlib 这样的名字。它们提供的内容和相应的旧的C头文件相同,只是内容在 std 中。
-
5 C++ 的标准输入输出
cout 和 cin 都是 C++ 的内置对象,而不是关键字
,cout 和 cin 就分别是 ostream 和 istream 类的对象,只不过它们是由标准库的开发者提前创建好的,可以直接拿来使用。
6 C++ new
和delete
运算符简介
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;
- 使用时使用
&
表示去地址 &
的第三种用法是位运算中的与运算