1. static
类的非静态成员函数:由this指针隐式指定传入的参数
静态数据:与对象脱离,不属于对象,只有一份。例:银行账户类中的银行利率,可以有很多账户对象,但只有一份利率。
静态函数:与一般成员函数的区别是没有this pointer,只能处理静态数据(环环相扣)。
例:account类
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 a;
a.set_rate(7.0); //1.通过对象调用
Account::set_rate(5.0); //2.没有对象的情况下通过class name调用
}
2. 设计模式singleton
只希望产生类的一个对象,不希望外界创建对象,构造函数写成私有的。
静态函数是将创建的对象return给外界的唯一窗口
class a
{
public:
static A& getInstance();
setup() {...}
private:
A();
A(const A& rhs);
};
A& A::getInstance()
{
static A a;
return a;
}
调用方法:
A::getInstance.setup();
上面的写法的弊端:如果外界不使用对象a,会造成一定的浪费
改进:只有需要时才会被创建
3. cout
为啥cout啥都能打印?看标准库中的内部实现
4.1 类模板
声明
template<typename T>
class Complex
{...};
调用
Complex<double> c(...);
会造成代码膨胀,但是是正常的
4.2 函数模板
定义
template <class T>
const T& min(const T& a,const T& b)
{return b<a?b:a;}
调用
min(a,b)
编译器对函数模板进行实参(引数)推导argument deducion,不需要指出,然后调用运算符重载进行大小比较
5. namespace
语法:namespace关键字+名称+花括号
可以分段写
using directive: 全开
using declaration:一行一行打开