c++ primer学习笔记(一)

目录

第一章、c++快速入门

重点:类的简介

第二章

1、基本内置类型

2、字面值常量

1、整型字面值规则

2、浮点字面值规则

3、布尔字面值

4、字符字面值

5、非打印字符的转义序列

​编辑

6、字符串字面值

3、变量

1、变量标识符

 2、定义和初始化对象

3、变量初始化规则

4、声明和定义

5、名字的作用域

4、const限定符

5、引用

6、typedef 名字

7、枚举

8、类类型

9、编写自己的头文件


第一章、c++快速入门

1、注释对不能嵌套!!!若想注释掉某行代码用单行注释!!

2、定义在for循环中的变量在退出for循环后不能再访问。如下var

int m;
for(int var=0;var<10;var++)
{m+=var;
}
printf("%d\n",m);  //m可以访问,var不可访问

3、windows系统下通过键入Ctrl+z来输入文件结束符。例如下:

int var,sum;
while(std::cin>>var)
{sum++;
}

输入Ctrl+z时程序会终止循环。

重点:类的简介

1、类可以是系统自带的,比如iostream,也可以自定义。引用方式不同,如下

#include <iostream>
#include "Sales_item"  //自定义类用双引号

2、每个类定义一种类型,类里面还有对象和成员函数(也叫类方法)等。如下:

int main()
{Sales_item item1,item2;std::cin>>item1>>item2;if(item1.same_isbn(item2)) //以.的方式引用成员函数{std::cout<<item1+item2<<std::endl;//两个对象可以相加,具体要看Sales_item头文件里让相加做什么}return 0;
}

第二章

1、基本内置类型

1、wchar_t类型用于扩展字符集,如汉字和日语等。

2、存储方式:通常将8位的块作为一个字节。32位或4个字节作为一个字(word)。

3、带符号类型可以表示正数、负数、0。  无符号类型只能表示正数和0。

4、一个使用一位符号位的表示方式为8位的signed整型取值是从-128到127。

5、c++中,把负值赋给unsigned对象是完全合法的,其结果是该负数对该类型的取值个数求模后的值。(如-1赋给8位unsigned char结果是255,即-1对256求模)

6、long类型运行时代价远远高于用int类型进行同样计算的代价。

7、float类型中隐式的精度损失不能忽视,但double计算的代价相对于float可以忽略。

2、字面值常量

只有内置类型存在字面值,没有类类型的字面值。因此也没有任何标准库类型的字面值。

1、整型字面值规则

1、以0开头的字面值整数常量表示八进制,以0x或0X开头的表示十六进制。

2、在数值后面加L指定常量为long类型。在数值后面加U或u定义unsigned类型。同时加L和U得到unsigned long类型的字面值常量(注意后缀不能有空格!!)。没有short型的字面值常量。

128u //unsigned
1L  //long
1024UL  //unsigned long
8LU  //unsigned long (U和L谁在前都可)

2、浮点字面值规则

默认的浮点字面值常量为double类型。在数值后加上F或f表示单精度。加上L表示扩展精度。

3.14159F  //每组表示的数值相同
3.14159E0f.001f
1E-3F12.345L
1.2345E1L0.
0e0

3、布尔字面值

true和false

bool test=false;

4、字符字面值

在字符字面值前面加L能得到wchar_t类型的宽字符字面值。

'a'
L'a'

5、非打印字符的转义序列

可以用八进制和十六进制转义字符来定义任何字符

6、字符串字面值

1、“A”是包含字母A和空字符‘\0’两个字符的字符串。

2、宽字符字面值是一串常量宽字符,以一个宽空字符结束。

L"a wide string literal"

3、字符串字面值的连接

法(1)、两个相邻的仅由空格、制表符或换行符分开的字符串字面值(或宽字符串字面值),可连接成一个新字符串字面值。这样可以多行书写长字符串字面值。

std::cout<<"apple banana "  //末尾留空格/*后继行行首随便空格或者制表符,不算入字符串内部*/  "pear grape ""orange strawberry"<<std::endl;输出:apple banana pear grape orange strawberry 

法(2)、 多行字面值也可以处理长字符串。

在一行的末尾加一个反斜线符号可将此行和下一行当做同一行处理。

std::cou\
t<<"hello"<<st\
d::endl;相当于std::cout<<"hello"<<std::endl;
std::cout<<"apple banana \
pear grape \
orange strawberry"<<std::endl;输出:apple banana pear grape orange strawberry 

注意反斜线符号必须是该行的尾字符,不允许其后面有注释空格!!!

采用\处理多行字面值时,后继行行首的任何空格和制表符都是字符串字面值的一部分。因此,长字符串字面值的后继行不能有缩进(除非上一行行尾还没缩进完)。

3、变量

对象就是内存中具有类型的区域。

1、变量标识符

关键字不能用作变量的标识符。如下:

 下面这张仅做了解。

注:以下标识符是可以的

Float
_

 2、定义和初始化对象

对象初始化可以用复制初始化(=)或直接初始化(括号)

int var=1024;
int var(1024);

直接初始化的语法更灵活且效率更高。

注:初始化不是赋值!!初始化指创建变量并给它赋初始值,而赋值则是擦除对象的当前值并用新值代替。

对内置类型来说,复制初始化和直接初始化几乎没有差别。

对类类型的对象来说,有些初始化仅能用直接初始化完成。定义如何进行初始化的成员函数称为构造函数。

#include <string>
std::string titleA="c++ primer,4th ed.";
std::string titleB("c++ primer,4th ed.");std::string all_nines(10,'9');
//all_nines="9999999999"
//这种初始化方式也是直接初始化,有多个初始化式(初始化值可变)时不能用复制初始化。

可以用同一个定义中前面已定义的值初始化后面的变量。

double salary=9999.99,wage(salary+0.01);

3、变量初始化规则

1、内置类型变量的初始化

在函数体外定义的变量都初始化成0,在函数体内定义的内置类型变量不进行自动初始化。

2、类类型变量的初始化

如果类具有默认构造函数,那么就可以在定义该类的变量时不用显示地初始化变量。

#include <iostream>
#include <string>
int main()
{std::string empty;  //定义了一个名为empty的字符串变量,并且不进行初始化std::cout<<empty<<std::endl;  //输出" "(空字符),string类型默认初始化为空
}

有些类类型没有默认构造函数,那么每个定义都必须提供显示的初始化式,没有初始值根本不可能定义这种类型的变量。

4、声明和定义

1、定义:用于为变量分配存储空间,指定初始值。

2、声明:用于向程序表明变量的类型和名字。不分配存储空间!!

定义也是声明!!

3、可以通过extern关键字声明变量而不定义它。

extern int i;  //声明但不定义
int i;  //定义

注:一个变量只能定义一次!!但可以声明多次!!

4、当extern声明位于函数外部时,才可以含有初始化式。如果声明有初始化式,那么该声明也是定义。

extern double pi=3.14159;  //声明的同时定义

5、任何在多个文件中使用的变量都需要有与定义分离的声明。

5、名字的作用域

1、全局作用域:定义在所有函数外部的名字

2、局部作用域:函数内的名字

3、语句作用域:定义在如for语句内

int add=0;  //全局作用域
int main()
{int sum=0;  //局部作用域for(int i=0;i<10;i++)  //语句作用域{sum++;}
}

作用范围:全局>局部>语句

若小作用域中某变量的名字和大作用域中某变量名字相同,则当运行到小作用域时,会屏蔽大作用域中对该变量的赋值或操作。

最好在使用变量时定义它,不要全都定义在开头。

4、const限定符

常量在定义之后不能被修改,所以定义时必须初始化。

在全局作用域声明的const变量是定义该对象的文件的局部变量。此变量只存在于那个文件中,不能被其他文件访问。

通过指定const变量为extern,就可以在整个程序中访问const对象。

//file_1.cpp
extern const int buf=fcn();  //文件1中定义//file_2.cpp
extern const int buf;   //文件2中声明并使用
for(int index=0;index!=buf;++index)
{//……
}

非const变量默认为extern。要使const变量能够在其他文件中访问,必须显示地指定它为extern。

int cnt=0;
const int sz=cnt; //合法

5、引用

引用是对象的另一个名字。主要作为函数的形参。

引用必须用与该引用同类型的对象初始化。

int ival=1024;
int &refval=ival; //合法
int &refval2;  //不合法,引用必须初始化
int &refval3=10;   //不合法,引用的右值必须是对象

作用在引用上的所有操作事实上都作用在该引用绑定的对象上。

当引用初始化后,只要该引用存在,它就保持绑定到初始化时指向的对象。不可能将引用绑定到另一个对象。

const引用:指向const对象的引用

const int ival=1024;
const int &refval=ival;
int &ref2=ival;  //不合法,不是const引用

非const引用只能绑定到与该引用同类型的对象。

const引用可以绑定到不同但相关的类型的对象或绑定到右值。

double dval=3.14;
const int &ri=dval;
//编译器会转化为以下代码
int temp=dval;
const int &ri=temp;

6、typedef 名字

typedef double wages;
typedef wages salary;
typedef int exam_score;

7、枚举

1、定义和默认赋值

enum Forms {shape=1,sphere,cylinder,polygon}; //默认逐个+1
//sphere=2, cylinder=3, polygon=4
enum Points {point2d = 2, point2w, point3d = 3, point3w };//在前一个基础上+1
//point2w=3, point3w=4

 2、枚举类型的对象的初始化或赋值,只能通过其枚举成员或同一枚举类型的其他对象来进行。

Points pt3d = point3d; //√,point3d是Points的枚举成员
Points pt2w = 3; //×
pt2w = polygon;  //×
pt2w = pt3d; //√,pt3d和pt2w都是同一个枚举类型的枚举成员

8、类类型

1、从操作接口设计类。每个类都定义了一个接口和一个实现。

 定义类时,通常先定义该类的接口,即该类所提供的操作。通过这些操作,可以决定该类完成     其功能所需要的数据和函数。

2、一般不能把类成员的初始化作为其定义的一部分。定义数据成员时,只能指定该数据成员的名字和类型。

3、c++中定义类类型除了关键字class以外,还支持另一个关键字struct(从C语言继承过来的)

用class和struct关键字定义类的唯一差别在于默认访问级别。默认情况下,struct的成员为public,而class的成员为private

9、编写自己的头文件

为了允许把程序分成独立的逻辑块,c++支持分别编译

1、头文件一般包括类的定义、extern变量的声明和函数的声明。

2、正确使用头文件的好处:(1)保证所有文件使用给定实体的同一声明

                                             (2)当声明需要修改时,只有头文件需要更新

3、头文件用于声明而不是定义

      定义只可以出现一次,声明可以出现多次

extern int ival = 10;  //虽然有 extern,但有初始化式,是定义
double fic;  //虽然没有初始化式,但也没有extern,所以也是定义

同一个程序中有两个以上文件含有上述任意一个定义都会导致多重定义链接错误。

 又因为头文件包含在多个源文件中,所以头文件不应该含有变量或函数的定义。

对于上述规定,有三个例外。头文件可以定义类、值在编译时就知道的const对象和inline函数

(const变量和它的初始化式必须是每个文件都可见的。而要使初始化式可见,一般都把这样的const变量定义在头文件中)

但如果const变量不是用常量表达式初始化,那么它就不应该在头文件中定义。应该在一个源文件中定义并初始化,并在头文件里为它加上extern声明。

4、预处理器

(1)头文件中有可能会引用其他头文件,所以源文件对于某个头文件可能会直接引用一次又间接引用一次。

因此设计头文件时应使其可以多次包含在同一源文件中。保证多次包含同一头文件不会引起该头文件定义的类和对象被多次定义。

头文件保护符可以避免在已经见到头文件的情况下重新处理该头文件的内容。

(2)避免多重包含:

为避免名字冲突,预处理器变量通常用大写字母表示

预处理器有两种状态:已定义或未定义。

#define 表示定义预处理器变量   #ifndef 表示检测指定的预处理器变量是否未定义

如果预处理器变量未定义,那么跟在其后的所有指示都被处理,直到出现#endif

例:

#ifndef SALES
#define SALES
//Defination of class
#endif

若SALES预处理器变量未定义,#ifndef测试成功,跟在#ifndef后面的所有行都被执行,直到#endif

若SALES预处理器变量已定义,#ifndef测试为假,#ifndef到#endif的部分都会被忽略

(3)自定义头文件

#include <xxx> 标准头文件       #include “xxx” 自定义头文件  

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

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

相关文章

java: 无法访问org.springframework.web.bind.annotation.RequestMapping......类文件具有错误的版本 61.0, 应为 52.0

文章目录 一、报错问题二、问题背景三、原因分析四、解决方案 一、报错问题 java: 无法访问org.springframework.web.bind.annotation.RequestMapping 错误的类文件: /D:/SoftwareInstall/Maven/repository/org/springframework/spring-web/6.0.9/spring-web-6.0.9.jar!/org/s…

latex报错Repeated entry解决办法

报错原因——重复了两个参考文献&#xff0c;删掉一个即可 总结 "Repeated entry"这个错误通常出现在你尝试在LaTeX中多次使用同一个标签&#xff08;label&#xff09;或者多次插入相同的图像/表格等时。例如&#xff0c;在LaTeX中&#xff0c;我们可能会为每一个章…

Modern C++ std::any为何要求Tp可拷贝构造?

小问题也会影响设计的思路&#xff0c;某个问题或某种case的探讨有助于理解设计的初衷。 声明&#xff1a;以下_Tp/Tp都是指要放入std::any的对象的类型。 它要求_Tp is_copy_constructible, 仅仅是因为有很多函数的实现调用了Tp的拷贝构造函数吗&#xff1f;比如说上节提到的初…

动态SQL的处理

学习视频&#xff1a;3001 动态SQL中的元素_哔哩哔哩_bilibili 目录 1.1为什么学 1.2动态SQL中的元素 条件查询操作 if 元素 choose、when、otherwise元素 where、trim元素 更新操作 set元素使用场景 复杂查询操作 foreach 元素中的属性 ​编辑 迭代数组 迭代List 迭代Map 1…

第3部分 原理篇2去中心化数字身份标识符(DID)(4)

3.2.3. DID解析 3.2.3.1. DID解析参与方 图3-5 DID 解析过程 本聪老师&#xff1a;我们之前提到过&#xff0c;DID 解析过程是将 DID 转换为对应的 DID 文档。这样做的目的是验证 DID 所代表的主体的身份。那么解析过程会涉及哪些概念呢&#xff1f;我们看图3-&#xff0c;DI…

端智能:面向手机计算环境的端云协同AI技术创新

近年来&#xff0c;随着移动端设备软硬件能力的进步&#xff0c;移动端的算力有了很大提升&#xff0c;同时面向移动端的机器学习框架和模型轻量化技术越来越成熟&#xff0c;端上的AI能力逐渐进入大众视野&#xff0c;端智能在电商领域也开始逐步走向规模化应用。通过持续探索…

leetcode日记(35)跳跃游戏Ⅱ

想了一个晚上&#xff0c;第一个思路是用动态规划&#xff0c;记录走到每一个节点需要跳动的最小步数&#xff0c;大致方法是每走到一个节点就遍历一下前面的全部节点&#xff0c;看看哪个节点可以一部跳到该节点&#xff0c;然后从中选取跳跃步数最小的节点&#xff0c;最后输…

基于springboot+vue的城镇保障性住房管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

练习 3 Web [ACTF2020 新生赛]Upload

[ACTF2020 新生赛]Upload1 中间有上传文件的地方&#xff0c;试一下一句话木马 txt 不让传txt 另存为tlyjpg&#xff0c;木马文件上传成功 给出了存放目录&#xff1a; Upload Success! Look here~ ./uplo4d/06a9d80f64fded1e542a95e6d530c70a.jpg 下一步尝试改木马文件后缀…

从头构建gpt2 基于Transformer

从头构建gpt2 基于Transformer VX关注{晓理紫|小李子}&#xff0c;获取技术推送信息&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持&#xff01;&#xff01; 如果你感觉对你有所帮助&#xff0c;请关注我。 源码获取 VX关注晓理紫并回复“chatgpt…

CSS 自测题

盒模型的宽度计算 默认为标准盒模型 box-sizing:content-box; offsetWidth (内容宽度内边距 边框)&#xff0c;无外边距 答案 122px通过 box-sizing: border-box; 可切换为 IE盒模型 offsetWidth width 即 100px margin 纵向重叠 相邻元素的 margin-top 和 margin-bottom 会发…

Benchmark学习笔记

小记一篇Benchmark的学习笔记 1.什么是benchmark 在维基百科中&#xff0c;是这样子讲的 “As computer architecture advanced, it became more difficult to compare the performance of various computer systems simply by looking at their specifications.Therefore, te…

python标识符、变量和常量

一、保留字与标识符 1.1保留字 保留字是指python中被赋予特定意义的单词&#xff0c;在开发程序时&#xff0c;不可以把这些保留字作为变量、函数、类、模块和其它对象的名称来使用。 比如&#xff1a;and、as、def、if、import、class、finally、with等 查询这些关键字的方…

【LeetCode】升级打怪之路 Day 11 加餐:单调队列

今日题目&#xff1a; 239. 滑动窗口最大值 | LeetCode 今天学习了单调队列这种特殊的数据结构&#xff0c;思路很新颖&#xff0c;值得学习。 Problem&#xff1a;单调队列 【必会】 与单调栈类似&#xff0c;单调队列也是一种特殊的数据结构&#xff0c;它相比与普通的 que…

【NR 定位】3GPP NR Positioning 5G定位标准解读(一)

目录 前言 1. 3GPP规划下的5G技术演进 2. 5G NR定位技术的发展 2.1 Rel-16首次对基于5G的定位技术进行标准化 2.2 Rel-17进一步提升5G定位技术的性能 3. Rel-18 关于5G定位技术的新方向、新进展 3.1 Sidelink高精度定位功能 3.2 针对上述不同用例&#xff0c;3GPP考虑按…

Go-知识简短变量声明

Go-知识简短变量声明 1. 简短变量声明符2. 简短变量赋值可能会重新声明3. 简短变量赋值不能用于函数外部4. 简短变量赋值作用域问题5. 总结 githuio地址&#xff1a;https://a18792721831.github.io/ 1. 简短变量声明符 在Go语言中&#xff0c;可以使用关键字var或直接使用简短…

【STK】手把手教你利用STK进行仿真-STK软件基础02 STK系统的软件界面01 STK的界面窗口组成

STK系统是Windows窗口类型的桌面应用软件,功能非常强大。在一个桌面应用软件中集成了仿真对象管理、仿真对象属性参数、设置、空间场景二三维可视化、场景显示控制欲操作、仿真结果报表定制与分析、对象数据管理、仿真过程控制、外部接口连接和系统集成编程等复杂的功能。 STK…

SpringBoot之Actuator的两种监控模式

SpringBoot之Actuator的两种监控模式 springboot提供了很多的检测端点(Endpoint),但是默认值开启了shutdown的Endpoint&#xff0c;其他默认都是关闭的,可根据需要自行开启 文章目录 SpringBoot之Actuator的两种监控模式1. pom.xml2. 监控模式1. HTTP2. JMX 1. pom.xml <de…

力扣 第 125 场双周赛 解题报告 | 珂学家 | 树形DP + 组合数学

前言 整体评价 T4感觉有简单的方法&#xff0c;无奈树形DP一条路上走到黑了&#xff0c;这场还是有难度的。 T1. 超过阈值的最少操作数 I 思路: 模拟 class Solution {public int minOperations(int[] nums, int k) {return (int)Arrays.stream(nums).filter(x -> x <…

VM虚拟机无法传输文件(更新时间24/3/3)

出现这个问题一般是未安装VMware Tools 以下为手动安装教程及可能出现的问题的解决方法&#xff1a; 1. 准备安装 2.用cmd手动启动安装 3. 安装过程默认即可&#xff0c;直接一直下一步 4.安装完成后会自动重启虚拟机&#xff08;没有的话手动重启即可&#xff09; 5.重启以后…