2021-12-30 面向对象2

2021-12-30 面向对象2,第1张

2021-12-30 面向对象2 一、类内权限
  1. private:私有的,除了自己类内部以外都不能使用
  2. public:公有的,对外暴露的,外界具有读写 *** 作权限
  3. 类内默认私有;struct中默认公有
  4. 权限选择:必须要对外界提供的,就放在public,其余都放在private;一般成员属性都放在                      private,如果外界需要使用就提供公有接口
二、定义对象
  1. 初始化:在定义时给值,内存划分时给值
  2. 赋值:定义之后给值,内存划分完之后给值
    //class Person
    //const int _sex
    Person()
        :_sex(1)//初始化列表
    //在进入构造函数的花括号前都称为初始化,进入构造函数即为赋值
    {
        _name=NULL;
    }
  3. 初始化列表:只有构造函数有初始化列表;必须初始化的成员需要放在初始化列表;在本对                        象构造之前需要完成的动作,必须放在初始化列表;const和引用必须放在初                          始化列表
  4. const:常对象只能调用常方法(构造函数、析构函数、静态函数不影响)
                          //const Person p1("xh",18,0);实参为常量
                          //Person const* this;需要的指针类型
    const char* get_name()const
    //this指针的const为 类名 *const this 常量指针,此时相当于把常量地址泄露给指向非常量的指针
    //所以要在参数列表括号后加上const修饰this指针,此时this指向的即为常量
    {
        return _name;
    }

    常方法中只能调用常方法(静态函数不影响)

三、哪些成员方法需要写成常方法  
  1. 如果成员方法内不需要改动成员,且没有对外暴露成员引用或指针,就可以直接写成常方法
  2.  如果成员内部不需要改动成员,但是会对外暴露成员引用或指针,就写两个成员方法(const方法和非const方法),形成重载
  3. 如果成员方法内部需要改动成员,就写为普通方法
 四、static
  1. 静态成员变量:一个类只有一份,无论构造多少对象都只有一份;存储在数据段;必须在类                           外的.cpp文件中初始化,且只能初始化一次;静态成员变量的访问可以不依                           赖于对象(不依赖于this指针),使用类的作用域可以直接访问
  2. 静态成员方法:静态成员方法没有this指针;静态成员方法的访问可以不依赖于对象(不依                             赖于this指针),使用类的作用域可以直接访问;静态成员方法内只能使用                             静态成员
五、只能产生一个对象的类 ——单例模式
  1. 理解:一个国家只能有一个国王;银河系只能有一个太阳;人只能有一次生命……
  2. 实现:
    class only
    {
    public:
        static Only* get_only()//静态成员方法不依赖于this指针即不依赖于对象
        {
            if(NULL == _only)//一旦已生成过一个对象就不再产生新的对象
            {
                _only = new only();
            }
            return _only;
        }
    private:
        only();//构造函数
        static Only* _only;  
    };
    Only* Only::_only = NULL;

    多线程的情况下不安全:若线程1在时间片完时刚好进入if,线程2得到时间片也进入if且构造                                         了一个对象,再轮到线程1时又能构造一个对象,故不安全。

  3. 优化:加锁
    #include
    class only
    {
    public:
        static Only* get_only()//静态成员方法不依赖于this指针即不依赖于对象
        {
            if(NULL == _only)//避免每一次进来都加锁,提高效率
            {
                _lock.lock();
                if(NULL == _only)//一旦已生成过一个对象就不再产生新的对象
                {
                    _only = new only();
                }
            }
            return _only;
            _lock.unlock();
        }
    private:
        only();//构造函数
        static mutex _lock;
        static Only* _only;  
    };
    Only* Only::_only = NULL;
    mutex Only::_lock = mutex();

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5699253.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存