zoukankan      html  css  js  c++  java
  • 【3.1】学习C++之再逢const

    随着学习的深入,就会发现曾经学的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修饰并声明的常对象才能调用常成员函数。

  • 相关阅读:
    Chrony服务同步集群时间
    lsyncd+rsync实时同步
    iptables
    nginx 之 proxy_pass详解
    Ansible 中的 playbook 详解
    MySQL基本查询实战
    MySQL索引
    MySQL高可用方案——双主
    MySQL事务
    MySQL用户和权限管理
  • 原文地址:https://www.cnblogs.com/H2Rain/p/10909990.html
Copyright © 2011-2022 走看看