一、类型分类
类型分类:
基础类型
自定义类型
二、命名空间
1.命名空间相当于全局域,用{}括起来一个文件,用namespace给这个文件命名。
std是C++库里的文件,它的使用有两种方法,一种是using namespace std,一种是std::cout<<i<<std::endl(::是域作用解析符)。
2.C语言中1个域无法对一个变量进行多次定义,会造成重定义的问题。
如下所示就由于a重定义从而导致无法编译:
#include<iostream>
using namespace std;
int a = 20;
int a = 30;
int main()
{
printf("%d\n", a);
return 0;
}
C++通过命名空间解决此问题,通过给不同的域定义不同的名字从而对域进行隔离,解决命名冲突的问题:
3.总结:using namespace std命名空间的优缺点
优点:解决了C语言命名空间冲突的问题(一个域内无法对变量进行多次定义)
缺点:直接调用的库里的函数,如果定义的与库里的重复,则无法进行编译
三、函数重载
C语言不支持两个函数的函数名相同,而C++支持两个函数的函数名相同,即重载。
1.定义:函数名相同,参数不同(参数的个数或类型不同)
参数不同是指参数的个数或者类型不同(其中若参数有多个个数和类型,只要顺序不同也可构成重载)
2.C++是怎样支持重载的?
C++遵循函数名修饰规则,C++的命名由函数名以及参数类型等构成,既是函数名相同,但是参数不同,从而函数参数的首字母不同,从而函数名不同,所以C++支持重载
四、缺省参数
1.分类:
缺省参数分为全缺省与半缺省,全缺省即函数的参数都给赋值,半缺省即函数的参数可以部分不赋值
2.半缺省参数只能从左向右缺省,以下的定义是不可以的,默认实参不在形参列表的结尾
int f3(int x1=5, int x2 )
五丶引用和指针
C++primer中对 对象的定义:对象是指一块能存储数据并具有某种类型的内存空间
一个对象a,它有值和地址&a,运行程序时,计算机会为该对象分配存储空间,来存储该对象的值,我们通过该对象的地址,来访问存储空间中的值
指针p也是对象,它同样有地址&p和存储的值p,只不过,p存储的数据类型是数据的地址。如果我们要以p中存储的数据为地址,来访问对象的值,则要在p前加解引用操作符"*",即*p。
对象有常量(const)和变量之分,既然指针本身是对象,那么指针所存储的地址也有常量和变量之分,常量指针是指,指针这个对象所存储的地址是不可以改变的,而指向常量的指针的意思是,不能通过该指针来改变这个指针所指向的对象。
我们可以把引用理解成变量的别名。定义一个引用的时候,程序把该引用和它的初始值绑定在一起,而不是拷贝它。计算机必须在声明r的同时就要对它初始化,并且,r一经声明,就不可以再和其它对象绑定在一起了。
实际上,你也可以把引用看做是通过一个常量指针来实现的,它只能绑定到初始化它的对象上。
关于指针和引用的对比,可以参看<<more effective C++>>中的第一条条款,引用的一个优点是它一定不为空,因此相对于指针,它不用检查它所指对象是否为空,这增加了效率
比如下面的代码
int a,b,*p,&r=a;//正确
r=3;//正确:等价于a=3
int &rr;//出错:引用必须初始化
p=&a;//正确:p中存储a的地址,即p指向a
*p=4;//正确:p中存的是a的地址,对a所对应的存储空间存入值4
p=&b//正确:p可以多次赋值,p存储b的地址