C++不能用const对象调用非const方法

今天在写程序时遇到了一个报错:

error C2662: 'x' : cannot convert 'this' pointer from 'const class Point3d' to 'class Point3d &'

先看下代码:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;

class Point3d
{
public:
 Point3d(int x = 0, int y = 0, int z = 0):m_x(x), m_y(y), m_z(z){}
public:
 int x() {return m_x;}
 int y() {return m_y;}
 int z() {return m_z;}
 void X(int x){m_x = x;}
 void Y(int y){m_y = y;}
 void Z(int z){m_z = z;}
private:
 int m_x;
 int m_y;
 int m_z;
};
inline ostream& operator<<(ostream &os, const Point3d &pd)
{
 return os << " m_x: " << pd.x() << " m_y: " << pd.y() << " m_z: " << pd.z();
}

报错点是标红的这一行,分析了半天,找不到问题的原因.

然后回到报错信息的提示,看看能不能找到些许的蛛丝马迹:无法将this指针从const引用类对象类型转换为类对象类型,再把这个错误翻译一下:就是报错的原因在于我们将一个const this指针转换为一个非const导致的错误。

那么这是为什么呢?回到代码,我们在重载<<函数中声名的第二个参数是一个const Point3d& 类对象的引用,而在函数实现内部,我们用其调用类的成员方法x(),这里发生了什么?没错,这里编译器隐含了一个const this指针传给了类成员函数x(),而在类的实现中这个成员函数是非const的,这个函数的隐含this指针参数是非const的.换句换说,这个函数形参与实参结合时,发生了const 指针到非const指针的转换,因此报错!!!

知道了报错原因,我们把类的这些成员函数声明为const,函数声明为const,隐含的this指针也变成了const,于是这个问题应该不会再发生了

// C++中实现

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
class Point3d
{
public:
 Point3d(int x = 0, int y = 0, int z = 0):m_x(x), m_y(y), m_z(z){}
public:
 int x() const{return m_x;}
 int y() const{return m_y;}
 int z() const{return m_z;}
 void X(int x){m_x = x;}
 void Y(int y){m_y = y;}
 void Z(int z){m_z = z;}
// inline ostream& operator<<(ostream &os/*, const Point3d& pd*/)
/* {
  return os << " m_x: " << this->X() << " m_y: " << this->Y() << " m_z: " << this->Z();
 }*/
private:
 int m_x;
 int m_y;
 int m_z;
};
inline ostream& operator<<(ostream &os, const Point3d &pd)
{
 return os << " m_x: " << pd.x() << " m_y: " << pd.y() << " m_z: " << pd.z();
}

有一个点要注意,在c++中其实是有最小权限原则的,非const对象是可以调用const成员函数的

我们定义的类的成员函数中,常常有一些成员函数不改变类的数据成员,也就是说,这些函数是"只读"函数,而有一些函数要修改类数据成员的值。如果把不改变数据成员的函数都加上const关键字进行标识,显然,可提高程序的可读性。其实,它还能提高程序的可靠性,已定义成const的成员函数,一旦企图修改数据成员的值,则编译器按错误处理。 const成员函数和const对象 实际上,const成员函数还有另外一项作用,即常量对象相关。对于内置的数据类型,我们可以定义它们的常量,用户自定义的类也一样,可以定义它们的常量对象。
1、非静态成员函数后面加const(加到非成员函数或静态成员后面会产生编译错误)
2、表示成员函数隐含传入的this指针为const指针,决定了在该成员函数中, 任意修改它所在的类的成员的操作都是不允许的(因为隐含了对this指针的const引用);
3、唯一的例外是对于mutable修饰的成员。加了const的成员函数可以被非const对象和const对象调用,但不加const的成员函数只能被非const对象调用

char getData() const{         
		return this->letter;
}

c++ 函数前面和后面 使用const 的作用:

  • 前面使用const 表示返回值为const
  • 后面加 const表示函数不可以修改class的成员

请看这两个函数

const int getValue();

int getValue2() const;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值