一、static
1.静态数据 static data members
2.静态函数 static member funcitons
静态函数没有 this pointer,只能处理静态数据
非静态成员函数有this pointer,参数列表省略,对象调用时,对象地址赋给this。函数返回时,编译器会自动加上this->
3.例子,银行利率的存取
(1)静态数据必须在body之外给它一个定义,有无初值都可以。
(2)调用静态数据的方式有2种:
通过对象object调用
通过class name 调用
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调用
}
二、把构造函数ctors放入private(单例模式)
诉求:设计的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;
}
三、cout源码剖析
四、模板
1. 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代替
}
2. function template 函数模板
例:取最小值函数,可以应用于很多个类中