1、 类型转换
Unsigned char c=-1;//假设char占8位,c的值为255
2、 引用
* 必须初始化
* 必须绑定在对象上,不能与字面值和计算结果绑定
* 引用本身不是对象,不能定义引用的引用
3、指针(&为取地址符)
* Int ival=42;
Int *p = &ival
*解引用符(操作符*)
*建议初始化所有指针:尽量先定义对象,再定义指针
* Int* p1,p2; //p1是指向int的指针,p2是int
*指向指针的引用
Int i =42;
Int *p;
Int *&r=p; //r是一个对指针p的引用
3、 Const
l 必须初始化为常量
l 默认状态下,const对象仅在文件内有效。当多个文件中出现了同名的const变量时,等同于在不同文件中分别定义了独立的变量
l 只在一个文件中定义const,而在多个文件中声明并使用它,对于const变量不管是声明还是定义都添加extern关键字
l Const 的引用。
Const int ci = 1024;
Const int &r1 = ci;//正确:引用及其对于的对象都是常量
r1 = 42;//错误:r1是对常量的引用,常量的引用不能被用作修改它所绑定的对象
int &r2 = ci;//错误:试图让一个非常量引用指向一个常量对象
l 初始化常量引用时允许用任意表达式作为初始值
l 对const的引用可能引用一个非const的对象
4、 指针和const
l 指向常量的指针不能用于改变其所指向对象的值;要想存放常量对象的地址,只能使用指向常量的指针;
l 允许令一个指向常量的指针指向一个非常量的对象,但不能通过该指针改变对象的值。
l Const指针
Int errNumb = 0;
Int *const curErr = & errNumb;//curErr 将一直指向 errNumb
l 指针本身是常量,也可以通过指针来改变其所指对象的值。
l 顶层const:指针本身是个常量
底层const:指针所指的对象是一个常量。
l Consttexpr变量。声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化。常量表达式是指不会改变并且在编译过程中就能得到计算结果的表达式。
l Const int *p = nullptr; // p是一个指向整形常量的指针
Constexpr int *q = nullptr;//q是一个指向整数的常量指针
5、 处理类型
l Typedef double wages;//wages 是double 的同义词
Using SI =Sales_item;//
l Auto 类型说明符。让编译器通过初始值来推算变量的类型。
6、 自定义数据结构
l 类定义的最后加分号;
l 编写自己的头文件。头文件名应与类名一致;通常包含那些只能被定义一次的实体,如类、const和constexpr变量等。
l 预处理器概述
#ifndef SALES_DATA_H
#define SALES_DATA_H
#include <string>
Struct Sales_data{
};
#endif
7、 标准类库string
l String对象上的操作
(1) 读写string对象
String s;
Cin>>s;
(2) 使用getline 读取一整行
getline(is,s)//从is中读取一行赋给s
int main ()
{
String line;
While(getline(cin, line))
Cout<<line<<endl;
return 0;
}
(3) empty和size操作
(4) 字面值和string对象相加
String s4 = “hello”+”,”;// 错误:两个运算对象都不是string
String s6 = s1 +”,”+”world”;//正确,相当于 string s6=(s1+”,”)+“world”;
String s7 = “hello”+”,”+s2;//错误:不能把字面值直接相加
(5)处理string 对象中的字符
For(declaration: expression)
Statement
String s(“hello world!!!”)
Decltype(s.size()) punct_cnt = 0; // punct_cnt类型和s.size返回类型相同
For (auto c:s)
If(ispunct(c))
++punct_cnt;
Cout<< punct_cnt<<”punctuationcharacters in”<<s<<endl;
//使用范围for语句改变字符串的字符
Strings(“Hello World!!!”);
//转换成大写形式。想要改变string对象中字符的值,必须把循环变量定义成引用类型
for(auto & c: s)
c=toupper(c);//c是一个引用,因此幅值语句将改变s中字符的值
cout<<s<<endl;
//只处理一部分字符。下标运算符[]
//使用下标执行随机访问
8、 标准类库vector
l Vector表示对象的集合,其中所有对象的类型都相同。它是一个类模板。
模板不是类或函数。相反可以将模板看作为编译器生成类或函数编写的一份说明。编译器根据模板创建类或函数的过程称为实例化,应指出编译器应把类或函数实例化为何种类型。
l 定义和初始化vector
Vector<string>svec;//默认初始化
Vector<string>articles = {“a”,”an”,”the”};//列表初始化
Vector<int>ivec(10,-1);//10个int类型的元素,每个都初始化为-1
Vector<int>v1(10);//v1有10个元素,每个值都是0
Vector<nt>v2{10};//v2有1个元素,该元素的值是10
!!花括号列表初始化;圆括号初始化vector对象容量和元素处置;
Vector<string>v2(“a”,”an”,”the”);//错误,列表只能用花括号初始化
Vector<string>v7(“hi”);//错误:不能用字符串字面值构建vector对象
Vector<string>v8{10};//v7有10个默认初始化的元素。Int型无法直接赋给string
l 向vector 对象中添加元素
Push_back负责把一个值当成vector对象的尾元素”压到”vector对象的尾端。
l 其他vector操作
v.empty()
v.size()
v[n]//返回v中第n个位置上的元素的引用
l 计算vector内对象的索引
不能用下标形式添加元素
Vector<int>ivec;//空vector对象
for(decltype(ivec.size())ix=0;ix!=10;++ix)
ivec[ix] = ix;//严重错误:ivec不包含任何元素
确保下标合法的一种有效手段就是尽可能使用范围for语句。
9、 迭代器
l auto b = v.begin(),e=v.end();//b和e的类型相同,b表示v的第一个元素,e表示v的第二个元素。
l 标准容器迭代器的运算符
*iter// 返回迭代器iter所指元素的引用
itre->mem //解引用iter并获取该元素的名mem的成员,等价于(*iter).mem
++iter //
- -iter//