【C++侯捷】面对对象高级编程(四)
扩展补充:类模板、函数模板、及其他
static
在C++中,我们创建一个类之后,如果要对其进行使用,需要实例化一个对象,此时会开辟出一段内存空间,对于同一个类,创建不同的实例后,他们所拥有的内存地址是不同的,如上述c1,c2,c3
,这些是no-static members(functions)
。
但是会出现这样一种场景,譬如在银行应用中,假如有类Account
,每个用户都是这个类的实例,他们的账号、个人信息不尽相同,但是有一点是相同的,即利率,假如每个人都创建出一个利率出来,但是又肯定相同,那么便显得不妥,此时就要使用static
。
语法很简单,即在变量或成员函数前面加static
{
static data members;
}
一个例子
class Account{
public:
static double m_rate;
static void set_rate(const double& x){m_rate = x}
};
double Account::m_rate = 8.0;
int main(){
Account::set_rate(5.0);
Account a;
a.set_rate(7.0);
}
上述例子中,m_rate
变量只是声明出来,需要在外部调用类去初始化(分配内存)。
静态函数由于没有this pointer
所以只能处理静态变量。
调用static
函数的方式有两种:
- 通过
object
调用 - 通过
class name
调用
ctor 放在private区
例子
Singleton
class A{
public:
static A& getInstance(){return a;}
setup(){ ... }
private:
A();
A(const A& rhs);
static A a;
...
};
这个例子中,将类的构造函数放在了private中,使得外界不能通过其创建对象,
但是又接着创建了一个静态对象,同时有函数getInstance
是的外界可以得到a。
{
A::getInstance().setup();
}
这是一种用法可以用来专门解决某种问题。
但是上面例子存在一个问题,就是假如没有外界需要这个,那么仍然会创建一个对象,会有点浪费。
所以,
Meyers Singleton
class A{
public:
static A& getInstance(){return a;}
setup(){ ... }
private:
A();
A(const A& rhs);
...
};
A& A::getInstance(){
static A a;
return a;
}
cout
class template, 类模板
template<typename T>
class complex
{
public:
complex (T r = 0, T r = 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, const complex&);
};
用法
{
complex<double> c1(2.5,1.5);
complex<int> c2(2,6);
}
function template, 函数模板
语法很好理解,重点是stone中的算法怎么设计。
namespace
- using directive 使用命令,全部打开,可能会造成后续使用混乱
- using declaration 使用声明