C++面向对象(三)补充 static, cout, template
一、static
静态函数只能处理静态数据
调用static函数的方式有两种:
(1)、通过object调用
(2)、通过class name调用
class Account{
public:
static double m_rate;
static void ser_rate(const double& x){
m_rate = x;
}
};
double Account::m_rate = 8.0; // 如果是static数据,必须再类外紧跟着做初始化!!
int main(){
Acccount::set_rate(5.0); // 调用(1)
Accout a;
a.set_rate(7.0); // 调用(2)
}
在类对象的外面,记得必须要定义 "double Account::m_rate; ",至于要不要赋初始值均可,但一定要在类外定义。
- 设计模式(一)
所写的class,只希望产生一个对象,且不希望让外界来创建
class A{
public:
static A& getInstance{
return a;
};
setup(){
...
}
private:
A();
A(const A& rhs);
static A a;
...
};
A::getInstance().setup();
这样只能通过class内部创建出来对象a,而外界无法创建。但有个缺点,就是即使没有使用到a对象,class也会在一开始就创建a出来,在没有使用到的情况下容易造成内存浪费。所以可以考虑下面的设计模式。
- 设计模式(二)
class A{
public:
static A& getInstance{
return a;
};
setup(){
...
}
private:
A();
A(const A& rhs);
...
};
A& A::getInstance(){
static A a;
return a;
}
A::getInstance().setup();
这样便只有当有人调用到class A时才产生对象a,若没人使用到对象a,则不存在。且当其对象a一产生,便可延续使用,直到整个程序结束。
二、cout
由此可知,因为cout是个ostream类型,所以其可以接受很多类型的输出。
三、template
-
class template(类模板)
用的时候必须明确指出来里面的类型是什么类型。
template <typename 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& __doaple(complex*, const complex&);
};
complex<double> c1(2.5, 1.5);
complex<int> c2(2, 6);
-
function template(函数模板)
用的时候不需要指出来里面的类型是什么类型,编译器会对function template进行推导。
template <class T>
inline const T& min(const T& a, const T& b){
return b < a ? b : a;
}
class stone{
public:
stone(int w, int h, int we): _w(w), _h(h), _weight(we){}
bool operator<(const stone& rhs) const{
return _weight < _rhs.weight;
}
private:
int _w, _h, _weight;
};
stone r1(2, 3), r2(3, 3), r3;
r3 = min(r1, r2);
编译器先对function template进行参数推导,推导出T为stone类型,然后调用stone类型的重载函数进行判断比较。