C++ primer plus 第九章总结

包含自己编写的头文件的时候应该使用“”而不是<>;

储存持续性、作用域、和链接性

c++中有四种方案来储存数据

  • 自动存储的持续性:在函数定义中声明的变量(包含函数参数)的存储持续性为自动的。它们在程序开始执行其所属的函数或代码块时被创建,在执行完函数或者代码块时,他们使用的内存就被释放,C+有两种储存持续性为自动的变量
  • 静态储存的持续性:在函数定义外定义的变量和使用关键字static定义的变量的存储持续性都为静态,他们在整个程序的运行过程中都存在,C++有三种存储持续性为静态的变量
  • 线性储存持续性:(C++11)中,当前,多核处理器很常见,这些CPU可同时处理多个执行任务。这让程序能够将计算放在可并行的不同线程中。如果变量使用了关键字thread_local声明的,则其生命周期与所属的线程一样长
  • 动态储存持续性:用new运算符分配的内存将一直存在,直到使用delete运算符将其释放或者程序结束。这种内存的存储持续性为动态,有时候被称为自由存储或者堆

作用域和链接

自动变量的作用域为局部的,静态变量的作用是全局还是局部取决于他是如何被定义的。

自动存储的持续性

在函数中声明的参数或者变量的作用域为局部,存储持续性为自动。如果在函数内部和外部都声明了同名变量,在这种情况下,程序在执行到局部代码块(函数内部)时,使用函数中定义的变量,在执行完函数后,使用函数外定义的变量。代码解释如下

#include <iostream>
using namespace std;
void test(void);
int main()
{
	int i=50;
	cout << i << endl;
	test();
	cin.get();
	return 0;
}
void test(void)
{
	int i=5;
	cout << i << endl;
}

        这个代码的输出结果为 50

                                              5

自动变量的初始化:自动变量一定要初始化,如果不初始化的话,自动变量会是其所在内存中原本存储的值。自动变量存储在栈中,栈的特点是后进先出,我们可以用一个图来解释栈的特点:

                 

寄存器变量

使用关键字  redgister 就可以定义寄存器变量,这可以提高访问变量的速度       

静态持续变量                    

静态持续变量的三种链接性:外部链接性,内部链接性,无链接性。与自动变量相比,他的寿命更加长。

如果我们没有对静态变量进行初始化,那么编译器会自动把变量初始化为0;

如果我们在函数中使用static关键字,那么所定义的变量就为静态变量,但是它没有链接性,也就是说,他只能在所定义的函数中使用。如果我们在函数外定义静态变量,就是我们平常所说的全局变量(不带有static),那么这个变量的链接性是外部的,可以在程序的其他文件中使用,但是我们加上static,可以改变这个变量的链接性,它的链接性就从外部变成了内部。

我们用下面例子说明

比如我们在file.c中定义了一个全局变量     int a=0;  我们可以在file2.c中使用a, 只需要使用关键字 extern便可,如下 entern int a;但是,我们如果是在file.c中定义的是这样的  static int a=0;那么,我们在file2.c是不可以使用extern int a的,但是我们可以使用static int a=0;这两个文件中的a是完全不相干的两个变量,这就是链接性为内部与外部的区别,这儿,第一个例子中a的链接性为外部,第二个例子的链接性为内部。

说明符和限定符

说明符

  • auto  
  • rigister
  • static
  • extern
  • thread_local
  • mutable

常用的几个限定符就不说了,就解释一下一个不常见的

mutable  指出即使结构或者类为const类型,其某个成员变量也可以被修改

CV限定符

CV限定符就是const,violate两个限定符

violate:表示即使代码没有对内存单元进行修改,其值也可能发生改变;大家看下面这段文字

const限定符除了使变量不可改变之外,还可以改变变量的链接性,一般全局变量的链接性为外部的,但是const全局变量的链接性为内部。

函数的链接性

函数的存储持续性自动为静态的,可以使用extern 表示函数是外部定义的,可以用static 限定函数的链接性为内部。

存储方案的动态分配

使用new初始化变量

int *pi=new int (6)      //初始化pi=6

double *pd=new double(99.99);

定位new运算符

定位new运算符可以在指定位置找到一个内存块。

char buffer1[50]

int *p2=new(buffer1) int;  //代表着p2在buffer1[50]地址中。

名称空间

名称空间的创建

namespace Jack

{

int fetch=112;
}

名称空间是可以嵌套的,可以在名称空间中添加名称空间;

名称空间的使用方法

using 声明和using编译指令

using声明格式可以如下

using  Jack::fetch

这句话只可以使用名称空间中的fetch。

也可以using namespace jack 这样子名称空间中的都可以用了。

猜你喜欢

转载自blog.csdn.net/weixin_41271939/article/details/87955819