一、引用
引用可以是引用一个变量、指针、结构体等,其实就是一个别名,相当于人的外号。但是对引用操作,也就相当于对本体的操作。
语法:int a=3;
int &b=a;//b引用a
b=4;
cout<<a<<endl;//相当于a=4.
结构体:typedef struct {
int x=1;int y=2;}Coor;
int main(){Coor a;
Coor &b=a;//相当于结构体类型Coor的b引用了a;
b.x=4;
b.y=5;
cout<<a.x<<endl;
cout<<a.y<<endl;//分别是4,5,因为对结构体引用操作相当于对本体进行操作。r
eturn 0;}
指针引用:int main()
{
int a=10;int * b=&a;//指针b指向a
int *&c=b;//指针c引用b
*c=20;
cout<<*b<<endl;//b也是20,对引用c操作就是等价于对b操作。
return 0;}
指针的两类用法:
int a=2;int *p=&a;//指针p指向于a
int a=2;int *p;p=&a;//表示指针p指向于a的地址注意*p表示指针指向的内容,而p实际存储的是指向内容的地址。
引用作为函数的参数:
void fun(int *a,int *b){int c=0;c=*a;*a=*b;*b=c;}//将两个数调换的代码
int main()
{int x=10
;int y=20;
fun(&x,&y);
return 0;}
使用引用情况下应该写为:
void fun(int &a,int &b)
{int c=0;c=a;a=b;b=c;}
int main()
{int x=10;int y=20;
fun(x,y);
return 0;}
由上面的例子可以看出,符号&除了取变量的地址,很多情况下还可以作为引用。
二、const类型
const表示常量,
如:int x=2;//x是变量
const int x=3或者int const x=3;//x就是常量了。
const与指针类型:const int *p=NULL;int const *p=NULL;//两者完全等价
一些例子:int x=3;const int *p=&x;//此时指针是常量,可以指向其他,但是不能给指向内容赋值。即p=&y可以,但是*p=2错误。
int x=3;int *const p=&x;//此时该指针只能指向这一个位置了,即p=&y错误。因为该指针存储的地址是个常量。
const int x=3;const int *p=&x;//此时指向的是个常量,p=&y和*p=4都是错误。
三、const与引用关系int x=3;const int &y=x;//此时x=10可以,但是y=10就是错误。因为常量引用不能再一次对x进行赋值了。
总的来说,const在*外可以指向其他变量,但是在*内就不可以。
四、const与宏定义的关系
const int x=3;//常量,检查语法错误;
define x 3;//宏定义,不检查语法错误。
const int a=3;
const int *p=&a;//正确
int *p=&a;//错误
五、C++函数的新特性函数的默认值
void fun(int i,int j=5,int k=10);//声明可以
void fun(int i=2;int j; int k);//不可以,因为赋初始值必须都在右边才可以
//注意,代码中用函数,必须先声明,后定义。
函数的重载:在相同作用域下,函数名相同,但是函数的类型或者函数变量类型或者函数变量的个数不同。
如:int getmax(int x;int y);float getmax(float x; float y; float z)
内联函数:关键字:inlineinline int max(int a, int b, int c)int main(){......m=max(i,j,k);return 0;}//该内联函数直接将定义内容些进来,省了传回到定义地方算完之后再传回来的时间注意:内联函数是建议性的,不是你定义了编译器就会用。如果复杂编译器无法用。比如该定义函数有for循环等。
六、C++内存管理
内存本质:资源
谁掌握内存资源;操作系统
我们能做:申请/归还
申请内存:new
释放内存:delete//他们是运算符,不是函数
int*p=new int;delete p;
申请和释放一块内存:int *arr=new int[10];//申请10个int内存
delete []arr;//释放其他申请和释放内存方式:
c语言中:
void *malloc(size_t size);
void free(void *memblock)申请内存是否一定成功?不一定
int *p=new int [1000];
if (p==NULL)
{cout<<"失败"//申请失败;}
delete p;
p=NULL;//一个内存的释放int *p=new int[10000];if(NULL=p){//内存分配失败;//异常处理} delete []p;p=NULL;//块内存释放
示例:
#include "iostream"
#include"stdlib.h"
using namespace std;
int main(void)
{int *p=new int[20];//或者,int *p=new int;*p=20
if(NULL==P)
{
system("pause");
return 0;
}
cout<<*p<<Endl;
p[0]=10;
p[1]=20;
cout<<p[0]<<","<<p[1]<<endl;
delete []p;//如果只是delet p则只能释放第一个,其他的19个就无法释放。
p=NULL;
system("pause");return 0;}
//总之在申请释放内存时候记住,首先int *str=new char[100];if[str==NULL){//内存申请失败return 0;}delete []str;str=NULL;//删除!