微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

《C++ primer plus》读书笔记(三)

 第九章

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",1.2);

   (注意,构造函数的其他特征与java类似。)

20、析构函数――对象过期时,程序自动调用的成员函数,用以完成清理工作。如:  ~Stock();

  (注意!如果对象通过new创建的,使用delete释放内存时,其析构函数自动调用。)

21、对象赋值――认情况下,一个对象赋值给同类型的另一对象时,会将源对象中每个数据成员的内容复制给目标对象。

  (1)、初始化方式:  Stock s = Stock("a",1.2);  //可能创建临时变量。

  (2)、赋值方式:  s1 = Stock("a",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",1.2),Stock(),Stock("a",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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用爬虫利器 Playwright,轻松爬取抖查查数据 我们先分析登录的接口,其中 url 有一些非业务参数:ts、he、sign、secret。 然后根据这些参数作为关键词,定位到相关的 js 代码。 最后,逐步进行代码的跟踪,发现大部分的代码被混淆加密了。 花费了大半天,来还原这些混淆加密的代码
轻松爬取灰豚数据的抖音商品数据 调用两次登录接口实现模拟登录 我们分析登录接口,发现调用了两次不同的接口;而且,需要先调用 https://login.huitun.com/weChat/userLogin,然后再调用 https://dyapi.huitun.com/userLogin 接口。 登
成功绕过阿里无痕验证码,一键爬取飞瓜数据 飞瓜数据的登录接口,接入了阿里云的无痕验证码;通过接口方式模拟登录,难度比较高。所以,我们使用自动化的方式来实现模拟登录,并且获取到 cookie 数据。 [阿里无痕验证码] https://help.aliyun.com/document_detail/1
一文教你从零开始入门蝉妈妈数据爬取,成功逆向破解数据加密算法 通过接口进行模拟登录 我们先通过正常登录的方式,分析对应的登录接口。通过 F12 打开谷歌浏览器的调试面板,可以看到登录需要传递的一些参数;其中看到密码是被加密了。 不过我们通过经验可以大概猜测一下,应该是通过 md5 算法加密了。 接下
抽丝剥茧成功破解红人点集的签名加密算法 抽丝剥茧破解登录签名算法,成功实现模拟登录 headers = {} phone_num = &quot;xxxx&quot; password = &quot;xxxx&quot; md5_hash = hashlib.md5() md5_hash.upda
轻松绕过 Graphql 接口爬取有米有数的商品数据 有米有数数据的 API 接口,使用的是一种 API 查询语言 graphql。所有的 API 只有一个入口,具体的操作隐藏在请求数据体里面传输。 模拟登录,获取 sessionId 调用登录接口,进行模拟登录。 cookies = {} head
我最近重新拾起了计算机视觉,借助Python的opencv还有face_recognition库写了个简单的图像识别demo,额外定制了一些内容,原本想打包成exe然后发给朋友,不过在这当中遇到了许多小问题,都解决了,记录一下踩过的坑。 1、Pyinstaller打包过程当中出现warning,跟d
说到Pooling,相信学习过CNN的朋友们都不会感到陌生。Pooling在中文当中的意思是“池化”,在神经网络当中非常常见,通常用的比较多的一种是Max Pooling,具体操作如下图: 结合图像理解,相信你也会大概明白其中的本意。不过Pooling并不是只可以选取2x2的窗口大小,即便是3x3,
记得大一学Python的时候,有一个题目是判断一个数是否是复数。当时觉得比较复杂不好写,就琢磨了一个偷懒的好办法,用异常处理的手段便可以大大程度帮助你简短代码(偷懒)。以下是判断整数和复数的两段小代码: 相信看到这里,你也有所顿悟,能拓展出更多有意思的方法~
文章目录 3 直方图Histogramplot1. 基本直方图的绘制 Basic histogram2. 数据分布与密度信息显示 Control rug and density on seaborn histogram3. 带箱形图的直方图 Histogram with a boxplot on t