复合类型
For循环的另一形式: 先定义一个函数,例如int p[100];然后for(auto a:p),:的左面定义一个变量,右边则是数组的名字,这条语句的意思便是将p数组的所有的元素输出来。作用就是可以在不知道数组的大小的时候将数组中所有的元素输出。 指针:定义指针变量:指针的类型 指针名;使指针指向一个变量: 指针名=&变量名;变量的类型和指针的类型应该相同,此时*指针就相当与这个变量,例如 int *a=&m; *a=k;则是将k的值赋给m;另外还可以定义指向指针的指针:例如int**p=*a; 定义const指针: 1.coonst 类型 *指针;此时指针所指向的可以是一个整型变量,也可以是一个常变量,但不能通过这个指针来改变对应的变量的值,但是变量本身可以改变(不通过指针)。 2. 类型 const 指针;这种方式定义的指针地址只能是固定的不可以再进行改变。 3. .const 类型const 指针:指针指向的内存不能改变,并且指针指向的值不能进行改变。动态对象:动态对象不像静态对象,动态对象是没有名字的,通过指针间接操作。 new 定义变量:int *p=new 动态对象的类型(其中动态对象的初始值);删除时:delete 指针;定义数组:int *p=new int[100];删除:delete [] 指针;定义指针:需要调用头文件删除之后的指针不可以在进行使用。 引用: 左值引用 &代表左值引用,左值引用的是表达式结束后仍存在的值,既是左值引用的必有地址,左值引用时可以引用变量,但变量必须先进行定义。例如 int a=1;int&p=a; 右值引用: &&代表的是右值引用,右值引用可以引用表达式或者是具体的某个值,例如0;此类都是无法取址的,像例如a 是右值引用,而像 a则是左值引用。 结构体: 定义的方式:Struct 结构体名字 { 结构体成员 };切记最后有一个;。定义一个结构体变量直接可以 结构体名字 变量名。输入输出时要通过指针来输出结构体中的各元素;例如:struct kl{ Int a; };输出时则是cout<<kl.a;联合: 联合的定义方式与结构体相似,用union代替struct。但是联合应用时只可使用一个成员。 枚举: 定义时使用enum定义的是不限定作用域的枚举,而enum class或enum struct定义的则是限定作用域的枚举,限定作用域的优点是可以在不同的作用域内设定同样的成员名字,而不限定作用域的枚举则不能这样。 定义时例如:enum light{red,green,yellow};默认的这三个的值是0,1,2;也可以自己设定枚举中成员的值;例 enum light{red=2,green=6,yellow=88};枚举的其中一个用处可以在switch中使用,case后面所跟得值也可以是枚举定义的成员,从而更明了表示一种可能。 数组: 定义方式1 数组类型 数组名[数组大小]; 2 数组类型 数组名[]={数组中元素}; 3 char 数组名[]=”字符串”; 数组包括的元素为字符串中的字符和最后一个元素 ;切记一个数组不可以被另一个数组初始化。多为数组的初始化也可以,类似于一维数组的初始化方式。通过for语句和数组元素的下标访问数组元素时可以定义下标为size_t类型,然后通过for循环的方式访问数组中的所有元素。for(int e:数组名)这种方式来访问数组中的所有元素,若要改变数组中所有的元素需将语句修改为for(int &e:数组名)。也可以通过指针来访问数组的元素,定义数组的时候数组名的地址自定义为数组中第一个元素的地址,则访问数组的所有元素时可以通过for(int p=a;p<p 10;p ) { Cout<<*p; } decltype关键字可以提取变量的类型来定义另一个变量的类型, 例:int a; decltype(a) l;这样l的类型就和a的类型是相同的。 也可以通过迭代器来访问数组中的每一个元素。头文件是,有两个关键词,begin(),end(),括号内是数组名。 字符串 Char类型的字符串在头文件有几个函数, strlen()返回字符串的长度。Strcmp(p1,p2)判断p1,p2的关系,若等于则返回0,大于则返回正值,小于则返回负值。 Strcat(p1,p2)将后者附加到前者后面,并返回前者的值。 Strcpy(p1,p2)将后者复制到前者后面,并返回前者的值。 String:头文件。定义:string n;若是定义相同的多个元素组成的字符串,则可以string l(n,’l’);函数:getline(is,s)通过输入流把其中的一行输入到s中。 s.empty()判断字符串s 是否为空。s.size();返回s中字符个数。 s.c.str() 将字符串转换为字符数组。string类的变量比较是通过字典序进行比较。相加则是将后者连接在前者之后。访问string类的变量,可以通过变量名[下标]来访问,字符串中元素以0为第一个字符的位置,最终以’ ’结尾。 vector: 定义:vector<容器中的数据类型>变量名; vectorv1(v2);v1中的成员与v2的成员相同。 vectorv(n,l);v中的成员是n个同样的l。 vectorv=v1;v相当于v1. vectorv={m,n,b,n,m};v中的成员是大括号中成员。 函数: Empty() 判断容器是否为空是则返回true否则返回false Size() 容器中元素数量 push_back() 向容器尾端中添加元素 pop_back() 删除容器尾端中的元素 v={a,b,c} 用大括号中的元素代替vector中的元素 v.at(n) 在范围内返回值与v[n]相同,范围值外会报错 不可以通过v[n]这种方式向vector中添加元素。 迭代器: 例如一个vector的变量v,在用迭代器访问所有元素 vector::iterator it; for(it=v.begin();it!=v.end();it ) {cout<<it;//解引用,返回迭代器所指的元素 } It->mem 解引用,获取该元素成员mem It==it1 相等则说明指示为同一个元素或是同一个容器的尾后迭代器,不等则反之。 it指向 it的下一个元素 –it 指向it的上一个元素 It-it1同一容器两迭代器之间的距离允许迭代器加减n仍然代表迭代器加法与减法的赋值运算同样允许。同一容器中两个迭代器,一个迭代器指向的位置前于另一个迭代器,则前者小于后者。而迭代器也分为许多种,上面的迭代器可以读写并访问容器中所有的元素。 string::iterator it 之可以读写容器中的string元素。 vector::const_iterator it可以读容器中的元素,但不可以写 string::const_iterator it 可以读容器中的所有字符但不能写文件读写 将文件中的数据输入到程序中,需要先设计一个程序,名为文件 可以以这样的方式输入数据c:>文件<向外输出数据的文件>向其中输入数据文件名 标准输入输出流 头文件 Ifstream 输入文件的输入流 ofstream 输出文件的输出流 例如 #include using namespace std; int main() { ifstream in(“要输入数据文件的地址.文件的类型”);同时定义对象和打开文件 int num; in>>number;在文件中向外输入数据到number in.close(); 输入数据完成之后需要关闭输入流 ofstream out;定义输出的对象 out.open(“要输出数据文件的地址.文件的类型”);打开指定的文件,若文件不存在则会创建此文件 out<<number;将刚刚输入的number输出到指定文件中 out.close();输出完成后需要将输出流关闭 } 字符串流: 头文件 Istringstream 从string对象中输入数据 Ostringstream 向string对象中输出数据 例如 getline(cin,buffer) istringstream is(buffer);从buffer中输入数据 is>>number;ostringstream f(“ “);定义输出的对象f f<<number; 将number输出到f中 函数 定义函数: 函数返回值类型 函数名(行参类型 形参名) { 函数内的内容 } void类型的函数无返回值。 函数若是写在主函数之后必须在主函数之前对函数进行声明。例如: Int po(int i); 递归函数:递归函数是直接或间接调用自己的函数,例如在计算阶乘时可以使用递归函数例如 int p(int n){ If (n>1) { return np(n-1);} } 参数传递传值和传引用传值时,实参和形参是两个独立的对象,即行参在函数中的变化并不影响实参的变化,在传引用时实参和形参被绑定在一起,即行参的变化也会引起实参的变化。 传值的引用例如 int po(int p) {}这样定义的函数是传值,即实参和形参为两个独立的对象。 int po(int &p)这样定义的函数是传址引用,即实参和形参是绑定在一起。 int po(int * p)传指针的函数,行参与实参也是绑定在一起 数组参数 定义时不表明数组长度 Int po(int p[]){} 二维数组 Int po(int p[][10])需要标明行的长度 {} 返回引用 将函数的返回值进行操作 例如:const string &po(const string &U) { Return U;} cout<<po(n); 因为是传址,u与n绑定在一起,此时输出的就是n本身,可以对函数进行操作,既是对n操作。 函数重载:即函数有着一样的函数名,但其中形参不同类型;例如 int k(int a); Void k(int m); Int k(const int m); 函数有着相同的名字,但在引用时函数会根据实参而选择适合的形参的函数进行处理,或则选择最合适的函数进行操作。静态局部变量与局部变量的区别就是静态对象会一直存在,但是局部变量会在使用范围之后消失,定义静态对象可用static定义,例如static int a; Register 可以定义寄存器变量,寄存器变量的优点可以加速程序运行速度,定义register int a;