基于C++premier plus第九第十章总结记录
第九章 内存模型与名称空间
一、单独编译
(1)c++允许独立编译一个程序之下的不同文件再将他们进行连接<方便管理>
(2)通过编写引入头文件的方法便于组织程序文件,头文件中通常包括:函数原型/使用#define或const定义的符号常量/结构声明/类声明/模板声明/内联函数。不定义占据内存的内容防止重复引入的定义。
(3)自定义的头文件在引入时使用#include "mydeclare.h"表示为自定义头文件优先检索当前目录
(4)在IDE中不要将头文件加入项目列表,也不要在源代码文件使用#include来包含其他源文件
(5)使用$ifndef 用来唯一标示该头文件的常量如CORRDIN_H_
#define CORRDIN_H_
头文件编写
#endif
来解决无意识的头文件重复引入
(6)由不同编译器创建的二进制模块(对象代码文件)可能无法正确进行连接
二、存储特性
1.分为持续性<存在周期>/作用域<存在区域>/链接<如何在不同单元间共享>
2.自动存储:代码块中存在、可见<实际存于栈>。不能被共享;auto在旧版本中表示显式创建自动变量<现在仍有register关键字起该作用>,现在变更为自动同步初始化类型。
3.静态存储:存在于整个程序运行<不需要管理所以存在内存块>,未初始化也会被默认设置为0值(结构其成员被填充0值)
(1)代码块外声明变量为外部链接型静态变量,可以在包括外部文件的所有程序部分访问。外部文件引用需要先通过extern声明且不初始化(否则屏蔽)。一个多文件程序不可有多个同名外部变量。
(2)代码块外声明为static变量为内部链接型静态变量,可以在整个声明文件中访问。
(3)代码块内声明为static变量为无连接的静态变量,不允许被其他单元访问但是始终存在<仅在初次时初始化一次>(可以被自身代码块访问)。
(4)作用域解析运算符::放在变量前表示使用该变量名的全局解释。
4.线程存储:可附加在任何存储声明之上的thread_local关键字,该类变量存活于该线程的生存周期中
5.动态存储:即使用new开辟存储而使用delete消除的变量
6.其他存储说明符、cv限定符
(1)volatile:编译器在多次需要同一变量时可能会假设其值不会自行变化而进行缓存(而非多次搜索)。使用该关键词告知编译器该值会自行变更,禁止这种优化。
(2)mutable:用来标识类或结构成员,表示即便该对象/结构是const的,该成员也允许改动。
(3)const补充:使用了const标识的外部变量(如int a;)会被认为是内部链接的而非外部链接的
(4)头文件中定义const常量可以不extern的直接进行引入使用(当做内连接),如果想要覆盖此特性,在定义时需要在变量前加上extern标识
7.函数一定是静态的(不允许嵌套),且默认是外链接的(要定义成内部的需要在原型和定义都加入static)
//in file multi.h
void show();
const int a=1;
//in file multirea.cpp
#include "multi.h"
#include <iostream>
using namespace std;
void show(){
cout<<a;
}
//in file multimain.cpp
#include "multi.h"
using namespace std;
int main(){
show();
return 0;
}
输出为1,证明函数可以跨文件直接使用,且const常量可以跨文件直接使用文件头
8.编译器通常使用三块独立内存,一块用于静态变量,一块用于自动变量,一块用于动态变量
9.动态变量的创建
(1)int * a=new int(6);
(2)int *a=new int{6};
(3)int *a=new int[4]{1,2,3,4};结构也是这么创建
10.new的变体用法p4=new(buffer1) chaff;手动要求从内存buffer(含内存块的变量)分配空间给结构chaff并用指针p4指向他。
11.不可以用delete释放定位作用的new空间。
三、名称空间
1.形如namespace jack{名称空间内容;},名称空间可以是全局的也可以位于另一个名称空间中,但不能位于代码块中。(因此默认名称空间内容为外部的)
2.在名称空间外存在全局名称空间,任何名称空间中的名称不会与其他名称空间的名称冲突。
3.名称空间是开放的,可以再次打开已有名称空间为其增加内容
4.访问名称空间内容:
(1)使用作用域解析运算符如jack::pail=12.34;
(2)using声明,形如using jack::fetch();该作用域下的fetch()将会被自动理解为jack下的。相当于进行一般声明,不可对该域已存在内容使用。
(3)using编译指令,形如using namespace jack;使该名称空间中所有名称在该作用域下都可用。相当于从外部引入,有与内部冲突项会屏蔽,仍可用作用域解析符。
5.名称空间其他特性:
(1)可进行名称空间声明的嵌套
(2)可通过名称空间创建别名简化语句如namespace MEF=myth::elements::fire;
(3)可在命名空间using,此时使用该命名空间也会得到这个using
6.省略命名空间名创建匿名名称空间可以起到替代静态内链接变量的效果
四、编程习惯补充!
1.请减少using编译的使用,多使用using声明
2.命名冲突时需要考虑命名空间使用的漏洞
3.请使用命名空间的成员替代外部全局变量、内部全局变量的使用
4.最好不要在头文件中使用using
5.using最好用在局部而不是全局
第十章 对象和类
一、概述面向对象编程
(1)最重要的oop特性:抽象/封装和数据隐藏/ 多态/继承/代码可重用性
(2)过程性编程考虑步骤而oop首先考虑数据(描述对象所需要数据以及用户与对象进行交互所需的操作)
(3)类是一种将抽象转换成用户定义类型的c++工具,将数据表示和数据操作简洁集成
(4)类规范通常由两部分组成:类声明(以数据成员方式描述数据部分,以成员函数方式描述公有接口)。通常类声明写在头文件,而类方法定义写在源文件中
二、类的基本知识
1.访问控制:
(1)使用类对象的程序都可以直接访问公有部分(public),但只能通过公有成员函数(或友元函数)来访问对象的私有成员
(2)不声明public时,默认的成员类型就是private,可以不特意声明。
补充:结构特可以进行类似的访问控制,不过在结构中默认的权限设置是public
(3)还有protectrd和friend的情况将在后续补充
2.类成员函数的特征:
<1>类外定义需要使用::作用域解析运算符标识所属,形如void Stock::show(参数){实现;}
<2>类方法可以访问类的private组件
<3>被定义在类声明当中的方法自动成为内联函数,而定义在声明外的需要显式使用inline
3.对象调用成员形如对象名.成员名<若是函数需要参数列表>,对象指针调用成员形如指针名->成员名<若是函数需要永道参数列表>
4.构造函数:定义时与类同名,无返回值,在创建类对象时自动调用。使用形如Stock garment=Stock(参数);得到对象garment或形如Stock * p=new Stock(参数);得到无名但是有指针指向的对象
(1)构造函数默认是个空方法,且一旦定义任何构造函数就不再提供默认构造函数。
(2)构造函数无法通过对象主动调用
5.析构函数:对象过期时会自动调用的方法,默认空方法,常用于delete释放由new开辟的内存。形如~类名。
6.类对象的赋值和结构一样,会是值的覆盖
7.c++11的列表初始化:Stock hot_tip={构造用参数};/Stock jock{构造用参数};
8.成员函数的const:将const的关键字放在成员函数后面,表示该成员函数不会修改对象,此时const对象才能调用该方法(const对象无法调用非const的成员方法)
9.只接受一个参数的构造方法允许使用赋值语句进行对象初始化,形如classname object =value;(该特性可以关闭,见第11章)
三、this指针
1.this指针指向用来调用该方法的对象,其方法内的成员其实this->方法名的简写
2.return *this;表示返回当前调用方法的对象本身。
四、对象数组
1.定义方法与标准类型数组一致。形如Stock stocks[4]={Sotck(构造参数),Sotck(构造参数),Sotck(构造参数),Sotck(构造参数)};
2.初始化对象数组是先创建默认对象再根据设定内容复制过去,所以创建对象数组的对象必须有默认构造方法
五、类作用域
1.类成员作用域只是整个自身类,哪怕是公有成员也必须通过该类对象进行访问
2.用类(而不是对象)保存常量的两种方法:在其中声明枚举常量(调用时会自动转换成数值)/在其中用static关键字定义类变量(第十二章研究)
补充:(1)形如enum class(这个关键字可以替换成struct) egg(枚举常量);创建的枚举常量需要用作用域解析符进行使用,所以不会放生冲突
(2)常规枚举会自动转换到整型,但使用作用域内枚举不允许自动(隐式)转换,显式可以
(3)枚举的长度随系统而异,因为只知道其底层一定是某种整型,但可以通过形如enum class : short pizza{枚举常量};自定义底层
六、抽象数据类型:经常通过类实现抽象数据类型的声明(如栈)
![](https://i-blog.csdnimg.cn/blog_migrate/4123d17d7acffdda679b6d6305eb3f04.png)