迷惑不解,请教了

Pengcheng2006 2003-09-12 08:24:38
我知道“&”是取地址,如p=&data,则p指向了变量data。但下面的两个函数声明我不理解,请高手指教,请讲的通俗一些,详细一些,便于理解,谢谢了:

(1)CType& Function( ) //不理解,但CType* Function( )我理解;

(2)CType1 Function(CType2 &var ) // 不理解,但CType1 Function(CType2 *var )我理解。
...全文
28 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
guankaifu 2003-09-12
  • 打赏
  • 举报
回复
我写错了。。(1)的例子应该是int &nVal1=nVal1;
guankaifu 2003-09-12
  • 打赏
  • 举报
回复
引用是这样定义的:引用型变量是一种不具备自己的实际数据保存空间的变量,它的实质仍然是指针,但引用型变量采用了不同于指针的表示方式。使用引用型变量可以简化对函数有多个返回值时的处理,使得程序清晰明了。(也就是说,是2个不同名字的变量使用同一个地址空间。)
原形:数据类型& 变量名=相同数据类型的变量;
例:int& nVal1=nVal2
nVal1与nVal2同为int型。。使用同一个地址。。对nVal1的操作就是对nVal2的操作。如
nVal2=8;
nVal1=3;
那么,MessageBox(int(nVal2));的输出值也为3;
这就是引用的实质。上面提到的问题是这样的。
1)CType& Function( ) 引用的方式不太正规基本属于错误,可是语法不算错误。结果没测试过。大概应该返回的是函数本身。也就是自己引用了自己。。就如同这个简单的例子。 int &nVal1=nVal2
(2)CType1 Function(CType2 &var ) 他其实是对函数本身的参数的引用。
也就是对函数原形的参数的引用,简单理解为Functiong(CType2 x)
CType2 &var=x;

我是一个打了一年基础的垃圾程序员,呵。。希望我们共同学习。。共同进步。
希望我的讲解能给你带来方便。。
zp2126 2003-09-12
  • 打赏
  • 举报
回复
void ReturnNum1(int a)
{
a=10;
}
void ReturnNum2(int &a)
{
a=10;
}
//////////////////////
....
int b;
b=5;
ReurnNum1(b);
//函数运行后b=5;这种方式下相当于int a;a=b;a=10;
ReturnNum2(b);
//函数运行后b=10;这种方式下,a与b完全一样,a=10;相当于b=10;



Pengcheng2006 2003-09-12
  • 打赏
  • 举报
回复
哦。m_rectBounding是在函数GetBoundingRect()的外面定义的:CRect m_rectBounding;
Pengcheng2006 2003-09-12
  • 打赏
  • 举报
回复
回并问楼上:

(1)CType& Function( ) 我是仿照书上写的,书上的是:CRect& GetBoundingRect(){return m_rectBounding;}。那么为什么说是错误的?另外他返回了哪一个局部变量的引用?请指教,谢谢。

Viconia 2003-09-12
  • 打赏
  • 举报
回复
说错了
(1)里面如果师返回一个在之前定义的引用,还是正确的。如果没有,就是错的
Viconia 2003-09-12
  • 打赏
  • 举报
回复
(1)这种用法本身就是错误的,返回了一个局部变量的引用

(2)调用Function(x);
函数中对VAR的操作都等于对X的操作
Pengcheng2006 2003-09-12
  • 打赏
  • 举报
回复
引用楼上“你可以把“引用”理解为被引用变量的别名,所有对引用的操作都等于对被引用变量的操作”续问————

那么:(1)函数“CType& Function( ) ”返回了哪个变量的引用了呢?

(2)函数“CType1 Function(CType2 &var ) ”传递了哪个变量的引用了呢?

请指教,谢谢。
Viconia 2003-09-12
  • 打赏
  • 举报
回复
你可以把“引用”理解为被引用变量的别名,所有对引用的操作都等于对被引用变量的操作
Pengcheng2006 2003-09-12
  • 打赏
  • 举报
回复
究竟什么是“引用”?“引用”是什么东西?
Pengcheng2006 2003-09-12
  • 打赏
  • 举报
回复
的确,我在C++书里看到“引用”字样,但只是一提,连三行字都不到,所以我没有理解。我发此贴就是想请朋友们给我讲的再明白些,再详细些,使我能够理解了。谢谢了。
zswzwy 2003-09-12
  • 打赏
  • 举报
回复
1、表示反回Ctype的引用
2、要传递引用
Caps77 2003-09-12
  • 打赏
  • 举报
回复
&在c里只有取地址的意思,但在c++和vc里还有引用的意思
whoishere 2003-09-12
  • 打赏
  • 举报
回复
&还可以表示引用!
Pengcheng2006 2003-09-12
  • 打赏
  • 举报
回复
哦,说错了:
VC6要求 不用语句int var;但参数表中要求有说明符int,:
int Function(int var)
{

...;
}
Pengcheng2006 2003-09-12
  • 打赏
  • 举报
回复
我知道要包含文件 #include "stdio.h",不是这个原因。
原因是VC6不允许这样定义函数:
int Function(var)
int var;
{
...;
}
VC6要求将int var;放入{ }中:
int Function(var)
{
int var;
...;
}
因此,以前的C程序不能移植到VC6中了。
guankaifu 2003-09-12
  • 打赏
  • 举报
回复
printf(var);关键在这里。。
printf()这是c 里面的。。不是 vc++里面的。。所以不支持。。
但是。。在vc++中是可以实现的。。
在c中这个程序用到了一个头文件。。
你只需要把他的名字+上.c包含在你的vc++的头文件里就可以了。
记得要声明std::函数名
Pengcheng2006 2003-09-12
  • 打赏
  • 举报
回复
谢谢。

顺便问一下:VC6好象不支持以前的C语言呀,如:在C语言中,下面的函数定义是正确的
int Function(var)
int var;
{
printf(var);
return 0;
}

但在C++中却是错误的,为什么?
guankaifu 2003-09-12
  • 打赏
  • 举报
回复
呵。。对一个简单的程序是这样的。。不过对复杂的结构他有自己的用处。。
比如可以节省文件的行数。。可以进行代码优化。。执行速度的问题。。
一个功能有多种写法是有他存在的意义的。。

在有。。单纯的定义2个变量的引用和定义在函数说明中变量的引用是不同的。。
占用的返回地址的空间效果是不一样的。。
Pengcheng2006 2003-09-12
  • 打赏
  • 举报
回复
非常感谢楼上的朋友给我讲得这么详细,读完你的回复,我已经完全明白了第(2)种的引用形式;对于第(1)种的引用形式还有一点模糊。

另外,我说一点意见,我觉得引用就是解决了函数的传址问题,其实完全可以用1nt* var这种容易理解的形式代替引用。VB中,有ByVal var和ByRef var来表示传值和传址,我觉得是光辉的典范。而C++就显得烦琐了。

16,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧