【3.1】学习C++之再逢const

本文针对C++中const在类中的情况进行总结。介绍了const修饰类成员变量时,赋值需用初始化列表;还说明了const也能修饰成员函数,常成员函数不能改变数据成员值,只有常对象才能调用常成员函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

随着学习的深入,就会发现曾经学的const还有更深入的用法,现在就对const的未总结的用法进行总结。

本文就是针对const在类中的情况进行的总结。

有时我们会遇到下面这种将类的成员变量用const进行修饰的情况

class Coordinate
{
public:
    Coordinate(int x,int y);
private:
    const int m_iX;
    const int m_iY;
}

在这种被const修饰过的成员变量进行赋值的时候需要注意:

Coordinate::Coordinate(int x,int y)
{
    m_iX = x;
    m_iY = y; 
}

这种赋值方式是错误的,需要用初始化列表,如下:

Coordinate::Coordinate(int x,int y):m_iX(x),m_iY(y)
{
}

当然如果这个类的成员变量的类型是另一个类,也被const修饰,如下:

class Line
{
public:
    Line(int x1,int y1,int x2,int y2);
private:
    const Coordinate m_coorA;
    const Coordinate m_coorB;
}

那么,他的初始化依旧是只能使用初始化列表:

Line::Line(int x1,int y1,int x2,int y2):
      m_coorA(x1,y1),m_coorB(x2,y2)
{
    cout<<"Line"<<endl;
}

当然,const不止能修饰成员变量,也能修饰成员函数,下面就对Coordinate类进行稍作添加修改:

class Coordinate
{
public:
    Coordinate(int x,int y);
    void changeX() const;
    void changeX();
private:
    const int m_iX;
    const int m_iY;
}

其中,我们重载定义了两个changeX成员函数,其中一个用const修饰,那么我们需要注意下面一个问题:

void Coordinate::changeX() const
{
    m_iX=10;//错误
}

void Coordinate::changeX()
{
    m_iX=20;
}

被const修饰的成员函数(即常成员函数)不能改变数据成员的值,

是因为编译时会变成下面的样子

void changeX(const Coordinate *this)
{
    this->m_iX=10;
}

会隐含着this指针,这个this指针是被const修饰的,即为常指针,这个常指针不能修改所指向的数据。

虽然这两个changeX是重载的,但是一定要分清楚什么时候调用哪个。

int main(void)
{
    const Coordinate Coordinate(3,5);//常对象
    Coordinate.changeX();//调用的是常成员函数
    return 0;
}

只有用const修饰并声明的常对象才能调用常成员函数。

转载于:https://www.cnblogs.com/H2Rain/p/10909990.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值