8 静态 模板 namespace

 

8.1 static

对于非静态的函数和数据:

非静态的成员函数通过this指针来处理不同的数据(一份函数—>多个对象)

image-20230731154548833

对于静态的函数和数据:

==静态函数没有this==,不能处理一般的数据,只能处理静态的数据

例1:

class Account
{
public:
	static double m_rate;  //静态变量的声明
	static void set_rate(const double& x) { m_rate = x; } //静态函数
};
double Account::m_rate = 0; //静态变量的定义 一定要有

int main()
{
    //调用静态函数法1——by class name
	Account::set_rate(5.0);
    //调用静态函数法2——by object
	Account a;
	a.set_rate(7.0); //静态函数与a无关/无this
}

例2:设计模式 Singleton(单体)

image-20230731163117925

  • 构造函数放在private中,外界无法调用
  • 设计了getInstance静态函数,来生成并返回唯一的一份

8.2 template

8.2.1 class template 类模板

  • T来代替某种类型
  • 使用时classname<type1> xxx,编译器会把T全部替换为type1

8.2.2 function template 函数模板

image-20230731164908165

比较函数——任何类型都可以进行比较;T来代替某种类型

应用时,不需要写某种类型——编译器自己会推导

8.3 namespace

对东西进行一个包装(不一定要一次性全写在一起,可分开包装在一起)

namespace name
{
...    
}
  1. 用法一:using directive

    #include <iostream>
    using namespace std; //直接把包装全打开
    int main()
    {
    	cin << ...;
    	cout << ...;
    	return 0;
    }
    
  2. 用法二:using declaration

    #include <iostream>
    using std::cout; //只打开一条
    int main()
    {
    	std::cin << ...; //没打开要写全名
    	cout << ...;
    	return 0;
    }
    
  3. 用法三:都写全名

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