C++构造函数和文件组织
构造你的函数
在 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++构造函数和文件组织的更多相关文章
- Vue源码探究-源码文件组织
Vue源码探究-源码文件组织 源码探究基于最新开发分支,当前发布版本为v2.5.17-beta.0 Vue 2.0版本的大整改不仅在于使用功能上的优化和调整,整个代码库也发生了天翻地覆的重组.可见随着 ...
- .NET 基础 一步步 一幕幕[面向对象之构造函数、析构函数]
构造函数.析构函数 构造函数: 语法: //无参的构造函数 [访问修饰符] 函数名() :函数名必须与类名相同. //有参的构造函数 [访问修饰符] 函数名(参数列表):函数名必须与类名相同. 作用: ...
- javascript工厂模式和构造函数模式创建对象
一.工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程(本书后面还将讨论其他设计模式及其在JavaScript 中的实现).考虑到在ECMAScript 中无法创 ...
- JS继承之借用构造函数继承和组合继承
根据少一点套路,多一点真诚这个原则,继续学习. 借用构造函数继承 在解决原型中包含引用类型值所带来问题的过程中,开发人员开始使用一种叫做借用构造函数(constructor stealing)的技术( ...
- PHP与JAVA构造函数的区别
早期的PHP是没有面向对象功能的,但是随着PHP发展,从PHP4开始,也加入了面向对象.PHP的面向对象语法是从JAVA演化而来,很多地方类似,但是又发展出自己的特色.以构造函数来说,PHP4中与类同 ...
- C++ 拷贝构造函数和赋值运算符
本文主要介绍了拷贝构造函数和赋值运算符的区别,以及在什么时候调用拷贝构造函数.什么情况下调用赋值运算符.最后,简单的分析了下深拷贝和浅拷贝的问题. 拷贝构造函数和赋值运算符 在默认情况下(用户没有定义 ...
- golang语言构造函数
1.构造函数定义 构造函数 ,是一种特殊的方法.主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中.特别的一个类可以有多个构造函数 ,可根据其参数个 ...
- 前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型
前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型 前言(题外话): 有人说拖延症是一个绝症,哎呀治不好了.先不说这是一个每个人都多多少少会有的,也不管它究竟对生活有多么大的 ...
- Aop动态生成代理类时支持带参数构造函数
一.背景 在某些情况下,我们需要植入AOP代码的类并没有默认构造函数.那么此时动态生成的代理类也需要相同签名的构造函数,并且内部调用原始类的构造函数.自己折腾了1晚上没搞定,现在搞定了发出来供大家一起 ...
随机推荐
- php+js实现百度地图多点标注的方法
本文实例讲述了php+js实现百度地图多点标注的方法.分享给大家供大家参考,具体如下: 1.php创建json数据 ? 1 2 $products = $this->product_db-> ...
- win7使用经验-调整cmd窗口大小
分享一个调整cmd窗口的方法: 1.右击标题栏空白处,选择属性 2.选择布局栏 3.修改屏幕缓冲区大小的宽度和高度(自定义) 4.确定 注意:这里的缓冲区大小是指用户可拖动缩放的范围,并不是cmd窗口 ...
- pycharm解决无法调用同文件夹下的文件
一.将所有的文件放在project这个根目录下面 二.添加一个空的__init__.py 文件 三.选中project根目录,点击右键选择make_directory as-->sources ...
- JAVA ——int 类型除法保留两位小数
@Test public void txfloat() { // TODO 自动生成的方法存根 int a=9; int b=7; DecimalFormat df=new DecimalFormat ...
- 洛谷P1832 A+B Problem(再升级) [2017年4月计划 动态规划03]
P1832 A+B Problem(再升级) 题目背景 ·题目名称是吸引你点进来的 ·实际上该题还是很水的 题目描述 ·1+1=? 显然是2 ·a+b=? 1001回看不谢 ·哥德巴赫猜想 似乎已呈泛 ...
- 洛谷 3398 仓鼠找sugar——树链剖分
题目:https://www.luogu.org/problemnew/show/P3398 原来只要把值记录成第几次就行了. 别忘了while(top[a]!=top[b])之后还要走一步. #in ...
- mybatis-plus思维导图,让mybatis-plus不再难懂
mybatis-plus与mybatis mybatis Mybatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置 ...
- request与response的乱码问题的总结及解决方法
一. response的乱码问题: 1,使用 字节流 向页面输出中文: 不一定会出现乱码,因为中文字节数组默认是GBK,如果浏览器打开的默认编码也是GBK,就不会出现乱码,否则会乱码. 解决办法 ...
- AudioToolbox.framework框架学习
http://quding0308.iteye.com/blog/1596710 AudioFile AudioFileStream类 提供了一个接口,用来解析一个流音频文件. //创建一个new s ...
- 【JZOJ4921】【NOIP2017提高组模拟12.10】幻魔皇
题目描述 幻魔皇拉比艾尔很喜欢斐波那契树,他想找到神奇的节点对. 所谓斐波那契树,根是一个白色节点,每个白色节点都有一个黑色节点儿子,而每个黑色节点则有一个白色和一个黑色节点儿子.神奇的节点对则是指白 ...