首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >常量正确性和运算符*

常量正确性和运算符*
EN

Stack Overflow用户
提问于 2012-01-21 01:40:36
回答 3查看 173关注 0票数 0

我定义了一个这样的类:

代码语言:javascript
复制
Quaternion& conjugate();        //negates the vector component of the quaternion
Quaternion  conjugate() const;  //same but in without modifying the class...

Quaternion& operator =  (Quaternion const& Qrhs);
Quaternion& operator *= (Quaternion const& Q);
Quaternion  operator  *  (Quaternion const& Qrhs) const;

现在我像这样使用这个函数:

代码语言:javascript
复制
PRINTVAR(*this);                //this is the first time printed (a little macro to print line and file)
Quaternion vQ(0.,vn), resQ;
resQ = vQ*(this->conjugate());  //this is the method I want to discuss...
PRINTVAR(*this);                //this is the second time
resQ = *this * resQ;

这是输出

代码语言:javascript
复制
*this: (0:0:0:0) at line: 128 in file: Quaternions.cpp
*this: (-0:-0:-0:0) at line: 131 in file: Quaternions.cpp

我想,通过调用resQ = vQ*(this should be called as const)...行中的操作符*,为什么我再次打印*this会发生变化?

下面是共轭函数的定义:

代码语言:javascript
复制
Quaternion& Quaternion::conjugate(){
/* Given:  Nothing
 * Task:   Invert sign of the vector
 * Return: the class which will be modified
*/
    V3 vec;
    vec = -(this->getVector());
    x() = vec[0];
    y() = vec[1];
    z() = vec[2];
    return *this;
}

Quaternion Quaternion::conjugate() const{
    Quaternion result(*this);
    result.conjugate();
    return result;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-21 01:48:15

如果您显示的代码在非常数方法中,那么this指针就是非常数,非常数conjugate方法当然比常量方法更匹配。在重载决策中不考虑返回类型。如果您想坚持使用const版本,可以添加constness:resQ = vQ*(static_cast<const Quaternion*>(this)->conjugate());

票数 3
EN

Stack Overflow用户

发布于 2012-01-21 01:50:22

您使用this的方法可能是非常量的。

A类型的成员函数的this类型为A * const。对于常量成员函数,它是const A * const

因此,如果您将代码输入到const方法中,您的代码将按照您预期的那样工作。

如果你想强制调用const重载函数,你需要做一个const-cast:

代码语言:javascript
复制
  const_cast<const Quaternion * const>(this)->conjugate();
票数 0
EN

Stack Overflow用户

发布于 2012-01-21 01:51:49

*这不是const (尽管它在const方法中使用),以及关于const重载的c++ FAQ Lite状态(在常见问题解答的情况下,在下标运算符上);

将下标运算符应用于非常数MyFredList对象时,编译器将调用非常数下标运算符。

翻译,因为*这是非常量,非常量方法将被调用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8945560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档