引用,关键字const,动态内存分配new与释放delete

一引用:

        格式: 类型名 & 引用名=某变量名;

例如 int a=1;  int & a1=a;此时a1的类型为 int &,a1等价于a.

注意:1引用只能引用变量,不能引用常量和表达式;

        2引用的定义与初始化要同步进行,例如int & a1;这是编译错误的;

        3引用初始化后只能一直引用该变量,不可以引用其他变量.但是一个变量可以有多个引用,多个引用时同时注意类型名要一致.

        引用的应用:

1例如交换函数swap:

void swap(int a,int b){
    int t;
    t=a;a=b;b=t;
}

这段代码是起不到交换作用的,因为这个的形参是无法改变实参.但是,我们利用好引用,即可实现 ,如:

void swap(int & a,int & b){
    int t;
    t=a;a=b;b=t;
}
swap(n1,n2);

 这时,形参类型为int &,函数调用后形参a就等价于n1,故可以实现.

2引用作为函数的返回值(候补)

二 const:

        1定义常引用:

        例如: 

int a=1;
const int & a1=a;

a1的类型为const int &.

注意,被常引用(如上a1)引用的的变量(如上a)不可以被该常引用(如上a1)去修改,a是可以自由修改的,a1可读不可自由该.

例如:  在加一句a1=2;这是编译错误,   a=2;是可以的,并且a1也变成了2.

常引用与非常引用:

        const int & 与int & 为不同的类型,int & 类型的变量可以初始化const int &的变量,反过来初始化则需要强制类型转换(通俗理解为,加上const该变量就比不加时"地位变低",只能被别人赋值,不能主动赋值别人).即:

int a;
const int & a1=a;
int & b=a1;
//错误,a1要写成 int & b=(int &)a1;
int a;
int & a1=a;
const int & b1=a1;;
//正确.

        2定义常量

和define作用一样,例如 const int MAX=10000;

        3定义常量指针

const T * p= n;

注意:

        1不可以通过常量指针修改其指向的内容,但是常量指针的指向可以变化.

int a=1,b=1;
const int* p=&a;//"&"为取地址符,p为常量指针
*p=2;//编译错误
p=&b;//正确
a=2;//正确

        2非常量指针可以赋值给常量指针,反之需要强制类型转换.(类似常引用)

        3常量指针用于函数形参时,可以保护调用传递来的实参不被改变.

三 动态内存分配

        1new

1分配变量:例如: p = new int; 其中,p是类型为int* 的指针,int也可以改为其他类型.该语句分配出一个大小为sizeof(int)字节的内存空间,并将该内存空间的起始地址赋值给指针p.

2分配数组:例如: p = new int [n];其中,p为类型为int* 的指针,该语句分配出一个大小为sizeof(int[n])字节的内存空间,并将该内存空间的起始地址赋值给指针p.

        2delete

用new分配的内存空间,一定要用delete去释放.例如: p =new int后要delete p;

若为分配数组需要释放空间,delete [] p;

四 内联函数

函数调用是要花费时间的,内联函数是将整个函数代码插入到调用的地方,减少了函数调用所需要的时间.例如:inline int swap(int a,int b){....}在函数定义前加上关键字inline.(具体候补)

五 函数重载

多个函数具有相同的函数名,但函数之间有不同的参数个数参数类型,(函数的返回值类型需要相同)这叫函数的重载(候补)

六 函数的缺省参数

举例:

int max(int a,int b=1,int c=2){
    ...
}
//定义过程中可以让函数形参最右侧连续有初始值
调用:
max(10)//a==10,b==1,c==2;
max(10,3)//a==10,b==3,c==2
max(10, ,3)//不可以

你可能感兴趣的:(c++)