您的位置:首页 > 其它

内存模型和名称空间

2014-03-05 14:54 246 查看
学习C++的一点总结

1.头文件管理

在同一个文件中只能将一个头文件包含一次,但在不知情的情况下可能犯错误。

C++有一种技术可以避免。它是基于预编译指令#ifndef(if not define)的。下面为代码段

#ifndef BANKUN_H_ //起一个不容易重复的名字,具有唯一性

#define BANKUN_h_

........中间的就是你的头文件内容

#endif //结束语句

2.存储连续性,作用域,链接性

2.1 自动存储连续性

这种声明的变量是自动的,程序开始执行所属函数或代码块时被创建,执行结束时,它使用的内存自动被释放。

它的作用域为局部,仅限于函数和代码块内。无链接性。

int main()

{

int i=1;//i即为这种自动变量,代码块结束时,变量消失。

cout<<i<<endl;

}

执行到代码块或函数时,代码块中的变量会隐藏同名的外部变量,函数或代码块结束时外部变量重新出现。

2.2静态持续变量

它有3种链接性,这3种链接性都在整个程序执行期间存在。

(1).外部链接性,这种链接性的实现必须在代码块的外面声明,int global=1000000;作用域为整个文件,程序的其他文件也可使用它,extern int global;

这里只是引用原来的变量,global的内存没有变化,因此也不能重新初始化赋值(extern int global=10;是错误的)。仅当声明为变量分配内存空间时,才能在声明中初始化。

可以使用const保护全局变量,禁止修改,const char * const months[12 ]={ ............};第一个const防止字符串修改,第二个const确保数组中每个指针指向他最初指向的字符串。

(2).内部链接性

同样必须在代码块外面声明static int intern1=100;必须加上static限定符。这种变量只能在所属的文件中使用。作用域为所属整个文件。

(3).无链接性

将限定符static用于代码块中定义变量。该变量只能在代码块内部使用,不过在代码块不活动时依然存在。在两次函数调用之间,此静态变量将保持不变,仅在程序启动时进行一次初始化,以后调用不在初始化,其值保持不变,可以用于调用一次累加一次值。

int global=1000000;//外部链接,全局变量

static int intern1=100;//内部链接

int main()

{

static int count=0;//无链接

}

3,new 操作符

3.1常规new

pd1=new int;

delete pd1;

pd2=new double
;

delete [ ] pd2;

分配与释放;

3.2布局new

char buffer[255];

pd3=new (buffer)double[5];

释放这种对象时,不能调用delete[]pd3,用于类时应直接调用析构函数,否则不用delete释放。

4名称空间

C++提供名称空间为了更好的控制名称的作用域。名称空间可以是全局的,也可以位于另一个名称空间,但不能位于代码块中。默认情况下,链接性为外部。

有两种不同的声明方式。

namespace Jack{

double pail;

void fetch;

int pal;

}

(1)using声明 using Jill::fetch;

(2)using编译指令 using namespace Jack;

一般来说using声明比使用using编译指令更安全,这是由于他只导入指定的名称。如果该名称与局部名称发生冲突,编译器会发出指示。using编译指令导入所有名称,包括可能不需要的名称。如果与局部名称发生冲突,则局部名称将覆盖名称空间版本,而编译器不会发出警告。

5名称空间极其前途

(1)使用在已命名的名称空间中声明的变量,而不是外部全局变量和静态全局变量。

(2)不要在头文件中使用using编译指令。

(3)导入名称时,首选使用作用域解析操作符或using声明方法。

(4)对于using声明,首选作用域设置为局部而不是全局。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: