C++ 常对象成员 常成员函数 对象的常指针、常引用

常数据成员

一个类中的数据成员是可以被const修饰的,被称为常数据成员;常数据成员与普通数据成员初始化的方式并不相同

假设有一个Coordinate(坐标)类,用const修饰他的数据成员

class Coordinate
{
public:
    Coordinate(int x,int y)
    {
        m_iX=x;//这种初始化方式是错误的,表达式必须是可修改的左值,但是m_iX是用const修饰的
        m_iY=y;
    }
private:
    const int m_iX;
    const int m_iY; 
};

对于用const修饰的数据成员,只能用初始化列表来初始化!

class Coordinate
{
public:
    Coordinate(int x,int y):m_iX(x),m_iY(y)//初始化列表
    {
    }
private:
    const int m_iX;
    const int m_iY;
};

常对象成员

当对象作为数据成员,也可以用const进行修饰,称为常对象成员

举例:

要确定一条直线,那么直线的两个点的坐标需要确定

定义一个Line线段类,因为要实现两个点一旦初始化,就不能再修改,所以需要将坐标对象定义成 const

常对象成员也要通过初始化列表来初始化

class Line
{
public:
    Line(int x1,int y1,int x2,int y2):m_coorA(x1,y1),m_coorB(x2,y2)//通过初始化列表初始化
    {
    }
private:
    const Coordinate m_coorA;
    const Coordinate m_coorB;
};

常成员函数

const还可以修饰类中的成员函数,称为常成员函数;const放在成员函数的后面,不仅声明要写,定义也要写。

class Coordinate
{
public:
    Coordinate(int x,int y);
    void changeX() const;//常成员函数
    void changeX();
private:
    const int m_iX;
    const int m_iY; 
};

void Coordinate::changeX() const
{
    m_iX = 10;//错误!!!! 常成员函数中不能修改数据成员的值
}

注意!!常成员函数中不能修改数据成员的值

当定义 changeX() 函数时,看上去没有任何的参数,而实际上却隐含着一个参数:this 指针

当使用const来修饰成员函数的时候

在changeX()参数中含有this指针,如果使changeX()成为常成员函数,则const修饰的是*this,const在*前则表示该指针的内容不可变,将m_iX赋值为10,则是将this指针的内容改变了,程序出错!因此,常成员函数中不能修改数据成员的值

  • 常对象调用常成员函数

对象的常指针、常引用

还是之前的坐标类Coordinate,对对象的引用和对象的指针前用const修饰

#include<iostream>
using namespace std;

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

    int getX()
    {
        return m_iX;
    }

    int getY()
    {
        return m_iX;
    }

    void printInfo() const//常成员函数
    {
        cout<<"("<<m_iX<<","<<m_iY<<")"<<endl;
    }
private:
    int m_iX;
    int m_iY; 
};


int main()
{
    Coordinate coor1(3,5);
    const Coordinate &coor2 = coor1;
    const Coordinate *pCoor = &coor1;
    coor1.printInfo();
    coor2.getX();//错误
    pCoor->getY();//错误
    coor2.printInfo();//正确

    return 0 ;
}

运行结果:

coor2被const修饰,具有只读权限,而getX()具有读写权限,会改变coor2中的值

 

#include<iostream>
using namespace std;

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

    int getX()
    {
        return m_iX;
    }

    int getY()
    {
        return m_iX;
    }

    void printInfo() const//常成员函数
    {
        cout<<"("<<m_iX<<","<<m_iY<<")"<<endl;
    }
private:
    int m_iX;
    int m_iY; 
};


int main()
{
    Coordinate coor1(3,5);
    Coordinate coor2(7,9);
    Coordinate * const pCoor = &coor1;
    pCoor->getY();//正确
    pCoor = coor2;//错误
    pCoor->printInfo();//正确
    return 0 ;
}

运行结果;

 Coordinate * const pCoor = &coor1;

const在*后,修饰的pCoor这个指针,pCoor指针的指向不能变,但是它指向的对象的内容可以变;所以用pCoor->getY()是正确的

但是pCoor = coor2,是让pCoor指向了coor2,而用const修饰的pCoor指针的指向不能变,所以程序出错。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值