【C++ Primer Plus】基础知识

news2024/9/21 12:46:05

C站的小伙伴们,大家好呀!我最近开始阅读学习《C++ Primer Plus》这本书,在这里和大家一起分享。
下面是本书的第二章《开始学习C++》

开始学习C++

  • 进入C++
    • main()函数
    • C++注释
    • C++预处理器和iostream文件
    • 头文件名
    • 名称空间
    • 使用count进行C++输出
      • 控制符 endl
      • 换行符
    • C++源代码的格式化
      • 源代码中的标记和空白
      • C++源代码风格
  • C++语句
    • 声明语句和变量
    • 赋值语句
    • cout的新花样
  • 其他C++语句
    • 使用cin
    • 使用cout进行拼接
    • 类简介

进入C++

main()函数

例:

int main ()
{
    statements
    return 0;
}

 这几行代码构成了函数定义(function definition),该定义由两部分组成:
 第一行int main()叫做函数头(function hesding),花括号中包括的部分叫做函数体
 函数头对函数和程序的其他部分之间的接口做了总结,函数体是指出函数应该做什么的计算机指令。每条完整的指令都成为语句,所有的语句都以分号结束。main()函数中的最后一条语句叫做返回语句(return statement),它用来结束该函数。
 函数名前面的部分叫做函数返回类型,它描述的是从函数函数给调用它的函数的信息。函数名后括号中的部分叫做形参列表或参数列表,它描述的是从调用函数传递给被调函数的信息。
 来看主函数的接口描述,该接口从int开始,可知,main()返回一个整数值。接下来是空括号,表示main()函数不接受任何信息,或者说,main()函数不接受任何参数。
一般也可以写作:

int main (void)

这里使用了关键字void,明确地指出了函数不接受任何参数。
 对于返回语句,C++在main()函数中,可以省略,当编译器到达main()函数末尾时,没有遇到返回语句,则认为main()函数以如下语句结尾:

return 0

但是这仅仅适用于main()函数,而不适用于其他函数。

C++注释

 C++注释以//打头,必要的注释解释代码可以增加程序的可读性。

C++预处理器和iostream文件

 如果程序要使用C++输入(cin)和输出(cout)工具,需提供一下这样的两行代码:

#include <iostream>
using namespace std;//可使用其他程序替换简化程序

预处理器:
 C++和C一样,也使用一个预处理器,在该程序进行主编译之前对源文件进行处理。预处理不必执行特殊的操作来调用该预处理器,它会在编译程序时自动运行。
#include 编译指令:

#include <iostream>

 该编译指令导致预处理器将iostream文件的内容添加到程序中。这是一种典型的预处理器,在源代码被编译之前,替换或添加文本。
#include 编译指令导致iostream文件中的内容随源代码文件的内容一起被发送给编译器。
 实际上,iostream文件的内容将取代程序中的代码行#include<iostream>,原始文件没有被修改,而是将源代码文件和iostream组合成一个符合文件,编译的下一个阶段将使用该文件。

头文件名

 像iostream这样的文件叫做包含文件(include file)——由于它们被包含在其他文件中;也叫做头文件(header file)——由于它们被包含在文件起始处。
在这里插入图片描述

名称空间

 命名空间是C++的新特性,它能解决命名冲突问题。
 例如,小明定义了一个函数swap(),C++标准库中也存在一个swap()函数,此时,为了区分调用的是哪个swap()函数,可以通过命名空间来标识。
 C++中的命名空间包括两种,一种是标准命名空间,一种是自定义命名空间
std是C++标准命名空间,由于C++标准库几乎都定义在std命名空间中,因此编写的所有C++程序都需要引入下列语句:

using namespace std;

 使用namespace可以自定义命名空间,示例代码如下所示:

namespace lib
{
    void fun(){}
}

 上述代码中,使用namespace定义了一个名称为lib的命名空间,该命名空间内部定义了一个func()函数。

  如果要使用命名空间中定义的元素,有下列三种方式:

1.使用“命名空间::元素”方式指定命名空间中定义的元素。
  例如,如果要在屏幕上输出数据,并且在末尾加上换行,就要使用标准命名空间std中的cout和endl,在使用cout和endl时,在cout和endl前面加上命名空间和“::”作用域标识符,示例如下:

std::cout<<"C++"<<std::endl;

2.使用using语句引用命名空间元素。
示例如下:

using std cout;
std::cout<<"C++";

 需要注意的是,这种方式只能使用using引入的元素,例如,无法单独使用endl这个元素,但可以通过std::endl的形式使用endl。
3.使用using语句直接引用命名空间
示例如下:

using namespace std;

 这样引入std空间后,std中定义的所有元素就都可以被使用了。但是,针对上面我们提出的那个问题,当标准库中有swap()函数,也有自定义的swap函数呢,针对这个问题,我们可以使用“命名空间::元素”方式指定具体要引用的元素。

使用count进行C++输出

cout<<"Come up and C++ me some time.";

<<符号表示该语句将把这个字符串发送给cout;该符号指出了信息流动的路径。
 cout是什么呢?它是一个预定义的对象,知道如何显示字符串、数字和单个字符等。
 从概念上来讲,输出是一个,即从程序流出的一系列字符,cout对象表示这种流,其属性是在iostream文件中定义的。cout的对象属性包括一个插入运算符(<<),它可以将其右侧的信息插入到流中。
对于:

cout<<"Come up and C++ me some time.";

 与其说程序显示了一条消息,不如说它是将一个字符串流入到了输出流中。
在这里插入图片描述

控制符 endl

cout <<endl;

endl是一个特殊的C++符号,表示一个重要的概念:重启一行。在输出流中插入endl将导致屏幕光标移到下一行开头。
 诸如endl等对于count来说有特殊含义的特殊符号被称为控制符。和cout一样,endl也是在头文件iostream中定义的,且位于名称空间std中。

换行符

cout <<"What's next?\n";

\n被视为一个字符,名为换行符。
 在显示字符串时,在字符串中包含换行符,而不是在末尾加上endl,可以减少输入量。
例如:

cout <<"Pluto is a dwarf planet.\n";
cout <<"Pluto is a dwarf planet."<<endl;

 如果要生成一个空行,则两种方法的输入量相同。

cout<<"\n";
cout<<endl;

 在显示字符串时,通常使用换行字符"\n",其他情况下,则使用控制符endl。
 两者的区别是,endl确保程序继续运行前刷新输出(将其立即显示在屏幕上),而使用“\n”不能提供这样的保证,这意味着在有些系统中,有时可能在输入信息之后才会出现显示。

C++源代码的格式化

源代码中的标记和空白

 一行代码中不可分割的元素叫做标记。通常,必须使用空格、制表符或回车将两个标记分开,空格、制表符和回车统称为空白,有些字符是不需要空格分开标记。
在这里插入图片描述

C++源代码风格

  • 每条语句占一行。
  • 每个函数都有一个开始花括号和结束花括号,这两个花括号各占一行。
  • 函数中的语句相对于花括号进行缩进。
  • 与函数名称相关的圆括号周围没有空白。

C++语句

来看下面的程序:

#include <iostream>

int main()
{
    using namespace std;

    int carrots; //声明变量
    
    carrots=25;
    cout<<"I have ";
    cout<<carrots;
    cout<<"carrots.";
    cout<<endl;
    carrots=carrots-1;
    cout<<"Crunch,crunch.Now I have"<<carrots<<"carrots."<<endl;
    return 0;
}

C++中,空行将声明部分与程序的其他部分分开。

声明语句和变量

 要将信息存储在计算机中,必须指出信息的存储位置和所需的内存空间。在C++中,是使用声明语句来指出存储类型并提供位置标签。
例如声明语句:

int carrots;

 这条语句提供了两条信息:需要的内存以及该内存单元的名称。此后,程序将使用名称carrots来标识存储在该内存单元中的值。
 在C++中,所有的变量必须声明。声明通常指出了要存储的数据类型和程序对存储在这里的数据使用的名称。
 程序种的声明语句叫做定义声明语句,简称定义。这意味着它将导致编译器为变量分配内存空间。通常·,定义不一定是声明,上述例子中定义是声明。
 对于声明变量,C++的做法是尽量在首次使用变量前声明它。
在这里插入图片描述

赋值语句

 赋值语句从右往左进行。
例:

int steinway;
int baldwin;
int yamaha;
yamaha=baldwin=steinway=88;

 首先,88被赋给steinway,然后,steinway的值(现在是88)被赋值给baldwin,然后,baldwin的值(88)被赋值给yamaha。
再如:

carrots=carrots-1

 赋值表达式,从右往左计算,计算算术表达式carrots-1的值即25-1=24赋值给carrots。赋值表达式将这个新值存储到变量carrots对应的内存单元中。

cout的新花样

 对于printf(),输出数字或者字符串必须使用格式空字符%d和%s,来指出要打印出来的是字符串还是整数。如果让printf()打印字符串,而错误的提供了整数(%d),printf根本发现不了错误,它将继续处理,显示一堆乱码。
 而C++插入运算符<<将根据其后的数据类型相应地调整其行为。

其他C++语句

使用cin

来看下面的程序:

#include <iostream>

int main()
{
    using namespace std;
    int carrots;
    cout<<"How many carrots do you have ?"<<endl;
    cin>>carrots;
    cout<<"Here are twwo more."<<endl;
    carrots=carrots+2;
    cout<<"Now you have "<<carrots<<" carrots."<<endl;
    return 0;
}

程序的运行情况:

How many carrots do you have?
12
Here are two more.
Now you have 14 carrots.

上面的输出表明,从键盘输入的值(12)最终被赋给变量carrots。

cin>>carrots;

 从上面的语句可知,信息从cin流向carrots。就像C++将输出看作是流出程序的字符流一样,它也将输入看作是流入程序的字符流。iostream文件将cin定义为一个表示这种流的对象。输出时,<<运算符将字符串插入到输出流中;输入时,cin使用>>运算符从输入流中抽取字符。通常,需要在运算符右侧提供一个变量,以接收信息。(符号<<和>>被选择用来指示信息流的方向。)
 与cout一样,cin也是一个智能对象。

使用cout进行拼接

cout<<"Now you have "<<carrots<<" carrots."<<endl;

等同于:

cout<<"Now you have ";
cout<<carrots;
cout<<" carrots";
cout<<endl;

也可以将一条语句放在四行上:

cout<<"Now you have "
    <<carrots
    <<" carrots";
    <<endl;

当代码很长,限制输出显示的时候,这种做法很方便。

类简介

  类是用户定义的类型一种数据类型。类描述了一种数据类型的全部属性(包括可使用它执行的操作),对象就是根据这些描述创建的实体。
 类的定义格式如下:

class 类名
{
    权限控制符:
    成员;
}
  • class是定义类的关键字
  • 类名是类的标识符,其命名遵循标识符的命名规范。
  • 类名后面的一对大括号,用于包含类的成员,类的所有成员要在这一对大括号中声明。类中可以定义成员变量(也称为属性)和成员函数(也称为方法),成员变量用于描述对象的属性,成员函数用于描述对象的行为。
  • 声明类的成员时,通常需要使用权限控制符限定成员的访问规则,权限控制符包括publicprotectedprivate,这三种权限控制符的权限依次递减。
  • 大括号的后面的一个分号“;”用于表示类定义的结束。
    下定义一个学生类:
class Student
{
    public:
    void study();
    void exam();
    private:
    int age;
    string name;
}

 学生类Student中有两个成员变量age和name,它们是类的私有成员。此外,该类中还定义了study()和exam()两个函数。它们是类的公有成员。
 通常情况下,类的成员函数在类中声明,在类外实现。
 在类外实现成员函数,必须在返回值之后、函数名之前加上所属的类作用域,即“类名::”,表示函数属于哪个类。

void Student::study()
{
    cout<<"学习C++"<<endl;
}
void Student::exam()
{
    cout<<"C++考试成绩100分"<<endl;
}

 现在来看cout,它是一个ostream类对象,ostream类定义(iostream文件的另一个成员)描述了ostream对象表示的数据以及可以对它执行的操作,如将数字或字符串插入到输出流中。同样,cin是一个istream类对象,也是在iostream中定义的。
 类描述指定了可对类对象执行的所有操作。
 要对特定对象执行这些允许的操作,需要给该类对象发送一条消息。例如,希望cout对象显示一个字符串,应向它发送一条消息,告诉它,“对象!显示这些内容!”
 C++中提供了两种发送消息的方式,一种方式是使用类方法(即上面的成员函数),另一种方式是重新定义运算符,cin和cout采用的就是这种方式。

cout<<"I am not a crook."

这条语句使用重新定义的<<运算符将"显示消息"发送给cout。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/564760.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux专区】 Linux is not unix | Linux发展史 | Linux应用现状

&#x1f49e;&#x1f49e;欢迎来到 Claffic 的博客&#x1f49e;&#x1f49e; &#x1f449; 专栏&#xff1a;《Linux专区》&#x1f448; 前言&#xff1a; 上次提前带大家搭建了Linux的环境&#xff0c;其实之前应该还有一步的&#xff0c;就是向大家介绍Linux发展史&…

HNU-电路与电子学-小班3

第三次讨论 1 、直接用晶体管而不是逻辑门实现异或门&#xff0c;并解释这个电路是如何工作的。 &#xff08;6个 MOS 管构成&#xff09; 2 、通信双方约定采用 7 位海明码进行数据传输。请为发送方设计海明码校验位 生成电路&#xff0c;采用功能块和逻辑门为接收方设计海…

SCMA基本原理介绍

SCMA: Sparse Code Multiple Access SCMA基本原理 我们考虑一个同步&#xff08;synchronous&#xff09;的SCMA系统&#xff0c; 含1个基站&#xff08;Base Station, BS&#xff09;&#xff1b; J J J个用户&#xff08;so called layers&#xff09;&#xff1b;K个OFDM…

算法练习-2:送外卖

n 个小区排成一列&#xff0c;编号为从 0 到 n-1 。一开始&#xff0c;美团外卖员在第0号小区&#xff0c;目标为位于第 n-1 个小区的配送站。 给定两个整数数列 a[0]~a[n-1] 和 b[0]~b[n-1] &#xff0c;在每个小区 i 里你有两种选择&#xff1a; 1) 选择a&#xff1a;向前 a[…

shiro环境搭建

源码部署 这种方法相对复杂&#xff0c;如果不需要分析源码直接用docker就行 前置条件&#xff1a;Maven Ideal Tomcat 下载方式1&#xff1a;https://codeload.github.com/apache/shiro/zip/shiro-root-1.2.4&#xff0c;然后将文件夹导入ideal下载方式2&#xff1a;将shiro…

装饰者模式-java实现

的简介 装饰模式又称为“包装(Wrapper)模式”&#xff0c;以对客户端透明的方式扩展对象的功能&#xff0c;是继承关系的一个替代方案。动态地给对象添加一些额外地职责&#xff0c;就增加功能而言&#xff0c;装饰模式比生成子类更加灵活。 一般来说&#xff0c;一些特殊场景…

C++ new和delete详解

文章目录 1、 C C C内存分布2、 C C C内存管理方式3、 n e w new new 和 d e l e t e delete delete 底层实现4、定位 n e w new new表达式&#xff08;了解&#xff09;5、 m a l l o c 、 f r e e 和 n e w 、 d e l e t e malloc、free和new、delete malloc、free和new、de…

初识Linux:第六篇

初识Linux&#xff1a;第六篇 初识Linux&#xff1a;第六篇1.Linux 软件包管理器 yum2.Linux下的软件生态3.Linux中编辑器vim的使用3.1命令模式3.11控制光标移动3.12复制&#xff0c;粘贴&#xff0c;剪切&#xff0c;删除3.13替换&#xff0c;大小写转换3.14撤销与反撤销3.15查…

深度学习笔记之循环神经网络(六)长短期记忆神经网络(LSTM)

深度学习笔记之循环神经网络——长短期记忆神经网络[LSTM] 引言回顾&#xff1a; RNN \text{RNN} RNN的反向传播过程 RNN \text{RNN} RNN反向传播的梯度消失问题 长短期记忆神经网络遗忘门结构输入门结构遗忘门与输入门的特征融合操作输出门结构 个人感悟 引言 上一节介绍了循…

【C++】哈希——unordered系列容器哈希概念哈希冲突

文章目录 1. unordered系列的关联式容器1.1 引言1.2 unordered_map的使用说明1.3 unordered_set的使用说明1.4 unordered_set和unordered_map的应用1.5 性能比较 2. 哈希概念3. 哈希函数4. 哈希冲突5. 哈希冲突的解决——开散列和闭散列5.1 闭散列5.2 开散列 1. unordered系列的…

C++:征服C指针:关于指针

关于指针 1.看一个简单的程序&#xff0c;来接触下指针二级目录三级目录 本章节&#xff0c;我们重点分析C指针&#xff0c;首先我们从指针的概念谈起 &#x1f49a;&#x1f49a;&#x1f49a; 指针是一种保存变量地址的变量&#xff0c;并在C中频繁使用在C语言标准中&#xf…

数据结构与算法01:时间复杂度

目录 【复杂度分析】 【降低时间复杂度】 降低时间复杂度的必要性 【每日一练】 不管是使用什么编程语言或者哪种数据库&#xff0c;不管是解决项目中的什么问题&#xff0c;都离不开数据结构与算法。所谓数据结构就是指某一种数据的存储结构&#xff0c;所谓算法就是操作这…

【ClickHouse】

文章目录 一、表引擎1、表引擎的作用2、TinyLog3、Memory4、MergeTree二、数据库引擎1、作用--跨种类交换数据2、示例 三、MergeTree引擎1、简单使用2、分区partition by3、主键primary key4、order by&#xff08;必填&#xff09; 一、表引擎 1、表引擎的作用 CK表引擎决定…

U盘无法格式化?试试这几种快速有效的方法!

我们在通过Windows文件资源管理器、磁盘管理或Diskpart命令格式化U盘过程中&#xff0c;会遇到Windows无法格式化U盘。导致出现该问题的原因可能有以下几种&#xff1a; U盘被病毒和恶意软件感染&#xff1b; U盘有坏道&#xff1b; U盘已经物理损坏&#xff1b; 1.消除可能…

数据类型的陷进,从表象看本质!

哪些值转为布尔值为false 1、undefined&#xff08;未定义&#xff0c;找不到值时出现&#xff09; 2、null&#xff08;代表空值&#xff09; 3、false&#xff08;布尔值的false&#xff0c;字符串"false"布尔值为true&#xff09; 4、0&#xff08;数字0&…

LeetCode每日一题之209长度最小的子数组

文章目录 问题描述方法一&#xff1a;暴力求解方法二&#xff1a;滑动窗口 问题描述 方法一&#xff1a;暴力求解 暴力求解法&#xff1a;时间复杂度O(n^2)&#xff0c;空间复杂度O(1)。 暴力求解法的思想&#xff1a;每一次遍历数组&#xff0c;然后更新result的值&#xff0…

【Linux基本指令(3)】几十条指令快速入手Linux/到底什么是日志?/指令的运行原理到底是什么?

本文思维导图&#xff1a; 文章目录 13.head指令14.tail指令15.时间相关指令到底什么是日志&#xff1f;时间戳 16.cal指令17.find指令&#xff08;非常重要&#xff09;18.grep指令19.zip/unzip指令20.tar指令&#xff08;非常重要&#xff09;21.bc指令22.uname指令23.几个重…

香橙派4和树莓派4B构建K8S集群实践之六:虚拟主机

1. 说明 根据之前设置好的基础&#xff0c;我打算设置两种不同的虚拟主机运行在这个K8s集群上面&#xff0c;一个是LNMP体系的WebApp&#xff0c;一个是Java SpringBoot体系的WebApp。 1.1 设置表格 - wwwroot 是之前做pvc定义的文件目录&#xff0c;形如&#xff1a;/data0…

外包没有前途的,已经被替换了....

我25岁的时候&#xff0c;外包测试&#xff0c;薪资13.5k&#xff0c;人在深圳。 内卷什么的就不说了&#xff0c;而且人在外包那些高级精英年薪大几十的咱也接触不到&#xff0c;就说说外包吧。假设以我为界限&#xff0c;25岁一线城市13.5k&#xff0c;那22-24大部分情况下是…

花指令问题

前言 想起之前打题的时候经常会遇到一些关乎花指令的问题&#xff0c;但是没有系统地总结归纳花指令去除的姿势&#xff0c;浅浅开一个坑慢慢来写 题1&#xff1a;简单jmp 可以骗过dbg&#xff0c;但是放在ida中就很容易看出来&#xff0c;无效跳转 题目来源&#xff1a;[HD…