构造你的函数

在 main() 上方声明函数,并在 main 下方定义函数 在 main() 上方同时声明并定义函数。

随着 C++ 程序变得越来越复杂,你可能需要将代码分成多个文件。分开保存函数定义和声明有助于分割并组织你的代码。

我们看看函数测验中的这段代码。

# include <iostream>

float distance(float velocity, float acceleration, float time_elapsed);

int main() {

    std::cout << distance(, , ) << std::endl;
std::cout << distance(7.0, 2.1, 5.4) << std::endl; return ;
} float distance(float velocity, float acceleration, float time_elapsed) {
return velocity*time_elapsed + 0.5*acceleration*time_elapsed*time_elapsed;
}

代码被组织成两个文件,而不是像以前的测验一样将所有内容都放到 main.cpp 中。看看下面的代码main.cpp

#include <iostream>

float distance(float velocity, float acceleration, float time_elapsed);

int main() {

    std::cout << distance(, , ) << std::endl;
std::cout << distance(7.0, 2.1, 5.4) << std::endl; return ;
}

distance.cpp

float distance(float velocity, float acceleration, float time_elapsed) {
return velocity*time_elapsed + 0.5*acceleration*time_elapsed*time_elapsed;
}

打开一个终端并导航到包含这两个文件的文件夹。输入以下命令:

g++ main.cpp distance.cpp
./a.out

即可一起编译两个文件,然后执行该程序。

头文件

函数声明

float distance(float velocity, float acceleration, float time_elapsed);

通常也会单独创建一个文件。声明保存在所谓的头文件中,因为头是 main() 函数上方的信息。头文件扩展名通常为 .h 或 .hpp。下面的代码与上面相同,但在头文件中有函数声明。

main.cpp

#include <iostream>
#include "distance.h" int main() { std::cout << distance(, , ) << std::endl;
std::cout << distance(7.0, 2.1, 5.4) << std::endl; return ;
}

distance.h

float distance(float velocity, float acceleration, float time_elapsed);

distance.cpp

float distance(float velocity, float acceleration, float time_elapsed) {
return velocity*time_elapsed + 0.5*acceleration*time_elapsed*time_elapsed;
}

在main.cpp中多了一行include"distance.h"

现在,我们假设你想在不同的文件中重用你的 distance 函数。你所要做的,就是使用 include 语句在新文件的顶部声明函数:

# include "distance.h"

然后就可以在程序的另一部分使用该函数了。

将代码组织到不同的 .cpp 文件中,可以把声明与实现分离。此外,使用头文件意味着你不必记住如何进行函数声明,因为你可以用简单的语法将其包含在内

要编译代码,只需要编译 .cpp文件而不是 .h 文件即可:

g++ main.cpp distance.cpp

文件命名

命名约定规定,头文件和相关的 cpp 文件需使用相同的名称。因此,很显然,distance.h 包含了 distance.cpp 的头部声明。你还会注意到,函数本身名称为 distance()。因此,函数名、.cpp 文件和 .h 文件都是匹配的。

这些是命名约定。如果你不遵循这些约定,你的 C++代码仍然会被编译;但我们强烈建议你遵循这些约定。

Include 语法

你可能想知道,为什么有两种不同类型的 include 语句:

# include <iostream>
# include "distance.h"

带引号的 include 语句告诉程序在当前目录中查找 distance.h 文件。

> 语法则取决于你的 C++ 环境。通常,环境被设置为查找存储 C++ 库的文件,如标准库

C++构造函数和文件组织的更多相关文章

  1. Vue源码探究-源码文件组织

    Vue源码探究-源码文件组织 源码探究基于最新开发分支,当前发布版本为v2.5.17-beta.0 Vue 2.0版本的大整改不仅在于使用功能上的优化和调整,整个代码库也发生了天翻地覆的重组.可见随着 ...

  2. .NET 基础 一步步 一幕幕[面向对象之构造函数、析构函数]

    构造函数.析构函数 构造函数: 语法: //无参的构造函数 [访问修饰符] 函数名() :函数名必须与类名相同. //有参的构造函数 [访问修饰符] 函数名(参数列表):函数名必须与类名相同. 作用: ...

  3. javascript工厂模式和构造函数模式创建对象

    一.工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程(本书后面还将讨论其他设计模式及其在JavaScript 中的实现).考虑到在ECMAScript 中无法创 ...

  4. JS继承之借用构造函数继承和组合继承

    根据少一点套路,多一点真诚这个原则,继续学习. 借用构造函数继承 在解决原型中包含引用类型值所带来问题的过程中,开发人员开始使用一种叫做借用构造函数(constructor stealing)的技术( ...

  5. PHP与JAVA构造函数的区别

    早期的PHP是没有面向对象功能的,但是随着PHP发展,从PHP4开始,也加入了面向对象.PHP的面向对象语法是从JAVA演化而来,很多地方类似,但是又发展出自己的特色.以构造函数来说,PHP4中与类同 ...

  6. C++ 拷贝构造函数和赋值运算符

    本文主要介绍了拷贝构造函数和赋值运算符的区别,以及在什么时候调用拷贝构造函数.什么情况下调用赋值运算符.最后,简单的分析了下深拷贝和浅拷贝的问题. 拷贝构造函数和赋值运算符 在默认情况下(用户没有定义 ...

  7. golang语言构造函数

    1.构造函数定义 构造函数 ,是一种特殊的方法.主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中.特别的一个类可以有多个构造函数 ,可根据其参数个 ...

  8. 前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型

    前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型 前言(题外话): 有人说拖延症是一个绝症,哎呀治不好了.先不说这是一个每个人都多多少少会有的,也不管它究竟对生活有多么大的 ...

  9. Aop动态生成代理类时支持带参数构造函数

    一.背景 在某些情况下,我们需要植入AOP代码的类并没有默认构造函数.那么此时动态生成的代理类也需要相同签名的构造函数,并且内部调用原始类的构造函数.自己折腾了1晚上没搞定,现在搞定了发出来供大家一起 ...

随机推荐

  1. php+js实现百度地图多点标注的方法

    本文实例讲述了php+js实现百度地图多点标注的方法.分享给大家供大家参考,具体如下: 1.php创建json数据 ? 1 2 $products = $this->product_db-> ...

  2. win7使用经验-调整cmd窗口大小

    分享一个调整cmd窗口的方法: 1.右击标题栏空白处,选择属性 2.选择布局栏 3.修改屏幕缓冲区大小的宽度和高度(自定义) 4.确定 注意:这里的缓冲区大小是指用户可拖动缩放的范围,并不是cmd窗口 ...

  3. pycharm解决无法调用同文件夹下的文件

    一.将所有的文件放在project这个根目录下面 二.添加一个空的__init__.py 文件 三.选中project根目录,点击右键选择make_directory as-->sources ...

  4. JAVA ——int 类型除法保留两位小数

    @Test public void txfloat() { // TODO 自动生成的方法存根 int a=9; int b=7; DecimalFormat df=new DecimalFormat ...

  5. 洛谷P1832 A+B Problem(再升级) [2017年4月计划 动态规划03]

    P1832 A+B Problem(再升级) 题目背景 ·题目名称是吸引你点进来的 ·实际上该题还是很水的 题目描述 ·1+1=? 显然是2 ·a+b=? 1001回看不谢 ·哥德巴赫猜想 似乎已呈泛 ...

  6. 洛谷 3398 仓鼠找sugar——树链剖分

    题目:https://www.luogu.org/problemnew/show/P3398 原来只要把值记录成第几次就行了. 别忘了while(top[a]!=top[b])之后还要走一步. #in ...

  7. mybatis-plus思维导图,让mybatis-plus不再难懂

    mybatis-plus与mybatis mybatis Mybatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置 ...

  8. request与response的乱码问题的总结及解决方法

    一. response的乱码问题: 1,使用   字节流  向页面输出中文: 不一定会出现乱码,因为中文字节数组默认是GBK,如果浏览器打开的默认编码也是GBK,就不会出现乱码,否则会乱码. 解决办法 ...

  9. AudioToolbox.framework框架学习

    http://quding0308.iteye.com/blog/1596710 AudioFile AudioFileStream类 提供了一个接口,用来解析一个流音频文件. //创建一个new s ...

  10. 【JZOJ4921】【NOIP2017提高组模拟12.10】幻魔皇

    题目描述 幻魔皇拉比艾尔很喜欢斐波那契树,他想找到神奇的节点对. 所谓斐波那契树,根是一个白色节点,每个白色节点都有一个黑色节点儿子,而每个黑色节点则有一个白色和一个黑色节点儿子.神奇的节点对则是指白 ...