class CExample;
CExample cE;
CExmaple& rcE = cE;
delele &rcE;
而以指针类型作为传递,会多了一步空值判断操作,可读性也不如引用类型。我的想法是如果是定义的C++语言使用的方法,则参数就定义的引用类型,而如果是设计通用模块,则接口方面,参数类型则用指针类型,不知道大家有什么想法,共同讨论一下
39 个解决方案
#1
lz这个代码错了。
#2
引用有的时候替代不了指针
#3
引用代替不了指针的地方多了
#4
输入参数: const &
输出参数: *
输出参数: *
#5
指针即地址
引用即别名
电脑内存只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
引用即别名
电脑内存只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
#6
不好意思,
class CExample;
CExample *cpE = new CExample;
CExmaple& rcE = *cpE;
delele &rcE;
这个是伪码,主要是为了说明使用引用类型也可以用来释放内存
#7
赵来师又在玩高深了。。
#8
i know, 地址的移位、指针变量的重赋值,内存的灵活性管理,语言的通用性等等,这些都是引用替代不了的,但是指针有利有弊,其中指针的不安全性是出现软件崩溃的bug的罪魁祸首,如果每次在遇到指针都进行一次空值判断,这个真的是有点不情愿,首先我隐约感觉这个会影响性能,然后太繁杂了,假如一个方法定义了四五个传出参数而且都是指针类型,那这个方法在还没执行前就得加上10来行空值判断处理代码,这个是很头疼的问题,而引用就不存在这种问题
#9
我通常尽量用引用,只在确认必须用指针的地方才用指针。
#10
用地址吧。。。。。
#11
能用引用就引用
如果需要指向0,引用做不到
或者需要指向可变,引用也做不到
这些时候用指针
如果需要指向0,引用做不到
或者需要指向可变,引用也做不到
这些时候用指针
#12
其实我觉得最重要的还是在对代码进行实现前对各个功能模块进行分析,提取其中的通用模块,对通用模块接口进行设计时采用接口的语言兼容性原则继续设计,对于非通用模块,并且不与外部接口有直接调用关系时,则引用类型首选
#13
引用用. 指针用->
还是偏向引用。。
还是偏向引用。。
#14
有时候编译器会对你写出的代码做出优化,即使你传递的参数是值类型,如果类型过大,也会导致实际的调用会是引用调用,这个在微软编译器中是这样实现的,lz可以测试。
至少引用的这种属性,指针不会有的
至少引用的这种属性,指针不会有的
#15
指针可以为空,引用必须是有效的对象,一些时候参数是得允许指针为空的。
#16
引用的本质就是指针,只是引用相对指针做了更多的限制,只是感觉这利弊相抵,指针更灵活但不安全,引用更安全,但不灵活
#17
说到底,还是指针的灵活性更高,给参数指针传NULL.可做默认处理,在另一方面又能体现多态的特性
#18
说到底什么时候该用引用,什么时候该用指针,这要看这个参数的具体应用场景
#19
CExmaple& rcE = *cpE; 不像C++代码;
这种代码是很受诟病的!
这种代码是很受诟病的!
#20
引用和指针是不可互相代替的。
数组通过引用就很不好用
动态分配也不会使用引用。
C++的引用,是通过常量指针实现的,是不可改变引用对象的。
而参数表中的指针也不能代替引用。
代替了会出现麻烦的!!
数组通过引用就很不好用
动态分配也不会使用引用。
C++的引用,是通过常量指针实现的,是不可改变引用对象的。
而参数表中的指针也不能代替引用。
代替了会出现麻烦的!!
#21
在适合的场合不排斥使用引用
#22
在C++中,我的原则是,能不用指针的地方,就不用指针。
所以,我的输入参数通常是IN const TYPE &,输出参数通常是 OUT TYPE &.
所以,我的输入参数通常是IN const TYPE &,输出参数通常是 OUT TYPE &.
#23
第一句就理解错误。
#24
地址的移位,用引用,需要的时候取地址,照样可以操作,
指针变量的重赋值,这应该是指针的引用或二级指针才有用,单个指针传进函数对指针变量重赋值好像不起作用吧。
#25
#26
说个例子看看
#27
学习学习楼上多位高手
#28
@飞天御剑流
请指教!!
#29
对引用类型取址是可以达到移位的效果,但是正如 @Im_whales 所说,这种关于对引用的取址是很诟病的。指针作为传出参数,它在方法中能改变的是它所指向的地址中存储的值
#30
很多编译器将引用实现为指针,但是实现归实现,本质归本质,两者不可混淆。引用的本质是内存模型中的实体的指示器,外在表现形式是别名。
C和C++提供了多种指示实体的方法,designator和指针是两者共有的,而C++多了引用。
#31
诟病不代表起不到同样的效果
另:指针作为传出参数,它在方法中能改变的是它所指向的地址中存储的值 ,引用同样可以改变所引用对象的值,这两者的效果有什么不一样吗??
#32
大家讨论的是能不能替代的问题,用法好不好看和这个主题没有关系吧。
#33
指针本身是可以改变的
指针可以指向数组,也可以指向单一变量。
引用是所谓的别名,代表对象本身,引用所代表的对象是不可替换的。
一个引用(作为函数参数除外)不可以代表另外一个对象。
一个没有初始化的引用是无用的;
一个没有初始化的指针,可以随时赋值。
所以各有各的用处,是不可互相替代的。
比如你要是想一个做vector这样的类,就不好使用引用来实现。
同样很多运算符重载函数,以及拷贝构造函数等,也不宜使用指针做参数。
CExample *cpE = new CExample;
CExmaple& rcE = *cpE; 这种用法,作用不是很大,后遗症还不小;
因为动态分配的内存你总是希望释放的,释放后的指针可以再次分配一块内存;
但是C++的引用永远使用同一块内存(代表同一个对象)。
假如这块内存被释放,对他的引用就成了,野指针一样的东西。
不可能重新初始化,也不可能让他成为另一块内存(另一个对象)的引用了。
还没有办法像指针一样,设置为NULL。C++是没有NULL引用的。
这样出错以后和野指针出错一样难以查找。
所以一般不会这样用的!
指针可以指向数组,也可以指向单一变量。
引用是所谓的别名,代表对象本身,引用所代表的对象是不可替换的。
一个引用(作为函数参数除外)不可以代表另外一个对象。
一个没有初始化的引用是无用的;
一个没有初始化的指针,可以随时赋值。
所以各有各的用处,是不可互相替代的。
比如你要是想一个做vector这样的类,就不好使用引用来实现。
同样很多运算符重载函数,以及拷贝构造函数等,也不宜使用指针做参数。
CExample *cpE = new CExample;
CExmaple& rcE = *cpE; 这种用法,作用不是很大,后遗症还不小;
因为动态分配的内存你总是希望释放的,释放后的指针可以再次分配一块内存;
但是C++的引用永远使用同一块内存(代表同一个对象)。
假如这块内存被释放,对他的引用就成了,野指针一样的东西。
不可能重新初始化,也不可能让他成为另一块内存(另一个对象)的引用了。
还没有办法像指针一样,设置为NULL。C++是没有NULL引用的。
这样出错以后和野指针出错一样难以查找。
所以一般不会这样用的!
#34
比用什么风格更重要的是在任何地方,任何时候都坚持用一种风格。
比爱哪种美眉更重要的是在任何地方,任何时候都坚持爱一个美眉。
比用指针好还是用引用好更重要的是在任何地方,任何时候都坚持用其中之一。
比爱姐姐好还是爱妹妹好更重要的是在任何地方,任何时候都坚持爱其中之一。
比爱哪种美眉更重要的是在任何地方,任何时候都坚持爱一个美眉。
比用指针好还是用引用好更重要的是在任何地方,任何时候都坚持用其中之一。
比爱姐姐好还是爱妹妹好更重要的是在任何地方,任何时候都坚持爱其中之一。
#35
不好意思,让你中枪了!讨论到现在,首先是差不多知道了引用和指针在哪些场合可以相互替代,而在实际的应用开发中更需要考虑在某种场合下适不适合替换,所以这里就做了更进一步的讨论了
#36
@赵老师 受教啦!清楚在哪些场合适合用引用的时候就坚持不用指针了,在哪些场合不适合用引用的时候就坚持用指针!
#37
策划,美工,主管,经理,老板,会把你所有的一切假设轰成渣 当你的函数定义是const T&的时候,你信心满满地告诉自己,这个是绝对不会变的。直到有一天在某个内层调用,你不得不调它的一个非const方法。。这个时候你会感谢有const_cast存在。。
有时候我就在想当年要是去建房子就好了,至少不会盖到一半说改就改
#38
在定义方法时将参数定义为传入和传出,这是为了让开发者清楚这个参数值应不应该被修改,如果说他非要去强制把常量变成可修改的,那么只要他能保证这样做没影响,那就OK,即使有影响,那这个也是他的责任了,
#39
我不会用引用写链表
#1
lz这个代码错了。
#2
引用有的时候替代不了指针
#3
引用代替不了指针的地方多了
#4
输入参数: const &
输出参数: *
输出参数: *
#5
指针即地址
引用即别名
电脑内存只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
引用即别名
电脑内存只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
#6
C++中引用类型和指针类型的灵活性一致,不论是赋值、转换还是对内存的管理方面,指针能做到的引用照样能做到。就比如对某对象的释放:
C/C++ code?1234class CExample;CExample cE;CExmaple& rcE = cE;delele &rcE;
而以指针类型作为传递,会多了一步空值判断操作,可读性也不如引用类型。我的想法……
不好意思,
class CExample;
CExample *cpE = new CExample;
CExmaple& rcE = *cpE;
delele &rcE;
这个是伪码,主要是为了说明使用引用类型也可以用来释放内存
#7
指针即地址
引用即别名
电脑内存只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画……
赵来师又在玩高深了。。
#8
引用有的时候替代不了指针
i know, 地址的移位、指针变量的重赋值,内存的灵活性管理,语言的通用性等等,这些都是引用替代不了的,但是指针有利有弊,其中指针的不安全性是出现软件崩溃的bug的罪魁祸首,如果每次在遇到指针都进行一次空值判断,这个真的是有点不情愿,首先我隐约感觉这个会影响性能,然后太繁杂了,假如一个方法定义了四五个传出参数而且都是指针类型,那这个方法在还没执行前就得加上10来行空值判断处理代码,这个是很头疼的问题,而引用就不存在这种问题
#9
我通常尽量用引用,只在确认必须用指针的地方才用指针。
#10
用地址吧。。。。。
#11
能用引用就引用
如果需要指向0,引用做不到
或者需要指向可变,引用也做不到
这些时候用指针
如果需要指向0,引用做不到
或者需要指向可变,引用也做不到
这些时候用指针
#12
其实我觉得最重要的还是在对代码进行实现前对各个功能模块进行分析,提取其中的通用模块,对通用模块接口进行设计时采用接口的语言兼容性原则继续设计,对于非通用模块,并且不与外部接口有直接调用关系时,则引用类型首选
#13
引用用. 指针用->
还是偏向引用。。
还是偏向引用。。
#14
有时候编译器会对你写出的代码做出优化,即使你传递的参数是值类型,如果类型过大,也会导致实际的调用会是引用调用,这个在微软编译器中是这样实现的,lz可以测试。
至少引用的这种属性,指针不会有的
至少引用的这种属性,指针不会有的
#15
指针可以为空,引用必须是有效的对象,一些时候参数是得允许指针为空的。
#16
有时候编译器会对你写出的代码做出优化,即使你传递的参数是值类型,如果类型过大,也会导致实际的调用会是引用调用,这个在微软编译器中是这样实现的,lz可以测试。
至少引用的这种属性,指针不会有的
引用的本质就是指针,只是引用相对指针做了更多的限制,只是感觉这利弊相抵,指针更灵活但不安全,引用更安全,但不灵活
#17
指针可以为空,引用必须是有效的对象,一些时候参数是得允许指针为空的。
说到底,还是指针的灵活性更高,给参数指针传NULL.可做默认处理,在另一方面又能体现多态的特性
#18
说到底什么时候该用引用,什么时候该用指针,这要看这个参数的具体应用场景
#19
CExmaple& rcE = *cpE; 不像C++代码;
这种代码是很受诟病的!
这种代码是很受诟病的!
#20
引用和指针是不可互相代替的。
数组通过引用就很不好用
动态分配也不会使用引用。
C++的引用,是通过常量指针实现的,是不可改变引用对象的。
而参数表中的指针也不能代替引用。
代替了会出现麻烦的!!
数组通过引用就很不好用
动态分配也不会使用引用。
C++的引用,是通过常量指针实现的,是不可改变引用对象的。
而参数表中的指针也不能代替引用。
代替了会出现麻烦的!!
#21
引用和指针是不可互相代替的。
数组通过引用就很不好用
动态分配也不会使用引用。
C++的引用,是通过常量指针实现的,是不可改变引用对象的。
而参数表中的指针也不能代替引用。
代替了会出现麻烦的!!
在适合的场合不排斥使用引用
#22
在C++中,我的原则是,能不用指针的地方,就不用指针。
所以,我的输入参数通常是IN const TYPE &,输出参数通常是 OUT TYPE &.
所以,我的输入参数通常是IN const TYPE &,输出参数通常是 OUT TYPE &.
#23
引用 14 楼 palm008 的回复:有时候编译器会对你写出的代码做出优化,即使你传递的参数是值类型,如果类型过大,也会导致实际的调用会是引用调用,这个在微软编译器中是这样实现的,lz可以测试。
至少引用的这种属性,指针不会有的
引用的本质就是指针,只是引用相对指针做了更多的限制,只是感觉这利弊相抵,指针更灵活但不安全,引用更安全,但不灵活
第一句就理解错误。
#24
引用 2 楼 lianshaohua 的回复:引用有的时候替代不了指针
i know, 地址的移位、指针变量的重赋值,内存的灵活性管理,语言的通用性等等,这些都是引用替代不了的,但是指针有利有弊,其中指针的不安全性是出现软件崩溃的bug的罪魁祸首,如果每次在遇到指针都进行一次空值判断,这个真的是有点不情愿,首先我隐约感觉这个会影响性能,然后太繁杂了,假如一个方法定义了四……
地址的移位,用引用,需要的时候取地址,照样可以操作,
指针变量的重赋值,这应该是指针的引用或二级指针才有用,单个指针传进函数对指针变量重赋值好像不起作用吧。
#25
#26
引用代替不了指针的地方多了
说个例子看看
#27
学习学习楼上多位高手
#28
至少引用的这种属性,指针不会有的
引用的本质就是指针,只是引用相对指针做了更多的限制,只是感觉这利弊相抵,指针更灵活但不安……
第一句就理解错误。
@飞天御剑流
请指教!!
#29
地址的移位,用引用,需要的时候取地址,照样可以操作,
指针变量的重赋值,这应该是指针的引用或二级指针才有用,单个指针传进函数对指针变量重赋值好像不起作用吧。
对引用类型取址是可以达到移位的效果,但是正如 @Im_whales 所说,这种关于对引用的取址是很诟病的。指针作为传出参数,它在方法中能改变的是它所指向的地址中存储的值
#30
引用 23 楼 supermegaboy 的回复:至少引用的这种属性,指针不会有的
引用的本质就是指针,只是引用相对指针做了更多的限制,只是感觉这利弊相抵,指针更灵活但不安……
第一句就理解错误。
@飞天御剑流
请指教!!
很多编译器将引用实现为指针,但是实现归实现,本质归本质,两者不可混淆。引用的本质是内存模型中的实体的指示器,外在表现形式是别名。
C和C++提供了多种指示实体的方法,designator和指针是两者共有的,而C++多了引用。
#31
引用 24 楼 dahuaixiaohuai 的回复:地址的移位,用引用,需要的时候取地址,照样可以操作,
指针变量的重赋值,这应该是指针的引用或二级指针才有用,单个指针传进函数对指针变量重赋值好像不起作用吧。
对引用类型取址是可以达到移位的效果,但是正如 @Im_whales 所说,这种关于对引用的取址是很诟病的。指针作为传出参数,它在方法中能改变的是它所指向的地址……
诟病不代表起不到同样的效果
另:指针作为传出参数,它在方法中能改变的是它所指向的地址中存储的值 ,引用同样可以改变所引用对象的值,这两者的效果有什么不一样吗??
#32
引用 24 楼 dahuaixiaohuai 的回复:地址的移位,用引用,需要的时候取地址,照样可以操作,
指针变量的重赋值,这应该是指针的引用或二级指针才有用,单个指针传进函数对指针变量重赋值好像不起作用吧。
对引用类型取址是可以达到移位的效果,但是正如 @Im_whales 所说,这种关于对引用的取址是很诟病的。指针作为传出参数,它在方法中能改变的是它所指向的地址……
大家讨论的是能不能替代的问题,用法好不好看和这个主题没有关系吧。
#33
指针本身是可以改变的
指针可以指向数组,也可以指向单一变量。
引用是所谓的别名,代表对象本身,引用所代表的对象是不可替换的。
一个引用(作为函数参数除外)不可以代表另外一个对象。
一个没有初始化的引用是无用的;
一个没有初始化的指针,可以随时赋值。
所以各有各的用处,是不可互相替代的。
比如你要是想一个做vector这样的类,就不好使用引用来实现。
同样很多运算符重载函数,以及拷贝构造函数等,也不宜使用指针做参数。
CExample *cpE = new CExample;
CExmaple& rcE = *cpE; 这种用法,作用不是很大,后遗症还不小;
因为动态分配的内存你总是希望释放的,释放后的指针可以再次分配一块内存;
但是C++的引用永远使用同一块内存(代表同一个对象)。
假如这块内存被释放,对他的引用就成了,野指针一样的东西。
不可能重新初始化,也不可能让他成为另一块内存(另一个对象)的引用了。
还没有办法像指针一样,设置为NULL。C++是没有NULL引用的。
这样出错以后和野指针出错一样难以查找。
所以一般不会这样用的!
指针可以指向数组,也可以指向单一变量。
引用是所谓的别名,代表对象本身,引用所代表的对象是不可替换的。
一个引用(作为函数参数除外)不可以代表另外一个对象。
一个没有初始化的引用是无用的;
一个没有初始化的指针,可以随时赋值。
所以各有各的用处,是不可互相替代的。
比如你要是想一个做vector这样的类,就不好使用引用来实现。
同样很多运算符重载函数,以及拷贝构造函数等,也不宜使用指针做参数。
CExample *cpE = new CExample;
CExmaple& rcE = *cpE; 这种用法,作用不是很大,后遗症还不小;
因为动态分配的内存你总是希望释放的,释放后的指针可以再次分配一块内存;
但是C++的引用永远使用同一块内存(代表同一个对象)。
假如这块内存被释放,对他的引用就成了,野指针一样的东西。
不可能重新初始化,也不可能让他成为另一块内存(另一个对象)的引用了。
还没有办法像指针一样,设置为NULL。C++是没有NULL引用的。
这样出错以后和野指针出错一样难以查找。
所以一般不会这样用的!
#34
比用什么风格更重要的是在任何地方,任何时候都坚持用一种风格。
比爱哪种美眉更重要的是在任何地方,任何时候都坚持爱一个美眉。
比用指针好还是用引用好更重要的是在任何地方,任何时候都坚持用其中之一。
比爱姐姐好还是爱妹妹好更重要的是在任何地方,任何时候都坚持爱其中之一。
比爱哪种美眉更重要的是在任何地方,任何时候都坚持爱一个美眉。
比用指针好还是用引用好更重要的是在任何地方,任何时候都坚持用其中之一。
比爱姐姐好还是爱妹妹好更重要的是在任何地方,任何时候都坚持爱其中之一。
#35
大家讨论的是能不能替代的问题,用法好不好看和这个 主题没有关系吧。
不好意思,让你中枪了!讨论到现在,首先是差不多知道了引用和指针在哪些场合可以相互替代,而在实际的应用开发中更需要考虑在某种场合下适不适合替换,所以这里就做了更进一步的讨论了
#36
@赵老师 受教啦!清楚在哪些场合适合用引用的时候就坚持不用指针了,在哪些场合不适合用引用的时候就坚持用指针!
#37
其实我觉得最重要的还是在对代码进行实现前对各个功能模块进行分析,提取其中的通用模块,对通用模块接口进行设计时采用接口的语言兼容性原则继续设计,对于非通用模块,并且不与外部接口有直接调用关系时,则引用类型首选
策划,美工,主管,经理,老板,会把你所有的一切假设轰成渣 当你的函数定义是const T&的时候,你信心满满地告诉自己,这个是绝对不会变的。直到有一天在某个内层调用,你不得不调它的一个非const方法。。这个时候你会感谢有const_cast存在。。
有时候我就在想当年要是去建房子就好了,至少不会盖到一半说改就改
#38
在定义方法时将参数定义为传入和传出,这是为了让开发者清楚这个参数值应不应该被修改,如果说他非要去强制把常量变成可修改的,那么只要他能保证这样做没影响,那就OK,即使有影响,那这个也是他的责任了,
#39
引用代替不了指针的地方多了
说个例子看看