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

in programming •  7 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!

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

Good!

Thanks a lot!