一、名称空间
什么是名称空间:是C++的一项特性(废话!0.o)。
自己看书看了好久不太懂名称空间是什么?为什么这样用?难道不能直接包含头文件后使用里面的标识符、函数、声明的变量?为什么要多此一举?
经过一番百度总算搞明白来由了,这里我用简单的自己的话语描述一下(不太严谨)!
我们都知道,在C语言的,头文件包含很多定义的变量、声明的函数等,包含头文件后就可以拿来用,但是随着程序越来越庞大,类库等也越来越多,就会出现一些问题:
打个比方,小明写了一个头文件1.h,里面有定义一个函数add(),而不巧小红也写了一个头文件2.h,也要定义一个add()函数,那么我的程序要包含两个头文件时,使用add()函数究竟是使用谁的呢?就会引发错误冲突。名称空间就是用来精确的圈定头文件中起作用的部分的。
例子,using namespace std 使用std中所有内容,全局通用
当然一般情况下最好不要这样用,因为你这样是爽了,别人要用std中已经定义的一个对象的名称怎么办?所有可以进行精确指定,可以在文件前写using std::cout,若果不写,则在程序中写std::cout、std::sin等
忘记说明一点:C++中头文件没有以.h结尾,则需要使用空间名称编译指令来时头文件的定义对程序可用。
二、运算符重载
在前面学习中,cout<<"你是大笨蛋"中,插入运算符<<看上去像左移运算符<<,同一个运算符有不同的含义,这就是运算符重载。
相似的有&:地址运算符、按位AND运算
*即表示乘法又表示指针解除引用
C++允许用户重新定义运算符的含义。
2.1 指针
指针是一个变量,这个变量存储了一个地址,这个地址所在的地方装着目标量
指针的定义比如 int *a;a是一个指针,*a的值表示指针a存储地址的地方装载的值
三、new与delete内存管理
在书中有描述指针时提到了一点,就是定义指针时必须初始化其值,不然将不知道指针指向何处,这可能造成危险。
比如 int * a;
*a=123;
这种写法时,指针变量天知道装着什么地址,万一其他程序有用到,再被改写成123.。。。
所以第二句可以换成a=0x654654564等自己想要的地址进行解决。
上述这些方法一般是将变量的地址赋给指针,在C++中使用new运算符进行更简单的分配内存的方式
int * a = new int;
仅此一句,定义了一个指针a,还找了一个适合整形变量的内存块的地址赋给了指针a。没有变量名。简单方便。
使用new还有一个必须要注意的是得成对使用delete a;释放内存,不然,就无法调用被new占用的内存了。
接下来说明一下数组使用new分配内存的用法以及好处
1.定义方式
int * a = new int [10]
2.释放方式
delete [] a;
常规建立数组的方式叫做静态联编,而使用new的方式叫做动态联编,前者是在程序编译时为数组分配内存,后者是在程序运行时为数组分配内存。
这里,指针地址装载数组第一个元素的地址,可以使用a[2]来指定第三个元素。
指针与数组的一些特性:
指针装的是地址,自身是变量,指针进行+1操作时,值会增加其指向的数据类型的字节数
new用来创立数组通用可以用来创建结构也可以用来创建类
比如name是一个结构体名,则 name * pa = new name; 定义了一个结构体不过没有名字,那么没有名字怎么使用运算符.去指定成员呢?这时可以使用->运算符。
pa->xxx 即可。
四、cout函数输出指针数据
如果a是一个指针,那么cout 《a 会输出什么呢?
如果是非字符指针,那么输出地址,反之输出字符。那么要输出字符指针的地址怎么办,可以使用cout《(int *)a,使用强制类型转换符就可以了。