【C++侯捷】面对对象高级编程(四)

扩展补充:类模板、函数模板、及其他

static

image-20221107201904914

在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

image-20221107205635908

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, 函数模板

image-20221107211101607

语法很好理解,重点是stone中的算法怎么设计。

namespace

image-20221107211244938

  • using directive 使用命令,全部打开,可能会造成后续使用混乱
  • using declaration 使用声明

更多细节与深入

image-20221107211559640

posted @ 2023-10-01 18:36  travis-ge  阅读(16)  评论(0)    收藏  举报