1. C++存储区域
我们在程序开发中将C++存储区域分为以下几步:
1、栈区(stack)— 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放,若程序员不释放,程序结束时可能由系统回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表
3、全局区(静态区)(static),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 程序结束后由系统释放
4、文字常量区 —常量字符串就是放在这里的。程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
2.头文件中常包含的内容
  函数原型。
  使用#define或const定义的符号常量
  结构声明。
  类声明。
  模板声明。
  内联函数。
3.头文件管理(防止重复包含)
  #ifndef  COORDIN_H_
  #define  COORDIN_H_
  //Place include file contents here
  #endif
4.多个库的链接
  C++标准允许每个编译器设计人员以他认为合适的方式实现名称修饰,因此由不同编译器创建的二进制模块(对象代码文件)很可能无法正确链接。在编译链接模块式,请确保所有对象文件或库都是由同一个编译器生成的。
5.存储连续性、作用域和链接性
  (1)存储连续性
    自动存储连续性:在函数定义中声明的变量(包括函数参数)
    静态存储连续性:在函数定义外定义的变量和使用关键字static定义的变量
    动态存储连续性:用new操作符分配的内存,知道delete操作符时释放。
  (2)作用域
    局部作用域:只在定义它的代码块中可用。auto,register。寄存器变量是另一种形式的自
动变量。CPU访问寄存器中值的速度比访问堆栈中内存快。如果变量被存在寄存器中(声明中只要使用了register),则没有内存地址,不能将地址操作符用于寄存器变量。
    全局作用域(文件作用域):从定义位置到文件结尾之间都可用。
    在类中声明的成员的作用域为整个类。
    在名称空间中声明的变量的作用域为整个名称空间。
    函数的作用域是整个类或整个名称空间(不能再代码块内定义函数)。
(3)链接性
    内部链接性:只能由一个文件中的函数共享
    外部链接性:可在文件间共享
6.静态变量
    静态变量有三种链接性:外部、内部、无。
    外部链接性:在代码块的外面声明(也称为全局变量)
    内部链接性:在代码块的外面声明,并使用static限定符
    无链接性:在代码块内声明,并使用static限定符
    如果文件定义了一个静态外部变量,其名称与另一个文件中声明的常规外部变量相同,则在该文件中,静态变量将隐藏常规外部变量。
7.定义和声明
    定义声明(称为定义)和引用声明(称为声明)。static修饰的变量
    仅当声明将为变量分配存储空间时(即定义声明),才能在声明中初始化变量。
8.类的静态数据成员
对于非静态数据成员,每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员。无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷贝,由该类型的
所有对象共享访问。静态数据成员在没有产生类对象时其作用域就可见,即在没有产生类的实例时就可以操作它。
静态数据成员和普通数据成员一样遵从public,protected,private访问规则。
静态成员变量要实际的分配空间,所以不能在类声明中定义。类声明只声明一个类的尺寸和规格,并不进行实际的内存分配,所以在类声明中写成定义是错误的。它也不能在头文件中类声明的外部定义,因为那会造成在多个使用该类的源文件中,对其重复定义。
因此静态成员变量应该在类中声明,格式为:
static  ElemType  VarName;
    在使用该静态变量的cpp文件中定义并初始化,格式为:
ElemType  ClassName::VarName=**;
使用的格式为:
ClassName::VarName
9.类的静态成员函数
    普通的成员函数一般都隐含了一个this指针,this指针指向类的对象本身,因为普通成员函数总是具体的属于某个类的具体对象的。通常情况下,this 是缺省的。如函数fn()实际上是this->fn()。但是与普通函数相比,静态成员函数由于不是与任何的对象相联系,因此它不具有this指针。
出现在类体外的函数定义不能指定关键字static,static是声明性关键字。
静态成员函数可以继承和覆盖,但无法是虚函数
(1) 静态成员函数只能访问静态数据成员和静态成员函数;
(2) 非静态成员函数可以任意地访问静态成员函数和静态数据成员。
10.const变量
    const全局变量的链接性为内部的,如果出于某种原因希望某个常量的链接性是外部的,则可以使用extern关键字来覆盖默认的内部链接性。
    extern const int states=10; (const变量定义时必须初始化)
11.函数
所有函数的存储持续性都自动为静态的,即在整个程序执行期间都一直存在。在默认情况下,函数的链接性为外部的,即可以在文件间共享。还可以使用关键字static将函数的链接性设置为内部的,使之只能在一个文件中使用。必须同时在原型和函数定义中使用该关键字。与变量一样,静态函数将覆盖外部定义。
    对于每一个非内联函数,程序中只能包含一个定义。对于链接性为外部的函数来说,只能有一个文件包含该函数的定义,但使用该函数的每个文件都应该包含其函数原型。
12.内存动态分配
    动态内存由new和delete控制,而不是由作用域和链接性规则控制。因此因此可以在一个函数中分配动态内存,而在另一个函数中释放它。
    虽然存储方案概念不适用于动态内存,但是适用于用来跟踪动态内存的自动和静态指针变量。
13.布局new操作符
    New操作符还有另一种变体,布局new操作符。它让你能够指定要使用的位置。要包含头文件new。
struct s1{};
    char buffer[50];
    s1 *p1=new s1;
    s1 *p2=new (buffer) s1;
    delete只能用于这样的指针:指向常规new操作符分配的堆内存。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。