股票

C++文件、变量、内存、变量空间

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,最好使用局部的空间而不是用全局空间。

打赏
原文链接:,转发请注明来源!

发表评论