C++详细学习笔记(一)

2023-11-14

首先,本次学习主要参考的书籍是C++Primer Plus第六版,为了方便今后参阅,故写下该学习笔记。
C++是在C语言基础上开发的一种集面向对象编程、泛型编程和过程化编程于一体的编程语言,是C语言的超集。
一、预备知识
      C++有三件法宝:1、继承了C语言高效、简洁、快速和可移植性的传统(C代表的过程性编程);2、面向对象的特性带来了全新的编程方法,这种方法是为了应付复杂程度不断提高的现代编程任务而设计的;3、C++的模板特性提供了另一种全新的编程方法—泛型编程。
      (1)C++简史
    20世纪70年代,C和Pascal语言引领人们进入结构化编程时代,其中C还能生成简单、快速运行的程序,并提供了处理硬件问题的能力,如管理通信端口和磁盘驱动器,使得C成为20世纪80年代占统治地位的编程语言,这段时间同时见证了OOP的发展。       20世纪70年代早期,贝尔实验室的Dennis Ritchie致力于开发UNIX操作系统(所谓操作系统是能够管理计算机资源、处理计算机与用户之间交互的一组程序),为了完成这项工作,Ritchie需要一种语言,不仅要生成简洁、快速的程序,并能有效地控制硬件。传统的方法是使用汇编语言,但这是一种低级语言,不仅直接操作硬件,而且依赖于计算机的内部机器语言,无法在不同的计算机平台工作,这就需要一种高级语言和编译器程序。因此C就是融合了这两种特性,不仅具有低级语言的效率、硬件访问能力,而且具有高级语言的通用性、可移植性。  
     (2)C语言编程原理
       计算机语言要处理两个概念——数据和算法(程序)。数据是程序使用和处理的信息,算法是程序使用的方法。C语言刚出世的时候也是过程性的语言,这意味着它强调的是编程的算法方面。从概念上说,过程化编程首先要确定计算机应采取的操作,然后使用编程语言来实现操作。随着规模扩大,就会形成像“意大利面条式编程”这样的情况。
         因此引入结构化编程以及自顶向下的原则,即将大型的程序分解成小型,便于管理的任务。
     (3)面向对象编程
       面向对象编程强调的是数据。OOP不像过程性编程那样,试图使问题满足语言的过程性方法,而是试图让语言满足问题的要求,其理念是设计与问题本质特性相对应的数据格式。
      所以在C++中,类是一种规范,它描述了这种新型数据格式,对象是根据这种规范构造的特定数据结构。通常,类是规定了可使用哪些数据来表示对象以及可以对这些数据执行哪些操作。OOP程序设计方法首先设计类,它们准确表达了程序要处理的东西。然后可以设计一个使用这些类的对象的程序。这体现了一种自下而上的编程方法,即从低级组织(类)到高级组织(程序)的处理过程。因为OOP语言使得程序员可以轻松使用一些已有的类,所以C++真正的优点之一是:可以方便地重用和修改现有地、经过仔细测试的代码。
       (4)泛型编程
         泛型编程是C++支持的另一种编程模式,与OOP的目标相同,但是却使重用代码和抽象通用概念更简单。不过OOP强调的是编程的数据方面,而泛型编程强调的是独立于特定数据类型,它们的侧重点不同,OOP是一个管理大型项目的工具,而泛型编程提供了执行常见任务的工具,如对数据排序或合并链表。术语泛型指的是创建独立于类型的代码。例如,要对不同类型的数据进行排序,通常必须为每种类型创建一个排序函数,泛型编程需要对语言进行扩展,以便可以只编写一个泛型函数(即不是特定类型的),并将其用于各种实际类型。C++模板提供了完成这种任务的机制。
       (5)C++的起源
      与C语言一样,C++也是在贝尔实验室诞生的,Bjarne Stroustrup于20世纪80年代在这里开发出了这种语言。用他自己的话说,“C++主要是为了我的朋友和我不必再使用汇编语言、C语言或其他现代高级语言来编程而设计的。它的主要功能是可以方便地编写出好程序,让每个程序员更加快乐”。
       称C++来自C语言中地递增运算符++,运算符将变量加1,名称C++表明,它是C的扩充版本,因为Stroustrup虽然在C上加入了OOP特性和对C的泛型编程支持,但是并没有对C的组件作很大的改动,因此C++是C语言的超集,这意味着任何有效的C程序都是有效的C++程序。C++程序可以使用已有的C软件库。其中OOP部分赋予了C++语言将问题所涉及的概念联系起来的能力,C部分则赋予了C++语言紧密联系硬件的能力,这种能力的结合成就了C++的广泛传播。
       在C++获得一定成功后,才添加的模板,这使得进行泛型编程成为可能。在模板特性被使用和改进后,然们才意识到它们和OOP一样重要。
       C++融合了OOP、泛型编程和传统的过程性方法,这表明C++强调的是实用价值,而不是意识形态方法。

二、C++学习的最基本知识

(1)进入C++
        注意点: 
       1、C++对大小写敏感,其中编译器也是对拼写敏感的;
       2、文件扩展名cpp是一种表示C++程序的常用方法;
       3、C++输入输出函数为cin和cout函数,但也可使用printf()和scanf()函数,但要包含常规C语言的stdio.h文件;
     4、#include预处理编译指令、int main()作为接口的函数头、using namespace编译指令、结束mian函数的return函数;
       5、C++中,语句结束后不能省略分号;
       6、如果编译器到达main()函数末尾时没有遇到返回函数,则认为main()函数以return 0结尾;
       7、代码#include <iostream>该编译指令导致预处理器将iostream文件的内容添加到程序中,这是典型的预处理器操作:在源代码被编译之前,替换或者添加文本;将 iostream文件的内容添加到程序中这一预处理器操作涉及程序与外部世界之间的通信。iostream中io指的是输入和输出。C++的输入/输出方案涉及iostream文件中的多个定义。#include编译指令导致iostream文件的内容随着源代码文件的内容一起被发送给编译器。实际上,iostream文件的内容将取代程序中的代码行#include<iostream>。原始文件没有被修改,而是将源代码文件和iostream组合成一个复合文件,编译的下一个阶段将使用该文件。
   8、像iostream这样的文件叫做包含文件——由于它们被包含在其他文件中,也叫头文件——由于它们被包含在文件的起始处。C++编译器自带了很多头文件,每个头文件都支持一组特定的工具。C语言中头文件使用扩展名h,在C++中,对老式C的头文件保留了扩展名h,即C++也可以使用这种文件,但是C++风格的头文件是没有扩展名的,有些C头文件被转换时,会进行重命名,去掉扩展名h,并在文件名称前加上前缀c,如math.h->cmath。有时C头文件的C版本和C++版本相同,而有时新版本做了一些修改。对于纯粹的C++头文件来说,去掉h不只是形式上的改变,没有h的头文件也可以包含名称空间。
      9、如果使用iostream,而不是 iostream.h,则应使用using namespace std的名称空间编译指令来使 iostream中的定义对程序可用。名称空间支持是一项C++特性,旨在让你编写大型程序以及将多个厂商现有的代码组合起来的程序时更容易,它有助于组织程序。一个潜在的问题是,可能使用两个已封装好的产品,而它们都包含一个名为wanda()函数,这样,使用wanda()函数时,编译器将不知道指的是哪个版本,名称空间让厂商能够将其产品封装在一个叫做名称空间的单元中,这样就可以使用名称空间来指出想使用哪个厂商的产品。因此,Microflop Industries可以将其定义放到一个名为Microflop的名称空间中,这样其wanda()函数的全称为Microflop::wanda();这样,程序就可以使用名称空间来区分不同的版本了。按这种方式,类、函数和变量便的是C++编译器的标准组件,它们现在都被放置在名称空间std中,这意味着在 iostream中定义的用于输出的cout变量实际上是std::cout,因此可以省略编译指令using。
      10、对于cout<<"Come up";语句来说,从概念上看,输出是一个流,即从程序流出的一系列字符。cout对象表示这种流,其属性是在 iostream文件中定义的。cout的对象属性包含一个插入运算符<<,它可以将其右侧的信息插入到流中。
     11、endl控制符,其重起一行的作用,和cout一样,endl也是在头文件中定义的,且位于名称空间std中。其中所谓的控制符是像endl一样对cout来说有特殊含义的特殊符号。C++中还提供了一种在输出中指示换行的旧方法,就是在“/n”,一般将其放在字符串的引号中,两者之间的区别在于,endl确保程序继续运行前刷新输出(将其立即显示在屏幕上),而使用“\n“不能提供这样的保证,这意味着在有些系统中,有时可能在你输入信息后才出现提示。
  12、源代码中的标记和空白。标记是指一行代码中不可分割的元素,空白则是空格、制表符和回车的统称。标记之间一般用空白来分开。
   13、声明不一定是定义,在C++中尽可能首次使用变量前声明它,这意味着将导致编译器为变量分配内存空间,而C中所有变量的声明通常都位于函数或过程的开始位置。
     14、对于类ostream和istream类,从技术上说,它们并没有被内置到C++语言中,而是语言标准指定的类,这些类的定义位于 iostream文件中,没有被内置到编译器中。
     15、类描述了可对类对象执行的所有操作,要对特定对象执行这些允许的操作,需要给该对象发送一条信息。C++提供了两种发送消息的方法:一种是使用类方法;另一种方式是重新定义运算符,cin和cout采用的就是这种方式。

     16、例如x=sqrt(6.25),表达式sqrt(6.25)被称为函数调用,被调用的函数叫做被调用函数,包含函数调用的函数叫做调用函数。对于有返回值的函数来说,函数执行完毕后,语句中的函数调用部分将被替换为返回值。因此在使用函数之前,C++编译器必须知道函数的参数类型和返回值类型。如果缺少这些信息,编译器将不知道如何解释返回值。C++提供这种信息的方式就是使用函数原型语句。例如sqrt()的函数原型就像这样:double  sqrt(double);函数原型之于函数就像变量声明至于变量——指出涉及的类型。原型结尾的分号表明它是一条语句,这使得它是一个函数原型,而不是函数头。如果省略分号,编译器将这行代码解释为一个函数头,并要求接着提供定义该函数的函数体。但不要混淆函数原型和函数定义,原型只描述函数接口,它描述的是发送给函数的信息和返回的信息,而定义中包含了函数的代码。C和C++将库函数的这两项特性分开了,库函数中包含了函数的编译代码,而头文件只包含了原型.

17、函数变体:有多个参数,如 double pow(double,double);不接受任何参数,如int rand(void);没有返回值,如void bucks(double),这个函数是将数字以美元、美分的格式显示在屏幕上,由于这个函数把值发送给屏幕,而不是调用函数,因此不需要返回值,也不能将该函数调用放在赋值语句或其他表达式中。相反,应使用一条纯粹的函数调用语句:bucks(1234.56)。

18、对于main()函数来说,main函数是一个有返回值函数,所以需要使用关键字return来提供返回值,并结束函数,这就是为什么在main()函数结尾使用语句:return 0;的原因,但是这个返回值到底是返回到哪里了呢?事实上,可以将计算机操作系统看成是调用程序,因此main()函数的返回值并不是返回给程序的其他部分,而是返回给操作系统。

19、让程序访问名称空间std的方法有多种,下面是其中4种:(1)将using namespace std;放在函数定义之前,让文件中所有函数都能使用名称空间std中所有元素;(2)将using namespace std;放在特定的函数定义中,让该函数能够使用名称空间std中的所有元素;(3)在特定的函数中使用类似using std::cout;这样的编译指令,而不是using namesapce std;,让该函数能够使用指定的元素,如cout。(4)完全不使用编译指令using,而在需要使用名称空间std中的元素时,使用前缀std::,如下所示:std::cout<<"     "<<std::endl。

、总结

1、有多种类型的C++语句,包含下述6种:声明语句、赋值语句、消息语句:将消息发送给对象,激发某种行动。、函数调用、函数原型、返回语句。

2、C++提供了两个用于处理输入和输出的预定义对象(cin和cout),它们是istream和ostream类的实例,这两个类是在iostream文件中定义的。为ostream类定义的插入运算符(<<)使得将数据插入到输出流成为可能;为istream类定义的抽取运算符(>>)能够从输入流中抽取信息。cin和cout都是智能对象,能够根据程序上下文自动将信息从一种形式转换为另一种形式。

3、C++可以使用大量的C库函数,要使用库函数,应当包含提供该函数原型的头文件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++详细学习笔记(一) 的相关文章

  • 注销租约抛出 InvalidOperationException

    我有一个使用插件的应用程序 我在另一个应用程序域中加载插件 我使用 RemoteHandle 类http www pocketsilicon com post Things That Make My Life Hell Part 1 App
  • 如何将 protobuf-net 与不可变值类型一起使用?

    假设我有一个像这样的不可变值类型 Serializable DataContract public struct MyValueType ISerializable private readonly int x private readon
  • 复制 std::function 的成本有多高?

    While std function是可移动的 但在某些情况下不可能或不方便 复制它会受到重大处罚吗 它是否可能取决于捕获变量的大小 如果它是使用 lambda 表达式创建的 它依赖于实现吗 std function通常被实现为值语义 小缓
  • 在 LINQ 中按 Id 连接多表和分组

    我想按categoryId显示列表产品的名称组 这是我的代码 我想要我的视图显示结果 Desktop PC HP Red PC Dell Yellow PC Asus Red SmartPhone Lumia 720 Blue 我的组模型
  • 当我们想要返回对象的引用时,为什么我们在赋值运算符中返回 *this 而通常(而不是 this)?

    我正在学习 C 和指针 我以为我理解了指针 直到我看到这个 一方面 asterix 运算符是解引用的 这意味着它返回值所指向的地址中的值 而与号 运算符则相反 它返回值存储的地址记忆 现在阅读有关赋值重载的内 容 它说 我们返回 this因
  • 为什么极端下派生类(多重虚拟继承)的大小包括超类成员大小的两倍?

    include
  • 使用 LINQ2SQL 在 ASP.NET MVC 中的各种模型存储库之间共享数据上下文

    我的应用程序中有 2 个存储库 每个存储库都有自己的数据上下文对象 最终结果是我尝试将从一个存储库检索到的对象附加到从另一个存储库检索到的对象 这会导致异常 Use 构造函数注入将 DataContext 注入每个存储库 public cl
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 如何创建包含 IPv4 地址的文本框? [复制]

    这个问题在这里已经有答案了 如何制作一个这样的文本框 我想所有的用户都见过这个并且知道它的功能 您可以使用带有 Mask 的 MaskedTestBox000 000 000 000 欲了解更多信息 请参阅文档 http msdn micr
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 回发后刷新时提示确认表单重新提交。我做错了什么?

    我有一个以空白 默认状态启动的仪表板 我让用户能够将保存的状态加载到仪表板中 当他们单击 应用 按钮时 我运行以下代码 function CloseAndSave var radUpload find radUpload1ID var in
  • 由 IHttpClientFactory 注入时模拟 HttpClient 处理程序

    我创建了一个自定义库 它会自动为依赖于特定服务的 Polly 策略设置HttpClient 这是使用以下方法完成的IServiceCollection扩展方法和类型化客户端方法 一个简化的例子 public static IHttpClie
  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize
  • Qt - ubuntu中的串口名称

    我在 Ubuntu 上查找串行端口名称时遇到问题 如您所知 为了在 Windows 上读取串口 我们可以使用以下代码 serial gt setPortName com3 但是当我在 Ubuntu 上编译这段代码时 我无法使用这段代码 se
  • Azure 辅助角色“请求输入之一超出范围”的内部异常。

    我在辅助角色中调用 CloudTableClient CreateTableIfNotExist 方法 但收到一个异常 其中包含 请求输入之一超出范围 的内部异常 我做了一些研究 发现这是由于将表命名为非法表名引起的 但是 我尝试为我的表命
  • “接口”类似于 boost::bind 的语义

    我希望能够将 Java 的接口语义与 C 结合起来 起初 我用过boost signal为给定事件回调显式注册的成员函数 这非常有效 但后来我发现一些函数回调池是相关的 因此将它们抽象出来并立即注册所有实例的相关回调是有意义的 但我了解到的
  • 动态添加 ASP.Net 控件

    我有一个存储过程 它根据数据库中存储的记录数返回多行 现在我想有一种方法来创建 div 带有包含该行值的控件的标记 如果从数据库返回 10 行 则 10 div 必须创建标签 我有下面的代码来从数据库中获取结果 但我不知道如何从这里继续 S
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • Oracle Data Provider for .NET 不支持 Oracle 19.0.48.0.0

    我们刚刚升级到 Oracle 19c 19 3 0 所有应用程序都停止工作并出现以下错误消息 Oracle Data Provider for NET 不支持 Oracle 19 0 48 0 0 我将 Oracle ManagedData
  • 如何从 ODBC 连接获取可用表的列表?

    在 Excel 中 我可以转到 数据 gt 导入外部数据 gt 导入数据 然后选择要使用的数据源 然后在提供登录信息后 它会给我一个表格列表 我想知道如何使用 C 以编程方式获取该列表 您正在查询什么类型的数据源 SQL 服务器 使用权 看

随机推荐

  • 211和985区别:

    985工程 是在 211工程 的基础上 根据我国国防 民用 东 中 西部协调发展的原则而筛选出来的
  • 获取网页的html文本(用selenium+chrome headless进行js异步加载内容),返回BeautifulSoup的soup对象

    import requests from bs4 import BeautifulSoup from selenium import webdriver def gethtml url js False if js False return
  • 1.代码片断收集-数据拷贝效率问题

    上面是我创建的群聊 欢迎新朋友的加入 1 基本信息 mycode 收录一些简单的代码片段 Gitee com 克隆链接 mycode 收录一些简单的代码片段 目的 记录和收集一些常用的代码片段 同时也欢迎网友提交push申请 共同完善 开发
  • 05C++11多线程编程之使用正确的共享代码案例引入互斥量mutex的概念、用法

    05C 11多线程编程之使用正确的共享代码案例引入互斥量mutex的概念 用法 1 共享代码案例概念分析 1 网络游戏服务器 两个自己创建的线程 一个线程收集玩家命令 一个数字代表玩家发来的命令 并把命令写到一个队列中 另外一个线程从队列中
  • 基于pytorch的无需分割字符的车牌识别

    传统车牌识别 传统的车牌识别需要先检测出车牌 检测出车牌后通过 像素映射 或者 联通区查找 的方法分割出单个的文字 然后单独识别每个文字 传统的车牌识别不仅繁琐 而且切割文字的效果也很难令人满意 因此 能不能绕开字符分割的问题 直接识别车牌
  • 系分 - 系统安全分析与设计

    个人总结 仅供参考 欢迎加好友一起讨论 文章目录 系分 系统安全分析与设计 考点摘要 对称加密 非对称加密 信息摘要 数字签名 数字证书 数字信封 PKI公钥体系 网络安全 安全协议 网络安全 网络威胁与攻击 防火墙 功能 防火墙 分类 防
  • Matlab遗传算法工具箱及应用

    目录 第一章 遗传算法概述 1 1遗传算法概念 1 2遗传算法与爬山法的比较 1 3遗传算法的基本原理与方法 第二章 遗传算法应用举例 2 1简单一元函数优化实例 参考资料 Matlab遗传算法工具箱及应用 主编 雷英杰 张善文 西安电子科
  • SpringBoot——加载测试专用的配置类

    加载测试专用的配置类 之前我们介绍了如何在测试类中加载专用的测试属性 这次我们来看如何在测试类中加载专用的测试类 创建配置类 首先创建一个配置类 并且创建一个第三方的Bean模拟这是一个要在测试用例中引用的第三方Bean 创建测试用例 创建
  • LTE小区搜索过程及SCH/BCH设计

    终端开机过程 在小区搜索之前 需要完成PLMN的选定 再去搜索小区相关信息 PLMN 公共陆地移动网络 是一个标识 由MCC和MNC组成 比如中国电信46011 460是MCC 11是MNC 两个标识都是2 3位 那终端是如何搜索PLMN的
  • WIN7环境下cmd javac不是内部或外部命令

    一般步骤如下 网上摘抄部分 JAVA HOME指明JAVA安装路径 值设为 C Program Files Java jre7 刚才安装时所选择的路径 每个人可能不一样 此路径下包括lib bin jre等文件夹 Path值设为 JAVA
  • GNU __attribute__ 机制

    http blog 163 com sunm lin blog static 9192142200741533038695
  • 在服务器跑vue不能访问?是你的host设置问题

    看了csdn的一堆文章 大都是部署的 也就是 经过了 npm run build 之后 打包好的压缩工程部署 比如 https blog csdn net weixin 43690623 article details 122718677
  • Ubuntu开机后卡死只有左上角有一个下划线不停闪烁

    千万不要乱设置东西 先按一下Ctrl Alt F2打开tty模式检查问题出在哪了 之后会让你输入用户名和密码 就平时开机正常登录那样 然后相当于进入了一个平时用的终端 只是这个终端占据了整个屏幕 平时用的指令都可以用 接着你去检查到底出了什
  • myisamchk命令使用总结

    author sakte time 2012 02 28 myisamchk命令使用总结 myisamchk实用程序可以用来获得有关你的数据库表的统计信息或检查 修复 优化他们 1 常用于myisamchk的检查选项 information
  • 自定义ViewGroup实现控件自动换行

    首先看效果如下 首先我们需要自定义ViewGroup 重写onMeasure和onLayout将布局摆放好然后在通过适配器添加子view 代码如下 public class MyViewGroup extends ViewGroup Lis
  • jetson nano安装mqtt库

    把包放入Work下 sudo apt get update sudo apt get install build essential gcc make cmake cmake gui cmake curses gui sudo apt ge
  • 如何在Kubernetes集群中使用kubectl工具来进行管理多个外部K8S集群接入与资源操作?...

    关注 WeiyiGeek 公众号 设为 特别关注 每天带你玩转网络安全运维 应用开发 物联网IOT学习 本章目录 0x03 Kubernetes 中多集群接入管理实践 1 本地集群创建指定用户管理集群 2 外部集群创建指定用户管理集群 原文
  • linux-vmware tools安装与cdrom挂载

    前述 昨天想直接复制虚拟机centos系统中命令行的内容到主机的txt文档上进行保存 发现不能实现虚拟机与主机之间的直接通讯 后来查资料发现原来是由于我的虚拟机没有安装vwmare tools的缘故 一个下午查资料下来 搞定了cdrom镜像
  • [ Android 编译 ] 如果不指定LOCAL_CERTIFICATE,默认使用哪个key进行签名

    Android 编译 如果不指定LOCAL CERTIFICATE 默认使用哪个key进行签名 尊重原创 转载请注明出处 创作不易 如有帮助请点赞支持 参考 Android系统签名简介 开发系统应用时 通常情况下我们都会在 Android
  • C++详细学习笔记(一)

    首先 本次学习主要参考的书籍是C Primer Plus第六版 为了方便今后参阅 故写下该学习笔记 C 是在C语言基础上开发的一种集面向对象编程 泛型编程和过程化编程于一体的编程语言 是C语言的超集 一 预备知识 C 有三件法宝 1 继承了