typedef&引用&指针引用
2016-03-23 21:44
274 查看
typedef:声明新的类型名来代替原有的类型名,比如:
相当于用INTGER来代表int类型,习惯上把用typedef声明的类型用大写字母表示。
引用:
引用说白了就是为对象另外起了一个名字,定义了一个引用之后所有的操作都是在引用绑定的对象上进行的。
定义方式: 将声明符写成&d的形式来定义引用类型其中d是声明的变量名,
int size = 100;
int &sum = size;
要注意的是我们在引用的时候必须要给引用赋值,出生即绑定,像直接int &size 这种方式是不可以的。
那么问题来了:我们可不可以定义引用的引用呢?答案当然是不可以了,为什么呢?因为我们说引用只是给对象起了个另外的名字,引用并不是一个对象,所以我们不能这么做。另外,我们可以给一个对象绑定多个引用。
另外,值的注意的是:其他所有类型的引用和要绑定的对象都要严格匹配,另外,引用只能绑定到对象上,而不能绑定到字面值或者某个表达式的计算结果上。但是对于常量引用,这条法则不适用,详细见之后<>处:
常量引用:
int a=1;
const int &t1= a;
和
const int a=1;
const int &t2= a;
这里的t1,t2都是常量引用。
关于常量引用相关的例子:
int ai=10;
const int ci= 100;
const int &si= ai;//正确的,常量引用可以指向非常量对象
const int &r1 = ci; //正确的,引用及对象都是常量
r1 = 11 //这是错误的,因为r1是常量引用,不能修改它所绑定的对象的值
int &r2 = ci //这是错误的,不能让一个非常量引用指向一个常量对象,因为非常量引用意味着可以修改对象的值;对象本身是常量,不能更改,所以矛盾。
总结:
const int &指向int 合法 ,不可修改对象值
const int &[b]指向const int 合法 ,不可修改对象值[/b]
int&指向 int 合法,可修改对象值
int &[b]指向 const int 不合法 [/b]
<>
特例1:在初始化常量引用时允许使用任意表达式作为初始值,只要该表达式的结果最终能转化为引用的类型就行了。
特例2:允许为一个常量引用绑定非常量的对象,字面值甚至一个一般表达式。即const int &p=100;和const int &p=a+b;合法。
指针引用
数据结构教材实例:
List *&p 等价于 List* &L 。List* 表示 一个指针类型的List结构,&L表示一个引用,而且是一个指针引用。List *L 是 一个List类型的指针。二者使用的区别:在传递的函数参数是指针类型的话,那么编译器会复制一个指针,那么我们在函数内部使用的指针就是复制 之后的指针,而不是原来的指针了。如果需要使用原来的指针
,则需要传递指针引用。即:List *&L,那么我们在函数 内部操作的指针 还是 原来传过来的指针对象,也就是说:如果要对这个指针的本身进行操作和改变其内容,就必须使用引用(List *&p),而如果只是为了用它间接访问的功能(*p)就可以直接传List *p。下面来个 例子说明下:
总结来说:
一般的传指针,那么都是复制一个指针,
如果想要使用原有的指针,就使用指针引用
typedef int INTGER;
相当于用INTGER来代表int类型,习惯上把用typedef声明的类型用大写字母表示。
引用:
引用说白了就是为对象另外起了一个名字,定义了一个引用之后所有的操作都是在引用绑定的对象上进行的。
定义方式: 将声明符写成&d的形式来定义引用类型其中d是声明的变量名,
int size = 100;
int &sum = size;
要注意的是我们在引用的时候必须要给引用赋值,出生即绑定,像直接int &size 这种方式是不可以的。
那么问题来了:我们可不可以定义引用的引用呢?答案当然是不可以了,为什么呢?因为我们说引用只是给对象起了个另外的名字,引用并不是一个对象,所以我们不能这么做。另外,我们可以给一个对象绑定多个引用。
另外,值的注意的是:其他所有类型的引用和要绑定的对象都要严格匹配,另外,引用只能绑定到对象上,而不能绑定到字面值或者某个表达式的计算结果上。但是对于常量引用,这条法则不适用,详细见之后<>处:
常量引用:
int a=1;
const int &t1= a;
和
const int a=1;
const int &t2= a;
这里的t1,t2都是常量引用。
关于常量引用相关的例子:
int ai=10;
const int ci= 100;
const int &si= ai;//正确的,常量引用可以指向非常量对象
const int &r1 = ci; //正确的,引用及对象都是常量
r1 = 11 //这是错误的,因为r1是常量引用,不能修改它所绑定的对象的值
int &r2 = ci //这是错误的,不能让一个非常量引用指向一个常量对象,因为非常量引用意味着可以修改对象的值;对象本身是常量,不能更改,所以矛盾。
总结:
const int &指向int 合法 ,不可修改对象值
const int &[b]指向const int 合法 ,不可修改对象值[/b]
int&指向 int 合法,可修改对象值
int &[b]指向 const int 不合法 [/b]
<>
特例1:在初始化常量引用时允许使用任意表达式作为初始值,只要该表达式的结果最终能转化为引用的类型就行了。
特例2:允许为一个常量引用绑定非常量的对象,字面值甚至一个一般表达式。即const int &p=100;和const int &p=a+b;合法。
指针引用
数据结构教材实例:
List *&p 等价于 List* &L 。List* 表示 一个指针类型的List结构,&L表示一个引用,而且是一个指针引用。List *L 是 一个List类型的指针。二者使用的区别:在传递的函数参数是指针类型的话,那么编译器会复制一个指针,那么我们在函数内部使用的指针就是复制 之后的指针,而不是原来的指针了。如果需要使用原来的指针
,则需要传递指针引用。即:List *&L,那么我们在函数 内部操作的指针 还是 原来传过来的指针对象,也就是说:如果要对这个指针的本身进行操作和改变其内容,就必须使用引用(List *&p),而如果只是为了用它间接访问的功能(*p)就可以直接传List *p。下面来个 例子说明下:
<span style="font-size:12px;">void function_1( int *p) { p++;//复制的指针变化,原指针不变 } void function_2(int *&p) { p++; } int a[100]; int *p = a; function(p); // p指向第一个元素 function_2(p); //p 指向第二个元素</span>
总结来说:
一般的传指针,那么都是复制一个指针,
如果想要使用原有的指针,就使用指针引用
相关文章推荐
- 1010 Problem K
- H3C S5800/S7506E实现IRF功能详细配置过程
- JavaScript系列:计算一个结果为30的加法智力题
- js 如何判断鼠标点击事件还是js代码调用
- UML实践详细经典教程
- iOS 本地通知
- Android Framework 记录之一
- leetcode_206_Reverse Linked List(easy)(C++)
- 【转】ACM中java的使用
- Kruskal 模板
- Android客户端性能优化
- 作业三程伟
- PSP(3.16——3.22)以及周记录
- 通过ip拨号器来了解广播接收者
- ios assign、copy 、retain
- 【NWERC2015】【BZOJ4427】Cleaning Pipes清理管道
- 单链表的各种基本运算
- Android 自定义Camera(二)
- LA 4254(p80)----Processor
- 我的python学习之路