static static的成员不再单独属于一个对象,他是单独的保存在内存的某个地址,也就只有一份。所以在设计程序的时候要看这个东西是不是只需要一份。 static函数和一般的函数一样,在内存中只有一份。静态函数没有this指针,不能像一般成员一样去访问和存取一般的成员数据,他只能处理静态的对象,静态的成员。 如果class中有静态的数据,一定要在class之外进行初始化。
class Account{ public: static double m_rate;//只是声明而已 static void set_rate(const double& x) { m_rate = x;} }; double Account::m_rate = 8.0;//定义,设初值,使这个变量获得内存。 //静态数据必须在类的body之外写这条,给不给初值都可以。 int main(){ Account::set_rate(5.0);//通过class name 调用 Account a; a.set_rate(7.0); //通过object调用 }
静态成员函数的调用方法有两种: 1、通过对象来调用 2、通过class name调用 一般函数通过对象来调用函数,对象的地址会作为this指针传进函数,static函数就不会这样操作。
Singleton设计模式 诉求:设计的class,只希望产生一个对象 外界取得唯一的a,然后调用别的函数对a进行操作: A::getInstance.setup();
class A{ public: static A& getInstance { return a; }; //外界取得唯一的a,对外的唯一窗口 setup() {...} private: A(); A(const A& rhs); //两个构造函数 static A a; //不想让别人创建a,所以把构造函数放入private ... };
问题:外界若不调用a,但a仍存在于内存中 优化措施:把静态的自己放入对外的唯一接口中(即getInstance函数中) 好处:只有当被调用时,a才会被创建,离开函数之后,a还在(因为是静态的)
class A{ public: static A& getInstance { return a; }; setup() {...} private: A(); A(const A& rhs); ... }; A& A::getInstance() { static A a; return a; }
getInstance()仍然是对外的唯一窗口 但唯一的对象放在getInstance里,写出这样那么如果没有人使用那么a就不存在。只有当人调用getInstance(),a才会被创建。
cout源码剖析
模板 class template 类模板 复数的实部虚部可能是double,int等等,这部分用T表现
template<typename T>// 目前T还没绑定 class complex { public: complex(T r = 0, T i = 0) : re(r), im(i) { } complex operator += (const complex&); T real() const { return re; } T imag() const { return im; } private: T re,im; friend complex& __doapl (complex* , complex&); } { complex<double> c1(2.5,1.5); //将class中的所有T用double代替 complex<int>(2,1); //将class中的所有T用int代替 }
typename可以用T来替代 类模板必须要明确指出替代的typename是什么 如上图所示调用,c1传入的类型会把T全部替换为double,c2传入的类型会把T全部替换成int
function template 函数模板 例:取最小值函数,可以应用于很多个类中
class类型也可以用T来代替 函数模板不必明确指出class类型是什么,编译器会做实参推导 因为比大小都使用(<)符号,设计比大小的方法不在<身上,而是在参与比大小的对象的class里
命名空间namespace
namespace 后可以命名一个名称将所有东西都放到名称里,这样就讲有所得东西都包装到命名空间里。
using directive等于将std全部打开,把所有东西都取出来
using declaration相当于从std中拿一个东西