C++ std前向声明

在C++编程中,我们经常会用到std命名空间下的各种类和函数。但有时候为了提高编译效率,我们可以使用前向声明而不包含整个头文件。本文将通过示例介绍std中类和函数的前向声明方法。

前向声明(Forward Declaration)指在使用一个类或函数之前先行声明,而不包含整个定义。这可以让编译器知道该名称,从而在后面使用时联想正确的类型。比包含整个头文件快得多。

前向声明std::string类:

// 前向声明string类 
class std::string;

// 使用string 
std::string str;

std::string在字符串处理中应用广泛,包含整个头文件明显是一种浪费。使用前向声明即可在后面正常使用std::string。

前向声明std::vector类:

// 前向声明vector类
template<typename T>
class std::vector; 

// 使用vector  
std::vector<int> vec;

std::vector作为动态数组也非常常用。针对模板类,我们需要前向声明其模板参数。

前向声明std::shared_ptr:

// 前向声明shared_ptr类模板 
template<typename T>
class std::shared_ptr;

// 使用shared_ptr
std::shared_ptr<int> ptr;

智能指针shared_ptr用法广泛,前向声明可以避免包含头文件。

前向声明std::function:

// 前向声明function类模板
template<typename R, typename... Args> 
class std::function;

// 使用function
std::function<void(int)> func;

std::function通常用来封装callable对象,作为回调函数参数。用前向声明可以不包含。

前向声明std::thread:

// 前向声明thread类
class std::thread; 

// 使用thread
std::thread t([](){...});

std::thread是C++多线程编程中的线程对象。前向声明可以免除包含头文件。

前向声明std::cout:

// 前向声明cout  
std::ostream& std::cout;

// 使用cout
std::cout << "Hello World!" << std::endl;

std::cout是最常用的输出流对象,使用前向声明可以不包含头文件。

前向声明std::sort:

// 前向声明sort函数
template<typename R, typename T>
void std::sort(R first, R last);

// 调用sort
std::sort(vec.begin(), vec.end()); 

对于std命名空间下的函数模板,也可以用类似的前向声明语法。

我们也可以一次性前向声明多个std类和函数:

namespace std {
  class string;
  template<typename T> class vector;
  template<typename T> class shared_ptr;
  template<typename R, typename... Args> class function;
  class thread;

  template<typename R, typename T>
  void sort(R first, R last);
}

综上所述,通过前向声明std中常用的类和函数模板,可以避免不必要的包含头文件,提高编译效率。使用时需要注意:

  1. 前向声明不包含定义,只能使用指针或引用
  2. 不能以值作为函数参数传递,只能使用指针或引用
  3. 不能创建该类的对象,只能使用指针或引用