- private:私有的,除了自己类内部以外都不能使用
- public:公有的,对外暴露的,外界具有读写 *** 作权限
- 类内默认私有;struct中默认公有
- 权限选择:必须要对外界提供的,就放在public,其余都放在private;一般成员属性都放在 private,如果外界需要使用就提供公有接口
- 初始化:在定义时给值,内存划分时给值
- 赋值:定义之后给值,内存划分完之后给值
//class Person //const int _sex Person() :_sex(1)//初始化列表 //在进入构造函数的花括号前都称为初始化,进入构造函数即为赋值 { _name=NULL; }
- 初始化列表:只有构造函数有初始化列表;必须初始化的成员需要放在初始化列表;在本对 象构造之前需要完成的动作,必须放在初始化列表;const和引用必须放在初 始化列表
- const:常对象只能调用常方法(构造函数、析构函数、静态函数不影响)
//const Person p1("xh",18,0);实参为常量 //Person const* this;需要的指针类型 const char* get_name()const //this指针的const为 类名 *const this 常量指针,此时相当于把常量地址泄露给指向非常量的指针 //所以要在参数列表括号后加上const修饰this指针,此时this指向的即为常量 { return _name; }
常方法中只能调用常方法(静态函数不影响)
- 如果成员方法内不需要改动成员,且没有对外暴露成员引用或指针,就可以直接写成常方法
- 如果成员内部不需要改动成员,但是会对外暴露成员引用或指针,就写两个成员方法(const方法和非const方法),形成重载
- 如果成员方法内部需要改动成员,就写为普通方法
- 静态成员变量:一个类只有一份,无论构造多少对象都只有一份;存储在数据段;必须在类 外的.cpp文件中初始化,且只能初始化一次;静态成员变量的访问可以不依 赖于对象(不依赖于this指针),使用类的作用域可以直接访问
- 静态成员方法:静态成员方法没有this指针;静态成员方法的访问可以不依赖于对象(不依 赖于this指针),使用类的作用域可以直接访问;静态成员方法内只能使用 静态成员
- 理解:一个国家只能有一个国王;银河系只能有一个太阳;人只能有一次生命……
- 实现:
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时又能构造一个对象,故不安全。
- 优化:加锁
#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();
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)