侯捷C++手把手教学:static用法,单例模式,函数模板,namespace

    科技2025-08-14  7

    static类型的数据及函数 static data members:在所有实例中只存在一份,而non-static data members有几个实例,就会产生多少份。 举例:银行会拥有很多客户,每个客户都是一个个实例,他们的一般数据都是自己有一份,但是每天的利率都是一样的,可以声明为static。 static member functions:只能处理static data members。

    class Account { public: static double m_rate; //类在申明时,是不分配内存空间的,它类似于一个结构类型 static void set_rate(const double& x) { m_rate = x; } //静态函数不存在this这个参数 }double Account::m_rate = 8.0; //获得m_rate的定义,获得系统的内存才能是定义。 int main() { //调用static函数的方式有二: Account::set_rate(5.0); //通过class name调用 Account a; a.set_rate(7.0); //通过object调用 }

    将ctors放在private里,单例模式 诉求:只能产生一个对象。

    class A { public: static A& getInstance( return a; ); setup() { ... } private: A(); A(const A& rhs); static A a; ... };

    给外部调用通过:

    A::getInstance().setup();

    更好的写法:只有被调用才产生唯一的对象,被调用后这个唯一的对象一直存在。上一个例子,不调用就有这个唯一的对象了。(看弹幕是:饿汉式、饱汉式的区别,设计模式还没怎么学,猛男哭泣)。

    class A { public: static A& getInstance(); setup() { ... } private: A(); A(const A& rhs); ... }; A& A::getInstance() { static A a; return a; }

    函数模板(function template)

    stone r1(2,3),r2(3,3),r3; r3 = min(r1, r2);

    编译器会对function template进行引数推导。

    template <class T> inline const T& min(const T& a,const T& b) { return b < a ? b : a; }

    引数推导的结果,T为stone,于是调用stone::operator<

    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; };

    namespace 各自namespace里同名的参数不会打架。

    namespace std { ... }

    方式一:using directive

    #include <iostream.h> using namespace std; int main() { cin >> ...; cout << ...; return 0; }

    方式二:using declaration

    #include <iostream.h> using std::cout; int main() { std::cin >> ...; cout << ...; return 0; }

    方式三:

    #include <iostream.h> int main() { std::cin >> ...; std::cout << ...; return 0; }
    Processed: 0.011, SQL: 8