浅谈static、类模板和函数模板

首先,我们先来看static,从C语言我们知道,他是一个静态变量的标识符,可以让一个变量在离开作用域后,还能够存活。那么如果我们在类当中定义了一个static数据会怎么样,这个static数据会在程序开始前就会存在,而且仅此一份。那么static function呢,简而言之就是,操纵static变量的函数,举个例子,现在我们要计算一个基金增长利率,那么这个利率对于所有的对象来说,都是一样的,那么把它声明为static变量会更有效率以及更节省空间。
class Accout{
public:
    static double m_rate;  //声明式
    static void set_rate(const double& x)const{ m_rate = x;}
}
static double m_rate = 20;//定义式(即真正分配内存开始的地方)

int main(){
    Account::set_rate(5.0); //可以用类调用
    Account a;
    a.set_rate(5.0);//可以用对象调用,因为函数是static的,这时候不会传递&a也就是this指针
    return EXIT_SUCCESS;
}
进一步来说,在Singleton(单体)设计模式中,我们可以知道一个class就只存在一个对象,那么这个对象就是static的,为了让别人无法创建对象,我们需要把构造函数,拷贝构造函数放入private中,通过一个函数接口来获得这个static对象,大致思路如下所示:
class A{
public:
    static A& get_object() const{return a;}
    void fun();
private:
    A();
    A(const A& rhs);
    static A a;
}

我们只能通过A::get_object()来获得对象然后使用fun成员函数,像这样:A::get_object().fun().此时我们发现object a一直存在,这时候是不是有点浪费呢,如果我没用到这个static对象,所以提出了一种改良的方法就是,我用到了我再创建,给他定义为static,他就一直存在了。所以修改了get_object()函数如下:

static A& get_object(){
    static A a;
    return a;
}
这时候就不能用const funciton了,这里面改变了数据。

第二部分就谈谈template的基本用法吧,在class里,我们经常会碰到其中数据都是一个类型,比如前文中说到的complex复数类,这个复数的实部,虚部可以是int,可以是double,等等,这时候利用模板就可以减少重复性的工作:

template<typename T>
class complex{
public:
	complex(T r = 0,T i = 0):re(r),im(i){}
	~complex(){}
	complex& operator += (const complex& rhs);
	T real() const{ return re;}
	T imag() const{ return im;}
private:
	T re,im;
};
使用方式如下所示:
complex<int> c1(1,2);
complex<double> c2(2,3);
从标准库里面我们也可以看到比如一个min函数,我们可以写成如下形式:
template<class T>
inline
const T& min(const T& a,const T& b){
    return a<b?a:b;
}
因为我们有运算符重载,以这样的min函数来比较所有类型的对象来说,这都是非常合适的,只要我们在对应的class里进行<的运算符重载,我们就可以定义出我们自己想要的大小比较方式,同时得到最小值,利用T&当然是为了min的多重调用,而使用const 是防止min成为左值被使用,这是无意义的。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值