C++在C的基础上增加了面向对象的编程思想,并且增加了许多有用的库,也对C语言的一些方面做了一些添加和优化
#include<iostream>
using namespace std;
int main()
{
cout << "hello world" << endl;
return 0;
}
这是C++的第一个程序
由于我们需要的函数和变量的大量存在的,我们在命名的时候就会遇到名字重复的情况,使用命名空间可以使标识符本地化,减少命名冲突。
首先学习的是命名空间:需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。
命名空间中的变量不能被直接使用,平常使用的变量中,默认先在局部作用域和全局作用域中搜索变量,想要使用命名空间域需要使用命名空间名称加上::操作来使用
但是这种使用方法会很麻烦
我们可以使using来把命名空间中的某个成员引入,
也可以把命名空间名称引入
也可以using nilv::b;
把变量b引入
我们第一个程序中的std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中
输入输出
我们在使用cout/cin输入输出函数是,要先把标准的命名空间引入
C++中的输入输出函数包含在头文件iostream中,
cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含头文件中。
<<是流插入运算符,>>是流提取运算符。
使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。
C++的输入输出可以自动识别变量类型
缺省参数
函数传参时,我们可以选择省去这个参数的值
如上图
半缺省参数指的是不完全省略的参数
缺省参数的要求:
- 半缺省参数必须从右往左依次来给出,不能间隔着给
- 缺省参数不能在函数声明和定义中同时出现
- 缺省值必须是常量或者全局变量
定义缺省参数时,在声明中为参数赋值,因为在程序编译时,是先处理声明的。
函数重载
是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题
编译链接时,这种同名函数的情况会得到处理,会根据参数列表来进行命名,命名规则由编译器决定。
- 实际项目通常是由多个头文件和多个源文件构成,而通过C语言阶段学习的编译链接,我们可以知道,【当前a.cpp中调用了b.cpp中定义的Add函数时】,编译后链接前,a.o的目标文件中没有Add的函数地址,因为Add是在b.cpp中定义的,所以Add的地址在b.o中。那么怎么办呢?
- 所以链接阶段就是专门处理这种问题,链接器看到a.o调用Add,但是没有Add的地址,就会到b.o的符号表中找Add的地址,然后链接到一起。
- 那么链接时,面对Add函数,链接接器会使用哪个名字去找呢?这里每个编译器都有自己的函数名修饰规则。
- 由于Windows下vs的修饰规则过于复杂,而Linux下g++的修饰规则简单易懂,下面我们使用了g++演示了这个修饰后的名字。
- 通过下面我们可以看出gcc的函数修饰后名字不变。而g++的函数修饰后变成【_Z+函数长度+函数名+类型首字母】
引用
引用操作符 &(也是按位与操作符,这里就是操作符重载)
就是给已存在的变量取一个别名,编译器不会开辟空间、
类型 & 引用的变量(对象名)=引用实体
引用类型必须和引用实体是同种类型
引用时权限不能放大
做参数效率会提高
引用和指针的区别
语法概念上就是一个别名,没有独立空间。
但是在底层实现上实际上时有空间的,因为引用是按照指针的方式来实现的。
1.引用在定义时必须初始化,指针没有要求
2.引用自加,实体也会自加,指针会偏移一个类型的大小
3.引用在初始化引用一个实体后,就不能在引用其他实体/
4.引用使用起来相对更安全