C++ primer阅读笔记(二)

目录

第三章 字符串、向量和数组

3.2 标准库类型string

定义和初始化string对象

处理string中的字符

3.3 标准库类型vector

定义和初始化vector对象

vector相关操作

3.4 迭代器

3.5 数组

第四章 表达式

算术运算重点

位运算

sizeof运算符

类型转换

隐式类型转换:

整型提升

显式类型转换(尽量避免)

第五章 语句

goto语句

try语句和异常处理


第三章 字符串、向量和数组

3.2 标准库类型string

定义和初始化string对象
  • 拷贝初始化:使用 = 号初始化一个变量的操作是

  • 直接初始化:不是 = 初始化的操作是(比如使用“()”),当值有多个只能使用直接初始化

  • string::size_type类型:一个无符号类型的值,足够放下任何string对象的大小,size函数的返回值也是该类型

  • 在C++中字符串字面值并不是string对象,使用 + 进行运算时确保两边至少有一个string

  • 建议使用C++代码的C语言标准库,ctype.h等效于cctype

处理string中的字符

cctype头文件中定义了一组标准函数:

函数解释
isalnum(c)c是字母或数字时为真
isalpha(c)c是字母时为真
iscntrl(c)c是控制字符时为真
isdigit(c)c是数字时为真
isgraph(c)c不是空格但可以打印时为真
islower(c)c是小写字母时为真
isprint(c)c是可打印字符时为真
ispunct(c)c是标点符号时为真
isspace(c)c是空白时为真(空格、横向制表符、纵向制表符、回车符、换行符、进纸符)
isupper(c)c是大写字母时为真
isxdigit(c)c是十六进制数字时为真
tolower(c)c是大写字母,输出对应的小写字母;否则原样输出c
toupper(c)c是小写字母,输出对应的大写字母;否则原样输出c

  • 范围fo循环:使用范围for(range for)语句: for (auto c: str),或者 for (auto &c: str)使用引用直接改变字符串中的字符。 (C++11)

  • str[x],[]输入参数为string::size_type类型,给出int整型也会自动转化为该类型

3.3 标准库类型vector

初始化时只有在无法执行列表初始化时,才会考虑其他初始化方式

  • Vecotr对象能高效增长,没有必要指定vector的大小,只有所有值元素都一样这一种例外情况

  • 使用范围for循环时,语句体内不能使用添加元素等改变vector大小的操作

  • vector对象以及string对象的下标运算符可以访问已存在的函数,而不能用于添加元素

定义和初始化vector对象

初始化vector对象的方法

方法解释
vector<T> v1v1是一个空vector,它潜在的元素是T类型的,执行默认初始化
vector<T> v2(v1)v2中包含有v1所有元素的副本
vector<T> v2 = v1等价于v2(v1)v2中包含v1所有元素的副本
vector<T> v3(n, val)v3包含了n个重复的元素,每个元素的值都是val
vector<T> v4(n)v4包含了n个重复地执行了值初始化的对象
vector<T> v5{a, b, c...}v5包含了初始值个数的元素,每个元素被赋予相应的初始值
vector<T> v5={a, b, c...}等价于v5{a, b, c...}
  • 列表初始化: vector<string> v{"a", "an", "the"}; (C++11)

vector相关操作
  • v.push_back(e) 在尾部增加元素。

  • vector支持的操作:

操作解释
v.emtpy()如果v不含有任何元素,返回真;否则返回假
v.size()返回v中元素的个数
v.push_back(t)v的尾端添加一个值为t的元素
v[n]返回v中第n个位置上元素的引用
v1 = v2v2中的元素拷贝替换v1中的元素
v1 = {a,b,c...}用列表中元素的拷贝替换v1中的元素
v1 == v2v1v2相等当且仅当它们的元素数量相同且对应位置的元素值都相同
v1 != v2同上
<,<=,>, >=以字典顺序进行比较

3.4 迭代器

  • 标准库容器的迭代器都定义了 == 和 != ,它们中大多都没有定义 < 运算符

  • 迭代器的标准库类型使用iterator和const_iterator来表示(只能读取容器内元素不能改变)

  • C++引入cbegin()和cend()函数:得到const_iterator类型的返回值。

  • ->运算符把解引用和成员运算符结合在一起,it->menu和(*it).menu相同

3.5 数组

  • 使用数组名字的地方,编译器一般会把它转换成指向数组首元素的指针。

  • 标准库类型限定使用的下标必须是无符号类型,而内置的下标可以处理负值。

  • 指针访问数组:在表达式中使用数组名时,名字会自动转换成指向数组的第一个元素的指针。

  • 多维数组使用范围for语句时,除了最内层的循环外,其他所有循环的控制变量都应该是引用类型

  • 现代C++程序中尽量使用vector和迭代器,减少使用数组和指针,尽量使用string类型,减少使用C风格字符串

第四章 表达式

算术运算重点

  • C++11新标准规定,除法运算中商无论正负,一律向0取整(直接切除小数部分)

  • 求模运算中,m%(-n) = m%n, (-m)%n = -(m%n)

  • 运算对象转换:小整数类型会被提升为较大的整数类型

  • 左值和右值:

    • C中原意:左值可以在表达式左边,右值不能。

    • C++:当一个对象被用作右值的时候,用的是对象的(内容);

    • 被用做左值时,用的是对象的身份(在内存中的位置)。

  • 求值顺序:int i = f1() + f2()

    • 先计算f1() + f2(),再计算int i = f1() + f2()。但是f1和f2的计算先后不确定

    • 但是,如果f1、f2都对同一对象进行了修改,因为顺序不确定,所以会编译出错,显示未定义

  • 位运算符是作用于整数类型的运算对象。

位运算

  • 二进制位向左移(<<)或者向右移(>>),移出边界外的位就被舍弃掉了。

  • 位取反(~)(逐位求反)、与(&)、或(|)、异或(^

  • 有符号数负值可能移位后变号,所以强烈建议位运算符仅用于无符号数

sizeof运算符

  • sizeof运算符返回一个表达式或者一个类型所占的字节数,该运算符满足右结合律,返回值是size_t类型

  • C++11新标准允许使用作用域运算符来获取类成员的大小

  • 对char类型或者char类型表达式执行sizeof运算,结果得1

  • string对象不会将数组转换成指针,对string和vector对象指挥返回实际大小

类型转换

隐式类型转换:
  • int类型小的整数值先提升为较大的整数类型。

  • 条件中,非布尔转换成布尔。

  • 初始化中,初始值转换成变量的类型。

  • 算术运算或者关系运算的运算对象有多种类型,要转换成同一种类型。

  • 函数调用时也会有转换。

整型提升
  • 常见的char、bool、short能存在int就会转换成int,否则提升为unsigned int

  • wchar_t,char16_t,char32_t提升为整型中int,long,long long ……最小的,且能容纳原类型所有可能值的类型。

显式类型转换(尽量避免)
  • static_cast:任何明确定义的类型转换,只要不包含底层const,都可以使用。 double slope = static_cast<double>(j);

  • dynamic_cast:支持运行时类型识别。

  • const_cast:只能改变运算对象的底层const,一般可用于去除const性质。 const char *pc; char *p = const_cast<char*>(pc),执行写操作会产生未定义的后果

    只有其可以改变常量属性

  • reinterpret_cast:通常为运算对象的位模式提供低层次上的重新解释,本质上依赖于机器。

第五章 语句

goto语句

  • goto语句的语法:goto lable:

    • lable是一条语句的标识符,带标签语句是一条特殊的语句,在它之前有一个标识符以及一个冒号

    • end:return

  • goto语句不能将程序的控制权从变量的作用域之外转移到变量的作用域之内

  • 尽量不要使用goto语句

try语句和异常处理

  • throw表达式:异常检测部分使用 throw表达式来表示它遇到了无法处理的问题。我们说 throw引发 raise了异常。

  • try语句块:以 try关键词开始,以一个或多个 catch字句结束。 try语句块中的代码抛出的异常通常会被某个 catch捕获并处理。 catch子句也被称为异常处理代码

  • 异常类:用于在 throw表达式和相关的 catch子句之间传递异常的具体信息。

  • 函数在寻找处理代码的过程中没有找到catch语句,程序将转到terminate的标准库函数,该函数的行为和系统行为有关,一般情况下执行该函数将导致程序非正常退出

  • 标准异常:exception头文件定义了最通用的异常类exception,职报告异常发生,没有其他信息,stdexcept也定义了几种常用的异常类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值