const int *const& p = &ci;的理解
来源:互联网 发布:ubuntu软件中心装fcitx 编辑:程序博客网 时间:2024/05/19 03:43
const int i =0;
const int *const& p = &i;
这样理解吧,&ival就像函数返回值一样,
建立一个临时对象,类型是int *,而C++的临时对象都是const的
所以&ival的完整类型是int *const;
这样一个 int *const的引用的类型是int * const&;
接着ival是const对象,
所以一个前置的const来说明
得到const int * const &
测试代码
int main()
{
int i;
int *p1 = &i;
int *const& cri = &i; //ok
// int *& ri = &i; //err,cannot convert from 'int *' to 'int *& ' ,A reference that is not to 'const' cannot be bound to a non-lvalue
int *& ri = p1;
const int ii = 0;
// int *const&crii = ⅈ //err,cannot convert from 'const int *' to 'int *const & ',Reason: cannot convert from 'const int *' to 'int *const '
const int *const& crii = ⅈ //ok
const int *pp = ⅈ
const int *&rii = pp;
return 0;
}
回复人:taodm(taodm) ( ) 信誉:100 2006-12-28 8:58:05 得分:0 ?
引用必须加在(有名)变量身上。
&ival呢,是一个结果为指针类型的表达式,或者说,得到一个指针类型的临时变量(无名变量)。
C++于是补充规定:非const引用必须加在有名变量身上,const引用可以加在无名变量身上。
回复人:jixingzhong(瞌睡虫·星辰) ( ) 信誉:102 2006-12-28 9:29:01 得分:0 ?
const int *const(!!) &pi_ref=&ival;
请注意 !! 标注的 const,
它的作用是,
说明 pi_ref 这个引用是 常量的引用 !!
常量的引用,
表明其引用的对象是常量,
那么无法通过这个 引用 pi_ref 去修改 被引用的 &ival 的值
(因为是常量, 无法修改)
一个非常量可以被一个 常量引用 所引用,
这个是可以的, 因为操作权限是缩小的, 不会带来严重的问题;
但是反过来就不行, 可能会是非法操作 ~~ 回复人:nsdcomputer() ( ) 信誉:100 2006-12-28 11:13:04 得分:0 ?
const int *const& p = &i;
这样理解吧,&ival就像函数返回值一样,
建立一个临时对象,类型是int *,而C++的临时对象都是const的
所以&ival的完整类型是int *const;
这样一个 int *const的引用的类型是int * const&;
接着ival是const对象,
所以一个前置的const来说明
得到const int * const &
测试代码
int main()
{
int i;
int *p1 = &i;
int *const& cri = &i; //ok
// int *& ri = &i; //err,cannot convert from 'int *' to 'int *& ' ,A reference that is not to 'const' cannot be bound to a non-lvalue
int *& ri = p1;
const int ii = 0;
// int *const&crii = ⅈ //err,cannot convert from 'const int *' to 'int *const & ',Reason: cannot convert from 'const int *' to 'int *const '
const int *const& crii = ⅈ //ok
const int *pp = ⅈ
const int *&rii = pp;
return 0;
}
回复人:taodm(taodm) ( ) 信誉:100 2006-12-28 8:58:05 得分:0 ?
引用必须加在(有名)变量身上。
&ival呢,是一个结果为指针类型的表达式,或者说,得到一个指针类型的临时变量(无名变量)。
C++于是补充规定:非const引用必须加在有名变量身上,const引用可以加在无名变量身上。
回复人:jixingzhong(瞌睡虫·星辰) ( ) 信誉:102 2006-12-28 9:29:01 得分:0 ?
const int *const(!!) &pi_ref=&ival;
请注意 !! 标注的 const,
它的作用是,
说明 pi_ref 这个引用是 常量的引用 !!
常量的引用,
表明其引用的对象是常量,
那么无法通过这个 引用 pi_ref 去修改 被引用的 &ival 的值
(因为是常量, 无法修改)
一个非常量可以被一个 常量引用 所引用,
这个是可以的, 因为操作权限是缩小的, 不会带来严重的问题;
但是反过来就不行, 可能会是非法操作 ~~
上面的代码不算!!
下面的结论表面上看是正确的,其实追究到内存,它是错误的!!!!!
临时变量如果被绑定给(cosnt)引用,那么它就将不再是临时变量了,它将拥有和那个引用同样长的生存期。
这是由于引用的特殊性!!
这里再罗嗦一下引用的实质:
引用是一个特殊的指针;它是要占用内存的;由于它的特性,我们可以把它看成变量的别名
请看:
3: int i=0;
00401028 mov dword ptr [ebp-4],0
4: int &p=i;
0040102F lea eax,[ebp-4]
00401032 mov dword ptr [ebp-8],eax
证明:
请看下面的例子:
#include<iostream.h>
int a=2;
void test()
{
const int &p=a;
cout<<"&p= "<<&p<<endl;
}
void test2()
{
test();
int kkk=2;
cout<<"&kkk= "<<&kkk<<endl;
}
void main()
{
test2(); //(1)
test(); //(2)
}
执行到语句(1)中的 test() 中的下面语句时
5: const int &p=a;
内存显示如下:
00401068 mov dword ptr [ebp-4],offset a (00428d50) //其中 ebp=0x0012FED4
执行到语句(1)中的
5: const int &p=a;
内存显示如下:
00401068 mov dword ptr [ebp-4],offset a (00428d50) //其中 ebp=0x0012FF2C
显然 两个dword ptr [ebp-4], 是不一样的!!!!
故得出结论: const int& 型的变量的生存周期与普通变量的是一样的!!!
为什么 6楼说的,表面上看是正确的呢?
这正是由于 引用 的特殊性!!!
例如: const int &p=a; (我提供的例子中的 test() 中的语句)
当你用cout 输出 &p 时,输出的是 全局变量a 的地址,而不是 p 的地址,这就是 引用 的特殊性;
故为了方便 我们可以像 6楼说的那样理解, 但是如果要精益求精的话,我建议最好想我这样理解
本人经验有限,如有错误,欢迎提出
下面的结论表面上看是正确的,其实追究到内存,它是错误的!!!!!
临时变量如果被绑定给(cosnt)引用,那么它就将不再是临时变量了,它将拥有和那个引用同样长的生存期。
这是由于引用的特殊性!!
这里再罗嗦一下引用的实质:
引用是一个特殊的指针;它是要占用内存的;由于它的特性,我们可以把它看成变量的别名
请看:
3: int i=0;
00401028 mov dword ptr [ebp-4],0
4: int &p=i;
0040102F lea eax,[ebp-4]
00401032 mov dword ptr [ebp-8],eax
证明:
请看下面的例子:
#include<iostream.h>
int a=2;
void test()
{
const int &p=a;
cout<<"&p= "<<&p<<endl;
}
void test2()
{
test();
int kkk=2;
cout<<"&kkk= "<<&kkk<<endl;
}
void main()
{
test2(); //(1)
test(); //(2)
}
执行到语句(1)中的 test() 中的下面语句时
5: const int &p=a;
内存显示如下:
00401068 mov dword ptr [ebp-4],offset a (00428d50) //其中 ebp=0x0012FED4
执行到语句(1)中的
5: const int &p=a;
内存显示如下:
00401068 mov dword ptr [ebp-4],offset a (00428d50) //其中 ebp=0x0012FF2C
显然 两个dword ptr [ebp-4], 是不一样的!!!!
故得出结论: const int& 型的变量的生存周期与普通变量的是一样的!!!
为什么 6楼说的,表面上看是正确的呢?
这正是由于 引用 的特殊性!!!
例如: const int &p=a; (我提供的例子中的 test() 中的语句)
当你用cout 输出 &p 时,输出的是 全局变量a 的地址,而不是 p 的地址,这就是 引用 的特殊性;
故为了方便 我们可以像 6楼说的那样理解, 但是如果要精益求精的话,我建议最好想我这样理解
本人经验有限,如有错误,欢迎提出
- const int *const& p = &ci;的理解
- const指针,const int * p, int *const p,int const * p的区别
- const int *p、int *const p、const int* const p的区别
- 题目二:const int *p,const * int p,int const *p的区别还有int const *const p
- (const int *p)、(int const *p)、(int *const p)、(const int *const p)的区别
- int *p,cons int *p,int const *p,int * const p,const int * const p,int const * const p的区别
- const int *p与int *const p的区别
- const int * p与int *const p的详解
- const int *p与int *const p的区别
- const int *p 和 int* const p 的区别详解
- const int *p与int * const p的区别
- const int* p与int *const p的区别
- const int *p与int *const p的区别
- const int *p与int *const p的区别
- const int *p, int *const p的区别
- const int *p与int *const p的区别
- const int *p与int *const p的区别
- 关于const int *p与 int *const p的区别
- 初学ASP.NET-开发WEB后台管理程序
- 文本框替换函数
- 常用log4j配置说明
- 在按钮上绑定数据及事件
- 知情权
- const int *const& p = &ci;的理解
- 挂在嘴边的实用英语句子
- 查看mysql基本信息的命令
- 地震引发的网络关系简化论
- 交接班
- C++和C的不同点
- MIPS处理器 你了解多少?[1]
- SOA到底是什么?
- 看了博客之后