注册 登录
编程论坛 C++教室

一个函数带来的三个疑惑!

lixang 发布于 2007-02-11 11:22, 1047 次点击
请大家仔细看下面一模一样的两个函数:
再看此函数前,请勿怀疑下面的函数本身有任何问题:

link_type & root() const
{ 问题1:
return (link_type&) header->parent; //(link_type&) 我猜是类型转化,不知道那位朋友能给点说法?
}

问题2:
link_type & root() const //const说明此函数为只读形式,其返回值不能被修改!
{ //link_type & 说明次函数返回值可以作为左值,即其返回值能被修改!
return (link_type&) header->parent; // 这样他们自相矛盾了!
}


再看下面对这个函数的调用:(请勿怀疑对此函数的调用上出了问题)
root()=0; 问题3:请大家给点看法?

[此贴子已经被作者于2007-2-11 11:24:59编辑过]

14 回复
#2
song42007-02-11 18:09
以下是引用lixang在2007-2-11 11:22:28的发言:
请大家仔细看下面一模一样的两个函数:
再看此函数前,请勿怀疑下面的函数本身有任何问题:

link_type & root() const
{ 问题1:
return (link_type&) header->parent; //(link_type&) 我猜是类型转化,不知道那位朋友能给点说法?
} 1。我估计是子类象基类转换,返回一个基类的引用来引用这个子类的根

问题2:
link_type & root() const //const说明此函数为只读形式,其返回值不能被修改!
{ //link_type & 说明次函数返回值可以作为左值,即其返回值能被修改!
return (link_type&) header->parent; // 这样他们自相矛盾了!
}//2。这个const 只是说明这个函数内不能改变,返回值不属于那个范围
你说的情况是这样、 const link_type & root(),这样返回值才是不能改


再看下面对这个函数的调用:(请勿怀疑对此函数的调用上出了问题)
root()=0; 问题3:请大家给点看法?
这个有什么问题么 让该函数的this 的根为0

#3
lixang2007-02-12 13:43
song4 你好:
谢谢你的指点
下面我还是有点疑虑:
link_type & root() const
{
return (link_type&) header->parent;
}
这个const 只是说明这个函数内不能改变,返回值不属于那个范围 。
函数内不能改变?是指函数内的定义不能改变么?还是。。。
我不大名白?能否给我详细指点以下!
万分感激!

[此贴子已经被作者于2007-2-12 13:44:49编辑过]

#4
踏魔狼2007-02-12 14:55
link_type & root() const
{
return (link_type&) header->parent;
}
header->parent在这个函数内不能改变,在这个函数之外吗就可以改变.
所以这个函数不会如你所说的自相矛盾.
#5
lixang2007-02-13 12:08
以下是引用踏魔狼在2007-2-12 14:55:38的发言:
link_type & root() const
{
return (link_type&) header->parent;
}
header->parent在这个函数内不能改变,在这个函数之外吗就可以改变.
所以这个函数不会如你所说的自相矛盾.

link_type & root() const //有const限定
{
return (link_type&) header->parent;
}
link_type & root() //无const限定
{
return (link_type&) header->parent;
}

第一个函数有const限定 函数内容 :return (link_type&) header->parent
第二个函数无const限定 函数内容 :return (link_type&) header->parent;
他们都是函数的内容,区别在那里呢?
能否说明:谢谢!

[此贴子已经被作者于2007-2-13 12:08:57编辑过]

#6
踏魔狼2007-02-13 16:07
无const可以这样
link_type & root() //无const限定
{
header->parent = header->Next; // 当然我假设这样是有效的
return (link_type&) header->parent;
}

有const不可以这样,想这样只能在函数以外.
#7
lixang2007-02-14 11:58
以下是引用踏魔狼在2007-2-13 16:07:15的发言:
无const可以这样
link_type & root() //无const限定
{
header->parent = header->Next; // 当然我假设这样是有效的
return (link_type&) header->parent;
}

有const不可以这样,想这样只能在函数以外.
你的意思是说有const限定的函数不能写成下面的形式么?

link_type & root() const //有const限定
{
header->parent = header->Next; // 当然我假设这样是有效的
//但是我感觉到函数体内的语句是可以随意由自己定义的
//为何就不能多写一行 header->parent = header->Next;呢?
//我实在想不通,真希望能得到你的解释?
return (link_type&) header->parent;
}

#8
song42007-02-16 13:06
CONST 写在函数后面
表明这个函数体内不可以改变任何参数
写在函数头表明返回值不能改变
也就是说不能用返回值来接受其他东西
写在参数地方表示该参数不能变

多看书
#9
lixang2007-02-19 11:56
link_type & root() const
{
return (link_type&) header->parent;
}
link_type & root() const
{
return (link_type) header->parent;
}
请教着两个函数的区别?
#10
song42007-02-19 23:04
一个是返回该HEAD的引用
一个是返回与HEAD指象同一个的无名对象
#11
lixang2007-02-20 12:39
song4:
谢谢你新年忙碌中帮助我:
也谢谢你去年的帮忙:

首先给你拜个年,祝愿你新年万事如意:

以下是引用song4在2007-2-19 23:04:20的发言:

一个是返回该HEAD的引用
//link_type & root() const {return (link_type&) header->parent; }
//我觉得没必要,因函数声名有引用返回
//应该返回一个全局的变量
//不然 引用{返回引用}另个引用嵌套在一起真没见过!
// 不如引用{返回全局变量}
//link_type & root() const
一个是返回与HEAD指象同一个的无名对象
//link_type & root() const {return (link_type) header->parent; }
//无名对象是不是临时对象,如果是那么就错误了


#12
song42007-02-20 16:46
你就看这个&就是引用
别的什么也不是,至于&&我也没见过,不过是真没必要

2.这个没有 名字,是无名,临时的,是临时
#13
lixang2007-03-05 17:53
song4:
你好:谢谢你的帮助!
对与你在2楼的回复中我有如下疑惑:
(选子侯杰STL源玛剖析—219页大概页中)
link_type & root() const
{ 问题1:
return (link_type&) header->parent; //(link_type&) 我猜是类型转化,不知道那位朋友能给点说法?
} //你的猜想 1。我估计是子类象基类转换,返回一个基类的引用来引用这个子类的根

再看了书:我发现header->parent=0
或者header->parent指的就是一个link_type类型,
既然这样那么直接 return header->parent;
为何还要 return (link_type&) header->parent;
岂不多此一举!
所以希望指点:

#14
wfpb2007-03-05 20:39

LZ,估计你是误解他们的意思了.

const函数的两种形式:
1、const declaration形如:const int func(int p); 表示返回值是一个r-value
2、member-function const形如:int MyClass::func(int p) const; func函数中不能对MyClass的数据成员做修改或赋值。

当然,上面的参数都是可选的,与语法没有关系。

mem-function const 与 mem-function的区别在于能对MyClass的数据成员做修改或赋值。

link_type & root() const
{
return (link_type&) header->parent;
}
这里header应该是类中的数据成员吧?
有const在末尾表示不能对它修改.

(link_type&)是类型转换.
这里没有修改header;而是把header->parent的值返回出去。


link_type & root() const
{
return (link_type&) header->parent;
}
link_type & root() const
{
return (link_type) header->parent;
}
请教着两个函数的区别?

第一个函数编译正确,第2个编译错误.
float & f(int a)//返回类型不匹配时,若为引用则类型转换也要加&
{
return (float&)a;
}
int & f(int a) //匹配时不用转换
{
return a;
}

#15
lixang2007-03-05 21:18
谢谢:
你的不停的帮助
你的帮助对我太有用拉!


1