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修饰并声明的常对象才能调用常成员函数。

  • 相关阅读:
    168. Excel Sheet Column Title
    171. Excel Sheet Column Number
    264. Ugly Number II java solutions
    152. Maximum Product Subarray java solutions
    309. Best Time to Buy and Sell Stock with Cooldown java solutions
    120. Triangle java solutions
    300. Longest Increasing Subsequence java solutions
    63. Unique Paths II java solutions
    221. Maximal Square java solutions
    279. Perfect Squares java solutions
  • 原文地址:https://www.cnblogs.com/H2Rain/p/10909990.html
Copyright © 2011-2022 走看看