1,文件分割
把一个单独的文件分隔成几个部分,一般式按功能划分。
file.h 存放数据类型、函数声明等;
file.cpp 存放函数定义,要包含头文件“file.h”;
usefile.cpp 主函数位置,包括函数调用,逻辑分配,要包含头文件“file.h”,编译的时候与file.cpp一起编译。
文件分隔的好处是功能比较清晰,便于添加、删除、修改函数。
2,变量的作用域
a,函数内临时变量:(int x; double y;)
1)定义在块内的,作用域仅限于块内;
2)定义在函数内的,作用域从定义开始到函数结束;
默认初始化值随机。
b,全局变量((函数外)int x;)
在所有文件中所有函数均可以调用,默认初始化值为0,一般定义在file.cpp文件中,可以在file.h引用,方法为:extern int x;表明函数在别处定义,但是只能初始化一次,即定义的时候初始化。其余的文件调用时,比如usefile.cpp需要调用,直接#include”file.h”即可。每次调用时,值为上次调用后的值。
c,函数内静态变量:(static int x; static double y;)
默认初始化值为0,仅在函数内起作用,但是保存在程序栈中,每次进入函数调用时不会初始化变量值,直接调用上次保存的值。类似于全局变量,但是作用域仅限于函数内(函数外不能调用)。
d,文件内静态变量:((函数外)static int x;)
类似于全局变量,但是作用域在定义的文件内,本文件内的所有函数均可以调用,文件外的函数不能访问。
e,const定义常量(const int x=10;)
使用const定义常量时,如果是在file.cpp中定义,默认相当于static const int x=10;即只在文件内起作用。但是可以定义在file.h中,这样每个.cpp文件引用的时候都可以使用了。
3,new操作符
一般用法是给数据类型分配内存,使用结束后要使用delete释放内存。
int * pi = new int (6); // *pi设置为6
double * pd = new double (99.99); // *pd设置为99.99
struct where {double x; double y; double z};
注意:()表示给内存分配值!!!
where * one = new where {2.5, 5.3, 7.2}; // C++++11
int * ar = new int [4] {2, 4, 6, 7}; // C++++ 11
注意:[]表示分配了多少单位的内存
int * pin = new int {6}; // *pin 设置为6
double * pdo = new double {99.99}; // *pdo设置为99.99
注意:没有[],默认是一个单位,{}表示分配的值。
释放已经分配的内存
delete [] ar;
只有一个单位时,[]可以省略。
特别用法:分配内存到已经分配了内存的位置
char buffer[512]; // 全局变量
function()
{
int *p1;
p1 = new (buffer) int [20];
}
在buffer的内存空间分配20个int类型的内存空间,起始地址为buffer。
如果想从buffer偏移n个地址类型,使用buffer+n。
这种方法分配的内存无法释放,下次使用覆盖即可,不会造成内存泄露。
4,命名空间(namespace)
命名空间的作业是把文件内的变量声明、函数声明等按功能或者相关性分割成几块,便于管理。
在.h文件中声明
[task]
namespace pers
{
struct Person
{
std::string fname;
std::strign lname;
};
void getPerson(Person &);
void showPerson(const Person &);
}
name space debts
{
using namespace pers;
struct Debt
{
Person name;
double amount;
};
void getDebt(Debt &);
void showDebt(const Debt &);
}
[/task]
然后再.cpp文件中依次对函数进行定义。
namespace pers
{
void getPerson(Person &);
{……}
void showPerson(const Person &);
{……}
}
namespace debts
{
void getDebt(Debt &)
{……}
void showDebt(const Debt &)
{……}
}
最后调用的时候使用using namespace peers; 或者pers::getPerson();导入命名空间内的变量和函数,然后就可以自由调用。
命名空间可以嵌套。
命名空间使用注意事项:
a,可以使用有名称的命名空间中的变量代替全局变量;
b,可以使用没有名次的命名空间中的变量代替本地变量;(因命名空间没有名次,文件外无法引用)
c,定义函数、变量的时候尽量使用命名空间;
d,使用using命令调用命名空间时,相同名字的函数、变量等会被命名空间中的函数变量代替;
e,不要在.h文件中使用using命令,因为在包含的时候有可能把之后相同名字的变量、函数全部替代掉;
f,最好使用::操作符或者using命令使用命名空间;
g,最好使用局部的空间而不是用全局空间。