C++学习笔记(3)
本学习笔记是C++ primer plus(第六版)学习笔记。是C++学习笔记(2)的后续。复习C++基础知识的可以瞄瞄。
转载请注明出处http://www.cnblogs.com/zrtqsk/p/3881141.html,谢谢!如下。
第九章
1、C++程序的组成——
(1)、头文件: 包含结构声明和使用这些结构的原型。
(2)、源代码文件: 包含与结构有关的函数的代码。
(3)、源代码文件: 包含调用与结构有关的函数的代码。
2、头文件——
(1)、常包含的内容: 函数原型;#define或const定义的符号常量;结构声明;类声明;模板声明;内联函数。
(2)、若文件名包含在尖括号中,编译器将在存储标准头文件的主机系统的文件系统中查找。
(3)、若文件名包含在双引号中,编译器首先查找当前的工作目录或源代码目录,再在标准位置查找。
(4)、同一个文件中只能将同一个头文件包含一次。用来忽略除第一次包含之外的所有内容。
头文件coordin.h中,常使用: #ifndef COORDIN_H_ define COORDIN_H_ /*头文件内容*/ #endif
3、编译过程——
(1)、命令: CC file1.cpp file2.cpp
(2)、预处理器将包含的文件(头文件之类的)和源代码合并。生成临时文件temp1.cpp和temp2.cpp
(3)、编译器创建每个源代码文件的目标代码文件:file1.o和file2.o
(4)、链接程序将目标代码文件、库代码和启动代码合并,生成可执行文件:a.out
(注意!链接编译模块的时候,请确保所有对象文件和库都是同一个编译器生成的。)
4、存储持续性——自动存储持续性、静态存储持续性、线程存储持续性(C++11)、动态存储持续性。
5、栈——栈中的数据在相邻的内存单元中
(1)、使用2个指针跟踪栈,一个指向栈底(栈的开始位置),一个指向栈顶(下一个可用内存单元)
(2)、新值没有被删除,但不再被标记。
6、链接性——
(1)、外部链接性,可在其他文件中访问。如: 函数外,不使用staitic定义的变量
(2)、内部链接性,只能在当前文件中访问。如: 函数外,使用static定义的变量
(3)、无链接性,只能在当前函数或代码块中访问。如: 代码块中定义的变量
(注意!所有的静态变量都会首先被零初始化,然后再选择动态、静态初始化。)
7、变量声明——
单定义规则 -> 变量只能有一次定义
(1)、定义声明(定义):给变量分配存储空间。
(2)、引用声明(声明):不分配空间,引用已有的变量。使用关键字extern,且不进行初始化。
(注意!要在多个文件中使用外部变量,应在一个文件中定义,其他文件中使用extern声明。)
(使用extern可以覆盖变量默认的内部链接性,使其变成外部的)
8、const char * const a[12] = { “a”,"b","c"... }; // 第一个const防止字符串被修改,第二个const确保数组中每个指针指向它最初指向的字符串。
这个指针的类型是 char * [12],即char类型的指针的数组,数组大小为12。第一个const修饰char *,第二个const修饰a[12]。所以。
9、说明符和限定符——
(1)、关键字thread_local: 指出变量的持续性和其所属的持续性相同。
(2)、const: 内存被初始化后,程序不能对它修改。const全局变量的链接性为内部的。
(3)、volatile: 每次都取值,不允许取值优化。
(4)、mutable: 即使结构(或类)变量为const,某个被mutable修饰的成员也可以被修改。
10、函数的链接性——所有函数的存储持续性都自动为静态的,链接性是外部的。可以使用static在原型和定义中将链接性设置为内部的。
11、使用new初始化——
int a = new int(5); //设置a的值为5. 比较之下,大括号初始化更方便和通用。
(new找不到请求的内存量、失败时,将引发异常std::bad_alloc)
(1)、运算符new实际上调用void * operator new ( std::size_t );
(2)、运算符new[] 实际上调用void * operator new[] ( std::size_t ); //这里std::size_t实际上是一个别名typedef,对应合适的整型。
12、定位new运算符——
能指定要使用的内存位置。不跟踪哪些内存单元未使用,也不查找未使用的内存块。
(1)如:#include <new> char buffer[50]; struct1 * s = new (buffer) struct1; //从buffer中分配struct1大小的内存。
13、名称空间——
相当于Java中的package,不过也有很多不同。
(1)、名称空间可以是全局的,也可以位于另一个名称空间中。
(2)、默认情况下,名称空间中声明的名称的链接性是外部的。
(3)、全局名称空间,对应文件级声明区域,全局变量位于此处。
(4)、名称空间是开放的,即可以将某些名称添加到已有的名称空间中,如: namespace qsk { char * name(const char* ); } //将这个名称添加到qsk中。
(5)、通过作用域运算符来限定各名称,如: cout << qsk::name << endl;
14、using声明和using编译指令——
(1)、using声明使得特定的标识符可用。(无须限定名称,直接使用)如: using std::cout;
(2)、using编译指令使得整个名称空间可用。(多了一个namespace)如: using namespace std;
(注意,不要在头文件中使用using编译指令。对于using声明,首选将其作用域设置为局部而不是全局。)
第十章
15、类——
(1)、类成员可以是数据也可以是函数。类声明时,用访问控制符来修饰。
(2)、定义成员函数时,使用作用域解析运算符(::)来表示函数所属的类。如 void Stock::update(double price){}
(它可以访问类的私有成员)
(3)、定义位于类声明中的函数,自动成为内联函数。
(4)、也可以在类外使函数成为内联函数,只需要在类实现中使用 inline 限定符,如: inline void Stock::update(double price){}
(5)、创建对象,如: Stock a,b; 也可以使用new为对象分配存储空间。如: Stock a = new Stock;
(6)、通过成员运算符来使用成员函数,如: a.show();
(7)、所创建的每一个对象都有自己的存储空间,用于存储其内部变量和类成员;所有对象公用一组类方法。
16、访问控制——private、public、protected
不必在类声明中使用关键字private,它是类的默认访问控制。
(注意!C++中,结构具有与类相同的特性,不过结构的默认访问类型是public。)
17、类设计——
(1)、提供类声明。
(2)、实现类成员函数。通常单独提供函数定义,通过(::)来制定函数属于哪个类。
18、类的构造函数——
专门用于构造新对象、将值赋予它们的数据成员。
(1)、构造函数的原型和函数头没有返回值,而且没有被声明为void类型。构造函数没有声明类型。
(2)、构造函数的参数表示的不是类成员,而是赋予他们的值,因此参数名不能与类成员相同。(与Java不同)
(常见的做法是在数据成员名使用m_前缀,或使用后缀_)
19、使用构造函数——
(1)、隐式调用: Stock s( "a", 22, 1.2); 或 Stock a;
(2)、显式调用: Stock s = Stock( "a", 22, 1.2);
(注意,构造函数的其他特征与Java类似。)
20、析构函数——对象过期时,程序自动调用的成员函数,用以完成清理工作。如: ~Stock();
(注意!如果对象通过new创建的,使用delete释放内存时,其析构函数被自动调用。)
21、对象赋值——默认情况下,一个对象赋值给同类型的另一对象时,会将源对象中每个数据成员的内容复制给目标对象。
(1)、初始化方式: Stock s = Stock("a", 22, 1.2); //可能创建临时变量。
(2)、赋值方式: s1 = Stock("a", 22, 1.2); //总会在赋值前创建一个临时变量。并且会自动为临时变量调用析构函数。
22、const成员函数——确定不修改对象的类方法。const关键字放在函数括号后面,如: void stock:: show() const;
23、C++11列表初始化——对于Stock jock {"abcd"}将匹配Stock::Stock(const std::string & co, long n = 0,double pr = 0.0);
而对于Stock c {};将匹配默认构造函数。
24、this指针——类方法中使用,this指针指向调用对象,为调用类方法的对象的地址。如需引用整个调用对象,可以使用*this。
25、对象数组——如: Stock s[4] = {Stock("a", 22, 1.2), Stock(), Stock("a", 22, 1.2)};
//这里首先使用默认构造函数创建数组元素,然后花括号中的构造函数创建临时对象,然后临时对象的内容被复制到相应元素中
(注意!创建类对象数组,这个类必须有默认构造函数。)
26、作用域为类的常量——
(1)、类中声明的枚举,作用域为整个类,不属于对象,而是属于类。
(2)、使用关键字static修饰的常量将被放在静态存储区域,不属于对象。
27、新枚举——enum class 或 enum struct
(1)、枚举量的作用域为类。需要用枚举名类限定枚举量。
(2)、常规枚举自动转换为整型,但作用域内枚举不能隐式转换为整型。不过可以显式转换。
(3)、新枚举的底层类型为int,不过也可以指定底层类型,如: enum class : short pizza { a, b, c, d};
28、小结——
(1)、类将数据和方法组合成一个单元,其私有性实现数据隐藏。类是用户定义的类型,对象是类的实例。
(2)、类声明应放在头文件中,定义成员函数的源代码应放在方法文件中。
(3)、每个对象都存储自己的数据而共享类方法。
(4)、抽象数据类型(Abstract Data Type)——ADT
C++学习笔记(3)的更多相关文章
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
- seaJs学习笔记2 – seaJs组建库的使用
原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...
- CSS学习笔记
CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...
- HTML学习笔记
HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...
- DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记
今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...
- ucos实时操作系统学习笔记——任务间通信(消息)
ucos另一种任务间通信的机制是消息(mbox),个人感觉是它是queue中只有一个信息的特殊情况,从代码中可以很清楚的看到,因为之前有关于queue的学习笔记,所以一并讲一下mbox.为什么有了qu ...
随机推荐
- [Cordova] Plugin里使用Android Library
[Cordova] Plugin里使用Android Library 前言 开发Cordova Plugin的时候,在Native Code里使用第三方Library,除了可以加速项目的时程.也避免了 ...
- Three.js外部模型加载
1. 首先我们要在官网: https://threejs.org/ 下载我们three.js压缩包,并将其中的build文件夹下的three.js通过script标签对的src属性导入到我们的页面中 ...
- spritecow改造
快速入口 不读文章可以直接拐向这里: spritecow二代:https://kmdjs.github.io/arejs-tool-sprite/ 写在前面 工欲善其事必先利其器,最近fork了一份s ...
- FusionCharts的使用方法(超详细)
今天统计价格变化规律的时候找到的一个很好的文档,很详细 一.简介 Ø FusionCharts 是InfoSoft Global 公司的一个产品,InfoSoft Global 公司是专业的Flash ...
- iOS 苹果开发证书失效的解决方案(Failed to locate or generate matching signing assets)
从2月14日开始,上传程序的同学可能会遇到提示上传失败的提示. 并且打开自己的钥匙串,发现所有的证书全部都显示此证书签发者无效. 出现以下情况: Failed to locate or generat ...
- C#读取ini文件的方法
最近项目用到ini文件,读取ini文件,方法如下: using System; using System.Collections.Generic; using System.Linq; using S ...
- SharePoint 2013 对二进制大型对象(BLOB)进行爬网
本文是参考MSDN文档做的示例,SharePoint 2013搜索二进制对象(BLOB),通过外部内容类型的方式将外部数据与SharePoint相关联,修改BCD模型,使SharePoint能够爬网外 ...
- 关于iOS的runtime
runtime是一个很有意思的东西,如果你学iOS开发很经常就会用到或被问到runtime.那么runtime是什么呢,如何去了解它. runtime:中文名 运行时,系统在编译时留下的一些 类型,操 ...
- IOS RunLoop浅析 三
经过两篇的介绍我想对RunLoop应该有了简单的了解,至少不至于一无所知. 在这篇我想对“CFRunLoopObserverRef”做一下简单的补充. 在补充之前先说一下. 在现在的开发中已经很少见到 ...
- 【开源】玩的就是开源 - DevFw
http://www.cnblogs.com/newmin/ 最近真的爱上开源了,将自己7年积累下来的部分代码,发布成为一个项目:DevFw 项目如下: 项目名称 描述 仓库 AtNet.DevFw. ...