游戏开发论坛

 找回密码
 立即注册
搜索
查看: 6247|回复: 12

常量问题

[复制链接]

125

主题

364

帖子

396

积分

中级会员

Rank: 3Rank: 3

积分
396
QQ
发表于 2006-11-6 09:15:00 | 显示全部楼层 |阅读模式
今天在Ogre里看到这样的话,

const RenderTarget::FrameStats& stats = mWindow->getStatistics();

语句在 updateStates里实时调用。

问下斑竹,stats是常量,为什么还被二次赋值。

是因为下次调用又重新分配新常量吗?  谢谢回答。

8

主题

716

帖子

716

积分

高级会员

Rank: 4

积分
716
发表于 2006-11-6 10:08:00 | 显示全部楼层

Re:常量问题

stats属于函数体内的局部变量,分配在栈上,生命周期为所属的{}内,通常就是函数体内。
你可以这样理解const变量:在该变量生命期内,不允许二次赋值。
但是一旦函数调用完毕,所有局部变量也全部被销毁,所以是正常的。

另外,const除了起到优化的作用外(例如const字符串会被compiler放到一个const string pool中),通常也可以视作一种良好的编码规范。毕竟说穿了它只是一块内存而已,你非要逆天而行使用const_cast,compiler自然也由得你去,关键在于,你要清楚你在做什么以及对你的行为负责。

125

主题

364

帖子

396

积分

中级会员

Rank: 3Rank: 3

积分
396
QQ
 楼主| 发表于 2006-11-6 14:07:00 | 显示全部楼层

Re:常量问题

非常感谢。

125

主题

364

帖子

396

积分

中级会员

Rank: 3Rank: 3

积分
396
QQ
 楼主| 发表于 2006-11-6 15:03:00 | 显示全部楼层

Re:常量问题

const_cast  为什么不能 转换 非指针的 const 变量?

8

主题

716

帖子

716

积分

高级会员

Rank: 4

积分
716
发表于 2006-11-6 15:27:00 | 显示全部楼层

Re:常量问题

const int x = 1;
int &y = const_cast<int &>(x);
y = 2;

注意,这是矛盾的,如果你要改它,那又为什么要用const修饰它呢,这里面一定有问题.

125

主题

364

帖子

396

积分

中级会员

Rank: 3Rank: 3

积分
396
QQ
 楼主| 发表于 2006-11-6 17:20:00 | 显示全部楼层

Re:常量问题

虽然 这样的转换 可以编译通过, 但是我目前的经验想不出这样的转换有何意义。

如果想得到 x 的值,可以直接给 y 就可以了。

而且 int &y = const_cast<int&>(x);  仅仅是临时的转换一下。

我若这么写  也是不对的。
x = const_cast<int>(x);

8

主题

716

帖子

716

积分

高级会员

Rank: 4

积分
716
发表于 2006-11-6 18:14:00 | 显示全部楼层

Re:常量问题

好的设计,是不应该看到const_cast的

C++提供了多种手段达到目的,招无定式,让你可以适应各种情况
现在不用太明白,留个映象好了,等碰到就知道怎么办了
书到用时方恨少

9

主题

198

帖子

198

积分

注册会员

Rank: 2

积分
198
发表于 2006-11-7 00:17:00 | 显示全部楼层

Re: 常量问题

shaoxiaoning: 常量问题

今天在Ogre里看到这样的话,

const RenderTarget::FrameStats& stats = mWindow->getStatistics(...

这里的stats并没有二次赋值,stats是一个引用,个人认为作者在这个函数内需要mWindow的statistic,而且防止意外对mWindow的statistics修改。

1

主题

6

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2006-11-8 07:52:00 | 显示全部楼层

Re: 常量问题

stats是变量吧??

125

主题

364

帖子

396

积分

中级会员

Rank: 3Rank: 3

积分
396
QQ
 楼主| 发表于 2006-11-9 12:51:00 | 显示全部楼层

Re: 常量问题

又一个常量相关的。

我封装一个和 CString 有关的函数。

如  void  chartoCString(const CString *cstr, char* result);

我在使用的时候, 如果 加上const 在调用 cstr->GetBuffer
的时候 就总会出现个 ATL 函数怎么怎么样

如 e:\src\mycom\MFCConver\MFCConver\MFCConver.cpp(25): error C2663: “ATL::CSimpleStringT<BaseType,t_bMFCDLL>::GetBuffer” : 2 个重载没有“this”指针的合法转换
        with
        [
            BaseType=char,
            t_bMFCDLL=true
        ]

而去掉 const 就好了。

我的问题是, 我想通过 const 保护CString 类型的指针指向的内容。
而 CString不让我保护,  有什么办法,

我想到的第一个办法是 引用,  还请斑竹指点。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-2-27 16:25

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表