[toc]

一、多文件结构

1、一个工程可以划分为多个源文件

  • 类声明文件(.h文件)
  • 类实现文件(.cpp文件)
  • 类的使用文件(main函数所在的.cpp文件)

2、利用工程来组合各个文件

//Point.h ,类的定义
#ifndef POINT_H
#define POINT_H

class Point {
public:
	Point(int x = 0, int y = 0) : x(x), y(y) { count++; }
	Point(const Point &p);
	~Point() { count--; }
	int getX() const { return x; }
	int getY() const { return y; }
	static void showCount();
private:
	int x, y;
	static int count;
//不能在类体中声明时初始化类的数据成员
//建议在类的构造函数中初始化数据成员
//只有整型或enum类型的 static const 数据成员可以在类体中初始化
};

#endif
//用预处理指令#ifndef、#define、#endif形成一个预处理器包装,可以防止将头文件多次包含在一个程序中
//Point.cpp ,类的实现
#include"Point.h"
#include<iostream>
using namespace std;

int Point::count = 0;    //静态数据成员在类体外定义并初始化

Point::Point(const Point &p) : x(p.x), y(p.y) {    //复制构造
	count++;
}

void Point::showCount() {
	cout << "  Object count = " << count << endl;
}
//5_10.cpp,主函数
#include"Point.h"
#include<iostream>
using namespace std;

int main() {
	Point a(4, 5);
	cout <<"Point A: "<<a.getX()<<", "<<a.getY();
	Point::showCount();
	Point b(a);
	cout <<"Point B: "<<b.getX()<<", "<<b.getY();
	Point::showCount();
	return 0;
}

1)外部变量
如果一个变量除了在定义它的源文件中可以使用外,还能被其它文件使用,那么就称这个变量是外部变量
文件作用域中定义的变量,默认情况下都是外部变量,但在其它文件中如果需要使用这一变量,需要用 extern 关键字加以声明
2)外部函数
所有类外声明的函数(也就是非成员函数),都具有文件作用域
可以在不同的编译单元中被调用,只要在调用声明函数原型即可。也可以在声明函数原型或定义函数时用 extern 修饰,其效果与不加修饰的默认状态是一样的
3)将变量和函数限制在编译单元内
使用匿名的命名空间:在匿名命名空间中定义的变量和函数,都不会暴露给其它的编译单元
被 " namespace { …… } " 括起的区域属于匿名的命名空间

namespace {	//匿名的命名空间
	int n;
	void f() { n++; }
}

4)标准C
标准 C
类库是一个极为灵活并可扩展的可重用软件模块的集合
标准 C++ 类与组件在逻辑上分为6种类型:

  • 输入/输出类
  • 容器类与抽象数据类型
  • 存储管理类
  • 算法
  • 错误处理
  • 运行环境支持

二、编译预处理

习惯上,预处理指令中的符号常量通常是大写的头文件名,并用下划线替代句点
1、#include 包含指令
将一个源文件嵌入到当前源文件中该点处
#include<文件名>
–  按标准方式搜索,文件位于 C++ 系统目录的 include 子目录下
#include"文件名"
–  首先在当前目录中搜索,若没有,再按标准方式搜索

2、#define 宏定义指令
定义符号常量,很多情况下已被 const 定义语句取代
定义带参数宏,已被内联函数取代
#undef:删除由 #define 定义的宏,使之不再起作用

3、条件编译指令
1)#if 和 #endif

#if(常量表达式)
	程序正文    //当"常量表达式"非零时编译
#endif

2)#else

#if(常量表达式)
	程序正文1    //当"常量表达式"非零时编译
#else
	程序正文2    //当"常量表达式"为零时编译
#endif

3)#elif

#if(常量表达式1
	程序正文1	//当"常量表达式1"非零时编译
#elif(常量表达式2)
	程序正文2	//当"常量表达式2"非零时编译
#else
	程序正文3	//其他情况下编译
#endif

4)#ifdef & #ifndef

#ifdef 标识符
	程序段1
#else
	程序段2
#endif
//如果"标识符"经#defined定义过,且未经undef删除,则编译程序段1;否则编译程序段2

#ifndef 标识符
	程序段1
#else
	程序段2
#endif
//如果"标识符"未被定义过,则编译程序段1;否则编译程序段2

最新文章

  1. 《PDF.NE数据框架常见问题及解决方案-初》
  2. jvm运行机制与内存管理
  3. python之map、filter、reduce、lambda函数 转
  4. C语言 后缀自增的优先级详解
  5. 8个开发必备的PHP功能
  6. Android实现多页左右滑动效果,支持子view动态创建和cache
  7. oracle 自定义函数
  8. Android开发常见问题及解决方法
  9. Hadoop学习记录(4)|MapReduce原理|API操作使用
  10. 我的 ubuntu 12.04.2修复Grub
  11. 功能性AI术语表
  12. bzoj1934
  13. css实现背景模糊,但不影响背景上的内容
  14. 使用gitflow流程完成功能时报错
  15. fusioncharts的3D饼图固定大小和角度
  16. 有效的括号(Java实现)
  17. awt多线程聊天
  18. .net core Kestrel宿主服务器自定义监听端口配置
  19. EXTJS4 Grid Filter 插件的使用 与后台数据解析------Extjs 查询筛选功能的实现
  20. PTA——数列求和

热门文章

  1. CodeForces Educational Codeforces Round 51 (Rated for Div. 2)
  2. Redis集群下过期key监听
  3. 2019本科se第一次作业-博客初体验-chris
  4. Invalid bound statement (not found): com.taotao.mapper.TbItemMapper.selectByExample问题解决
  5. cobbler高可用方案
  6. python SSTI利用
  7. 松软科技课堂:数据库-主键(PrimaryKey)
  8. 第1次作业:使用Packet Tracer分析HTTP数据包
  9. 字符串之————图文讲解字符串排序(LSD、MSD)
  10. 初学者-asp.net三层架构