社区
C++ 语言
帖子详情
请问const成员到底优势在哪里??
RabbitLBJ
2011-12-18 08:43:05
看D3D里面这样定义的一个运算符重载
FLOAT& operator () ( UINT Row, UINT Col );
FLOAT operator () ( UINT Row, UINT Col ) const;
是不是因为第二个函数为const,所以不能将返回值定义为引用类型,否则可以在外部修改内部信息??
但是这样做有什么意义呢??仅仅是速度更快逻辑更清晰吗??
谢谢
...全文
247
15
打赏
收藏
请问const成员到底优势在哪里??
看D3D里面这样定义的一个运算符重载 FLOAT& operator () ( UINT Row, UINT Col ); FLOAT operator () ( UINT Row, UINT Col ) const; 是不是因为第二个函数为const,所以不能将返回值定义为引用类型,否则可以在外部修改内部信息?? 但是这样做有什么意义呢??仅仅是速度更快逻辑更清晰吗?? 谢谢
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
小清新爱大光明
2011-12-19
打赏
举报
回复
this指针原型本来就是XX * const this, 成员函数后加const就意味着const XX * const this.
常量成员函数当然可以返回引用,不过一定要返回const XX &
对象
2011-12-19
打赏
举报
回复
const函数会把this隐式转成const this。非const变量可以调用const函数,而const变量不可调用非const函数。
const的作用用一句话总结就是:让程序更安全。
tempname1008
2011-12-18
打赏
举报
回复
在大规模的程序排错中就可以体会到
良好的编程风格和习惯是很有帮助的
const有助于避免一些难以调试的错误
c87527124
2011-12-18
打赏
举报
回复
c++ primer 有说,我忘了。
qscool1987
2011-12-18
打赏
举报
回复
是不是因为第二个函数为const,所以不能将返回值定义为引用类型,否则可以在外部修改内部信息??
这是本质原因,不想让外部通过这个接口修改内部的数据的话,这么定义是很有必要地,因为用户的操作不可预料,保不准就在外部错用了,导致对象内部数据发生变化,然而这种变化又很难发现出来,因为编译不会报错,但是你要是加个const那就不一样了,只要在外部用户改了,编译器立马报错,这样就能发现问题,用户就会更正使用错误。这就使得程序更加健壮了。
在effective C++里面提到过 你可以用在一切地方加上const,当然用些地方还是要修改某些东西,但是这些地方编译器会报出来,你可以定位到地方然后把const去掉就行了
游戏设计师
2011-12-18
打赏
举报
回复
[Quote=引用 7 楼 dyangrun 的回复:]
引用 6 楼 dyangrun 的回复:
当使用在 = 运算符右边的时候调用的是FLOAT operator () ( UINT Row, UINT Col ) const;
返回值不同,用于赋值和接受赋值~并不需要你手动定义~
脑残了,需要手动指定,因为=运算符并没有限制右值为const~
[/Quote]
但是我记得貌似其他赋值运算符有限定 != == *= += \=这些都不用手动指定~
好久没用D3D的矩阵了~
游戏设计师
2011-12-18
打赏
举报
回复
[Quote=引用 6 楼 dyangrun 的回复:]
当使用在 = 运算符右边的时候调用的是FLOAT operator () ( UINT Row, UINT Col ) const;
返回值不同,用于赋值和接受赋值~并不需要你手动定义~[/Quote]
脑残了,需要手动指定,因为=运算符并没有限制右值为const~
游戏设计师
2011-12-18
打赏
举报
回复
[Quote=引用 3 楼 rabbitlbj 的回复:]
不好意思,我楼上说的有问题,我现在的理解是:
如果对于非const变量,里面定义不定义const成员函数都可??
只有需要const变量时,才需要定义const成员函数??
[/Quote]
FLOAT& operator () ( UINT Row, UINT Col );
FLOAT operator () ( UINT Row, UINT Col ) const;
两个都是重载了()运算符,当使用在 =运算符左边的时候调用的是FLOAT& operator () ( UINT Row, UINT Col );
当使用在 = 运算符右边的时候调用的是FLOAT operator () ( UINT Row, UINT Col ) const;
返回值不同,用于赋值和接受赋值~并不需要你手动定义~
turing-complete
2011-12-18
打赏
举报
回复
提高代码的可读性和健壮性
而且常量对象和临时对象都只能使用本类的const成员函数
gtdsj
2011-12-18
打赏
举报
回复
const成员函数唯一作用就是不能修改传入的参数
与返回值是否引用没有关系,只要不改变引用的的对象就行
RabbitLBJ
2011-12-18
打赏
举报
回复
不好意思,我楼上说的有问题,我现在的理解是:
如果对于非const变量,里面定义不定义const成员函数都可??
只有需要const变量时,才需要定义const成员函数??
RabbitLBJ
2011-12-18
打赏
举报
回复
[Quote=引用 1 楼 dyangrun 的回复:]
左值和右值~
最近怎么这么多问这个的
[/Quote]
谢谢楼上,不过这第二个函数貌似也不能做左值呀,不是常量吗??
游戏设计师
2011-12-18
打赏
举报
回复
左值和右值~
最近怎么这么多问这个的
iamnobody
2011-12-18
打赏
举报
回复
如果this指针指向的是左值(通过一个左值来调用),会调用非const板本,如果this指针指向的是右值,调用const版本。
====
修正一下:
如果this指针是非const指针(通过一个左值来调用),会调用非const板本,如果this指针是const指针,调用const版本。
iamnobody
2011-12-18
打赏
举报
回复
让我说到点子上去吧:
成员函数后面的const 重载的是一个特殊的参数-----this指针。
如果this指针指向的是左值(通过一个左值来调用),会调用非const板本,如果this指针指向的是右值,调用const版本。
由于很难避免右值的出现的。所以,当你需要为你这个类的右值也提供一个可用的成员函数时,重载const版本。
另外非const 指针可以转换成const指针----详见c++primer函数重载若干内容。
【C++】:
const
成员
,取地址及
const
取地址操作符重载
这两个默认
成员
函数一般不用我们自己定义 ,编译器默认会生成。取地址操作函数和加了
const
的取地址操作函数构成重载。,
const
修饰类
成员
函数,实际修饰该
成员
函数。,表明在该
成员
函数中。
const
成员
函数返回
const
这个函数是一个常量
成员
函数,作用是返回一个指向容器的常量引用,该容器以uint64_t类型为键、GatePtr类型为值,用于存储“门对象”(Gate)的映射关系,且函数本身不会修改所属类的任何
成员
变量。:基于哈希表实现,无序,查找速度快(适合高频通过uint64_t键查找 Gate 对象)。std::map:基于红黑树实现,有序,查找效率为 O(log n),适合需要有序遍历的场景;这里用说明核心诉求是“快速查找”。GatePtr// 原始指针别名(不推荐,易内存泄漏)
C++
const
与 static 详解:变量、函数、类
成员
的全面解析
C++中的
const
和static关键字是控制变量行为和存储方式的核心工具。
const
用于声明不可变性,可修饰变量、函数参数和
成员
函数,保证数据不被意外修改;static则控制存储期和链接性,使局部变量持久化、限制全局变量作用域,并实现类
成员
的共享。两者结合可定义类级别的编译期常量(static
const
expr)。使用时需注意
const
成员
函数不能修改状态、static
成员
需在类外定义等规则,遵循优先使用
const
expr、参数用
const
&等最佳实践,以提升代码安全性和性能。
【C++】深入理解
const
成员
函数
C++中的
const
成员
函数是声明后加
const
关键字的类
成员
函数,其主要特性包括:1)承诺不修改对象状态(mutable
成员
除外),编译器会强制检查;2)允许常量对象调用;3)支持基于
const
性进行函数重载;4)可与mutable
成员
交互。使用
const
成员
函数能增强代码安全性、明确设计意图、支持常量对象并促进良好类设计,但需注意避免滥用mutable。这类函数对非常量对象和常量对象具有不同的调用权限,是C++类型系统的重要安全特性。
C++之
const
std::string& s(传参时
const
string& 相对
const
string 的
优势
)
class DepthViewer : public OpencvViewer { public: DepthViewer(
const
std::string& win); virtual void show(
const
cv::Mat& depthImage); virtual void onMouseCallback(cv::Mat& img, ...
C++ 语言
65,213
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章