zoukankan      html  css  js  c++  java
  • C++官方文档-常量成员函数

    #include <iostream>
    using namespace std;
    
    class MyClass
    {
        public:
            int x;
            static int n;
            const int y;
            MyClass(int val)
                    : x(val), y(20)
            {
            }
    //        int get()
    //        {
    //            return x;
    //        }
            //int get() const {return x;}        // const member function
            //const int& get() {return x;}       // member function returning a const&
            //const int& get() const {return x;} // const member function returning a const&
            int get()
            {
                return x;
            }
            int gett() const
            {
                n++;
                return y;
            }
            int getY()
            {
                cout<<"非成员函数常量getY"<<endl;
                return y;
            }
            int getY() const
            {
                cout<<"常量成员函数getY"<<endl;
                return y;
            }
            //return const int&
            //只要不修改对象的状态就是合法的
    //        int& getYYYY()
    //        {
    //            //错误,返回对象常量的引用给外部
    //            return y;
    //        }
    //        int& getYYYY() const
    //        {
    //            //错误,返回对象常量的引用给外部,改成常量成员函数还是非法
    //            return y;
    //        }
            //返回常量引用
            const int& getXX()
            {
                return x;
            }
            //常量成员函数返回常量引用
            const int & getXXX() const
            {
    //            错误,改变了对象的状态
    //            x++;
                return x;
            }
            //成员函数返回一个常量引用
            const int& getYY()
            {
                //错误
    //            y++;
    //            正确
    //            x++;
                return y;
            }
            //返回值,合法
            int getYYY()
            {
                return y;
            }
            //判断是否合法,只要判断是否改变了对象的状态,比如对象的成员是常量,但是返回引用给外部
            //常量成员函数是否改变了对象的状态
    
    };
    int MyClass::n = 0;
    /**
     * 常量对象只能调用常量成员函数,所以上面的get不能从foo对象调用
     */
    /**
     *
     * Member functions specified to be const cannot modify non-static data members nor call other non-const member functions.
     * In essence, const members shall not modify the state of an object.
     * 指定成const的成员函数不能修改非静态数据成员,也不能调用非常量成员函数,从本质上来说,常量成员不能修改对象的状态
     */
    /**
     *const objects are limited to access only member functions marked as const,
     *but non-const objects are not restricted and thus can access both const
     *and non-const member functions alike.
     *常量对象被限制能只允许调用标记成常量的成员函数,但是非常量对象没有这么严格,因此允许它调用常量和非常量成员函数.
     *
     */
    int main()
    {
        const MyClass foo(10);
        MyClass bar(10);
    // foo.x = 20;            // not valid: x cannot be modified
        cout << foo.x << '
    ';  // ok: data member x can be read
        int y = foo.gett();
        cout << "y=" << y << endl;
        cout << "n=" << MyClass::n << endl;
        cout<<"getY"<<foo.getY()<<endl;
        cout<<"getY"<<bar.getY()<<endl;
        cout<<MyClass::n<<endl;
        return 0;
    }
  • 相关阅读:
    Socket接受多包的问题
    用C#实现winform对数据库读写图片
    C#下载代码,防迅雷
    linux的用户和组
    计算机硬件基础
    操作系统及网络协议
    mysql cluster排错经验分享
    清空使用的swap方法
    智能DNS的安装和配置
    关于nginx和cacti的一次排错经历
  • 原文地址:https://www.cnblogs.com/shuiyonglewodezzzzz/p/8449052.html
Copyright © 2011-2022 走看看