关于头文件的使用

这里写一下这个东西,毕竟我在使用的时候还是有不少的疑问

一、头文件

头文件就是在写 C++ 代码的时候,在最开头几行引用的文件,这里比如说:

# include <iostream>

我们就是引用了一个名称为
iostream
的头文件

这里这个文件为什么没有后缀名呢,这我就不是很清楚了,据说是取巧,或者是为了统一 C++ 头文件的格式

这里我把
iostream
的文件放在这里:

// Standard iostream objects -*- C++ -*-

// Copyright (C) 1997-2014 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library.  This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.

// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// Under Section 7 of GPL version 3, you are granted additional
// permissions described in the GCC Runtime Library Exception, version
// 3.1, as published by the Free Software Foundation.

// You should have received a copy of the GNU General Public License and
// a copy of the GCC Runtime Library Exception along with this program;
// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
// <http://www.gnu.org/licenses/>.

/** @file include/iostream
 *  This is a Standard C++ Library header.
 */

//
// ISO C++ 14882: 27.3  Standard iostream objects
//

#ifndef _GLIBCXX_IOSTREAM
#define _GLIBCXX_IOSTREAM 1

#pragma GCC system_header

#include <bits/c++config.h>
#include <ostream>
#include <istream>

namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION

  /**
   *  @name Standard Stream Objects
   *
   *  The &lt;iostream&gt; header declares the eight <em>standard stream
   *  objects</em>.  For other declarations, see
   *  http://gcc.gnu.org/onlinedocs/libstdc++/manual/io.html
   *  and the @link iosfwd I/O forward declarations @endlink
   *
   *  They are required by default to cooperate with the global C
   *  library's @c FILE streams, and to be available during program
   *  startup and termination. For more information, see the section of the
   *  manual linked to above.
  */
  //@{
  extern istream cin;		/// Linked to standard input
  extern ostream cout;		/// Linked to standard output
  extern ostream cerr;		/// Linked to standard error (unbuffered)
  extern ostream clog;		/// Linked to standard error (buffered)

#ifdef _GLIBCXX_USE_WCHAR_T
  extern wistream wcin;		/// Linked to standard input
  extern wostream wcout;	/// Linked to standard output
  extern wostream wcerr;	/// Linked to standard error (unbuffered)
  extern wostream wclog;	/// Linked to standard error (buffered)
#endif
  //@}

  // For construction of filebuffers for cout, cin, cerr, clog et. al.
  static ios_base::Init __ioinit;

_GLIBCXX_END_NAMESPACE_VERSION
} // namespace

#endif /* _GLIBCXX_IOSTREAM */

你会发现,我们在这个头文件中定义了一些东西,所以我们在引用这个头文件的时候就可以用这些定义过的东西

但是说的再准确一点,这又不叫定义,而是叫做声明

具体一点说,我们先看一下头文件的格式:

# ifndef _NAME_H_

# define _NAME_H_

// 在这里定义一些东西

# endif

这里我们的第一行的
_NAME_H_
是你自己起的名字,但是最好和头文件的名字一样

保存,后缀名
.h

然后中间定义的格式是这样的:

# include <bits/stdc++.h> // 引用你需要的头文件,可以是自定义的

using namespace std;

inline void Afunction () ;

class A {

    public :

        inline void init () ;

} ;

这就是头文件,而具体函数的定义,我们放在源文件里

二、源文件

源文件的后缀名是
.cpp
,用于写
C++
代码,这里我们把一组头文件和源文件配对,名称的话最好是一样的

然后我们在源文件里引用头文件,在源文件里面定义头文件中声明而没有定义的函数即可

具体格式见下:

# include <bits/stdc++.h>

# include "..." // 你的头文件的地址

using namespace std;

void Afuncion () {

    return ;

}

void A :: init () {

    if (1 + 1 == 2) return ;

}

三、实战

为了让大家更透彻的理解,我们写一个有关秦子涵的文件

首先,我们这样拜访我们的文件:

image

然后我们在
Qinzihan.h
里面这样写:

# ifndef _QINZIHAN_H_

# define _QINZIHAN_H_

# include <bits/stdc++.h>

using namespace std;

class Qinzihan {

    public :

        long long Weight = 2147483647; // 体重

        bool Dead = false; // 解脱了没

        void Init (long long w) ; // 初始化/创造一个秦子涵

        void Eat (long long food) ; // 本能:吃东西

} ;

Qinzihan ReadQinzihan () ; // 读入一个秦子涵

# endif

然后我们在
Qinzihan.cpp
里写这些:

# include <bits/stdc++.h>

# include "Qinzihan.h" // 引用我们的头文件

using namespace std;

// 把声明的函数定义一下

void Qinzihan :: Init (long long w) {

    this -> Weight = w * 10; // 初始天赋,10 倍体重

}

void Qinzihan :: Eat (long long food) {

    if (this -> Dead) return ;

    this -> Weight += food;

    if (this -> Weight < 0) Dead = true;

}

Qinzihan ReadQinzihan () {

    long long w = scanf ("%lld", &w);

    Qinzihan nw = init (w);

    return Qinzihan;

}

// 若是不运行这个程序,就不用写 main 函数

接下来我们在新文件
test.cpp
里试试:

# include <bits/stdc++.h>

# include "Qinzihan.h"

using namespace std;

signed main () {

    Qinzihan qinzh = ReadQinzihan ();

    while (! qinzh.Dead) qinzh.Eat (100000);

    return 0;

}

四、结语

这里提前祝大家龙年大吉啦

标签: none

添加新评论