白话C++编程系列之: 文件篇

in #programming7 years ago

c++!
上一篇我们一起学习了《白话C++编程系列之: 函数篇》, 我们知道 了函数的概念,它和数学中的函数还是不一样的。

您印象还深么?您可以点开这个链接再看一次以加深印象。

关于函数您有什么想和我沟通的?有没有什么需要我帮助的?请您在文章的末尾留言. ^_^

现在我们让我们来简单的复习它:
函数是啥?

函数是表达一个独立功能的一段代码.

for exmaple:

//找出两个中更大的一个
double GetMax( double dblLeft, double dblRight)
{
    return dblLeft > dblRight ? dblLeft : dblRight;
}

更多的例子请您点开函数的文章查看。

Today, let's talk about 文件的概念.
我们一定对文件很熟悉,从Linux, Unix 或者 Dos, Windows XP 或者更多的操作系统开始,和之前的特别火的Nokia,
当前的智能手机iPhone, Google Android 类手机, 我们操作电脑和手机时时时刻刻都和文件打交道。

我们通过文件记录,修改一些数据。 比如写个excel计算一下GAFATA股票的增长率,
编写一个C++可执行程序,一首mp3, 一个感人的、百看不厌的 Movie《Shawshank Redemption》都是文件的形式保存的。

在编程中文件的概念,特别是在Linux下,文件可以是一个普通txt文件,可以是一个流,一个socket, 一个管道等等.
那么在C++中,写代码时,也就是我们今天要说的文件是指什么呢?

1.文件是啥?


文件我们这里特指头文件(.h文件, 也有可能是.hpp文件(声明和实现放在一起), .inl文件)和.cpp文件.
文件是组织代码的一种方式.通常.h文件用来写声明(类的,函数等的), .cpp文件用来写实现(类的,函数等的).

来个例子:

//.h文件: myFunctions.h
//D:\dev\jinLab\p8_file\p8_file\myFunctions.h
#include <iostream>
#include <string>

using namespace std;

//找出两个中更大的一个数
double GetMax( double dblLeft, double dblRight )
{
    return dblLeft > dblRight ? dblLeft : dblRight;
}

void printSth( std::string const & str2print )
{
    std::cout << str2print << std::endl;
}

函数的放在头文件中的例子

正如上面的例子中写的一样,我们把这2个函数放到了 myFunctions.h这个头文件中.这样我们的.cpp文件也会变得更小。
同时我们改代码的地方也会相对更加集中,维护起来也更省事。

对于大型的项目,我们在项目中,通常是一个类(我们会在后面的系列文章中详细和大家聊),一个头声明文件,一个.cpp实现文件.
有时,我们也将一些全局的宏或者常量定义在一个头文件中,然后将它#include到.cpp文件中来使用。

像刚才我们的这个myFunctions.h头文件,我们就可以把它#include 到p8_file.cpp中来使用。比如:

//D:\dev\jinLab\p8_file\p8_file\p8_file.cpp
//这里的cpp文件就是: p8_file.cpp
//它#include "myfunctions.h"
// p8_file.cpp : 白话C++编程之: 文件篇
//

/*
@Author: Albert 小宁
@Web: http://jinLab.com
@WeChatOfficalAccount: 小宁静致远
@Date: 2017-11-05
*/

//引入头文件: myFunctions.h
#include "myFunctions.h"
#include <cmath>

int main()
{

    printSth( "hello guys! Good weekend!" );
    double dblMax = GetMax( 5.0, 3 );
    printSth( std::string( "The max is: " ).append( std::to_string( dblMax ) ) );

    //或者直接使用标准库的函数
    auto aMax = std::fmax( 7.0, 3.3 );

    return 0;
}

#include头文件

2.文件的应用?(举个例子)


其实在上面的例子中,我们已经使用了文件的代码组织方式。在越大的项目,这种组织方式越常用.
在这儿,我们举一个另外一个例子.inl文件的。这种方式没有.h和.cpp文件常用,但也是一种非常棒的文件组织代码方式.

直接看例子。这个例子中,我们把CMyClass类中的inline void print()这个内联函数声明放在类本身,但我们将它的实现放在了D:\dev\jinLab\p8_file\p8_file\myClassInl.inl这个文件中.

这么放的好处是整个类看起来更简练,只需要看它的接口声明,而不需要了解它的实现细节。
就好像我们知道饭店做红烧肉,但是我们不需要知道他是如何做这个红烧肉的,又是肉,又是油的,火候如何,烧多久,都不用知道。
但是如何你想知道怎么做的细节,那你可以打开之个.inl文件去查看。

这里是inline void print()的声明(有红烧肉)

class CMyClass
{
public:
    //构造函数
    CMyClass(){}

    //析构函数
    ~CMyClass(){}

    //一个打印函数: 声明
    inline void print();

};

声明

这里是print()的实现细节(怎么做红烧肉)

void CMyClass::print()
{
    printSth( "I am function print() of class CMyClass!" );
}

实现

这里是把声明和实现结合起来的地方(菜单:有红烧肉这个菜呀)

//CMyClass::print() 的实现在这个.inl文件中
#include "myClassInl.inl"

结合处

3.文件的实践?(动手操作)


看了上面的例子, 是不是觉得太简单了,哈哈, 对您也是一样一样的。是不是想动手实践一下.好!一起来!

请打开VS2013或者打开cpp.sh http://cpp.sh来(本次cpp.sh帮不上你的忙了。它不能组织多个文件)写上如下代码:

inl文件: D:\dev\jinLab\p8_file\p8_file\myClassInl.inl

void CMyClass::print()
{
    printSth( "I am function print() of class CMyClass!" );
}

头文件: D:\dev\jinLab\p8_file\p8_file\myFunctions.h

#pragma  once //防止多次包含同一个头文件 
#include <iostream>
#include <string>

using namespace std;
//找出两个中更大的一个
double GetMax( double dblLeft, double dblRight )
{
    return dblLeft > dblRight ? dblLeft : dblRight;
}

void printSth( std::string const & str2print )
{
    std::cout << str2print << std::endl;
}

class CMyClass
{
public:
    //构造函数
    CMyClass(){}

    //析构函数
    ~CMyClass(){}

    //一个打印函数: 声明
    inline void print();

};


//CMyClass::print() 的实现在这个.inl文件中
#include "myClassInl.inl"

.cpp文件: 调用处: D:\dev\jinLab\p8_file\p8_file\p8_file.cpp

// p8_file.cpp : 白话C++编程之: 文件篇
//

/*
@Author: Albert 小宁
@Web: http://jinLab.com
@WeChatOfficalAccount: 小宁静致远
@Date: 2017-11-05
*/

#include "myFunctions.h"
#include <cmath>

int main()
{

    printSth( "hello guys! Good weekend!" );
    double dblMax = GetMax( 5.0, 3 );
    printSth( std::string( "The max is: " ).append( std::to_string( dblMax ) ) );

    //或者直接使用标准库的函数
    auto aMax = std::fmax( 7.0, 3.3 );

    CMyClass myClass;
    myClass.print();

    return 0;
}

我的代码结构目录
代码目录结构

新建文件
新建文件

如果使用的是VS2013, 那么我们按F7, 如果没有错误的话, 就会编译生成我们的程序,并且会有下面的输出:
请看,这是程序的输出结果图.
vs2013语句: 程序输出

怎么样?哈哈
恭喜您, 今天您和我一起学习了文件这个概念.
文件

文件我们这里特指文件(.h文件, 也有可能是.hpp文件, .inl文件)和.cpp文件.
文件是组织代码的一种方式.通常.h文件用来写声明(类的,函数等的), .cpp文件用来写实现(类的,函数等的).

文件的应用
文件的实践

怎么样?^-^ 文件的概念很简单吧?它是我们组织代码的一种方式。您是如何理解它的?能不能举几个例子? 动手写起来吧.



白话C++编程系列之:下期预告


白话C++编程系列之七: 多个文件篇
* 1.在C++中多个文件和一个文件有什么不同么?
为什么要分出一个多个文件来单独聊?
* 2.多个文件组织的应用例子
* 3.多个文件的实践例子



延伸阅读


inline : 内联关键字.

inline通常用来修饰小的函数,以提高调用速度(编译器将对这个函数的调用,直接变成将这个内联函数代码复制到调用处)
或者为了避免对一个全局函数的重复包含、声明、定义,也可以在函数前面加上inline. 比如:

inline void MyPrint( std::string const & str2print)
{
    std::cout << str2print << std::endl;
}

《白话C++编程系列之: C++入门与实践大纲》

《白话C++编程系列之一: 本质篇》

《白话C++编程系列之二: 变量篇》

《白话C++编程系列之三: 类型篇》

《白话C++编程系列之四: 语句篇》

《白话C++编程系列之五: C++是啥?》

《白话C++编程系列之六: 表达式(语句之爱恨)》

《白话C++编程系列之七: 函数篇》






Wana learn English in USA? Click this link:
talk English in USA:在美国学英文

请大家多多动手,让编程也成为您的一种爱好和生产力。
戳右上角 小宁静致远 或扫码关注我, 欢迎、感激传播! ^_^
期待和您多交流、共成长。谢谢!
扫描关注小宁静致远
精灵实验室? http://jinLab.com
留言区就是您的天下,欢迎吐槽、拍砖!

Why NOT let programming a skill of you?
Just click the blue top-right 小宁静致远 or scan the 2D code above to follow me & thanks for sharing me to your friends! ^_^
Hope we can communicate each other & improve ourselves together. Thanks!
JinLab? http://jinLab.com
Any ideas? Please add comments to the article!

鼓励我的创作? Encourage me?
您的鼓励我的动力! Appreciate your praise!