c++复合类型及函数知识点总结

C++复合类型及函数知识点总结

一、结构体(struct)
1.定义:结构体把一组来自不同类型的数据组合在一起构成复合类型,每个数据都是结构体的成员。
2.定义语法:struct 结构体类型名{ 成员声明; };
3.使用:结构体的成员不能独立使用,必须由结构体类型的变量通过成员选择运算符“.”来选择,或者由结构体类型的指针通过“->”运算符选择。
ps:结构体变量的成员在内存中按声明的顺序依次存放。
二、枚举
1.意义:枚举类型定义了一组命名的整数常量,以提高代码的可读性
eg:enum TrafficLight { red, green, yellow };//TrafficLight枚举类型定义了3个常量:0,1,2 分别和red,green以及yellow关联。 TrafficLight是一个枚举类型,可以用来定义枚举变量,变量的值只能是枚举成员。
2.枚举变量的值:
(1)编译器会给未指定值的枚举成员赋予相邻的值的下一整数值
eg:enum ShapeType {a=10, a=20, c}; //c的值是21
(2)可以使用未命名的枚举类型定义常量
enum {False, True};//定义了两个常量False和True,值分别是0和1
ps:枚举的成员名字是不可打印的,输出的是它所表示的整数值;C++不支持枚举成员之间的前后移动(递增或递减)
三、数组和指针
1.使用数组时一般会转换为指针:ia是一个int类型的指针常量;==ia和&ia[0]==都表示数组第一个元素的地址;可以使用指针对数组进行访问
2.auto和decltype与数组名:
(1)当使用数组名作为一个auto 变量的初始值时,得到的类型是指针而不是数组
eg:auto ia2(ia); //ia2 是一个指针,指向ia 的第一个元素
(2)decltype(数组名)返回的是数组类型:大小和元素类型
3.指针:一维数组元素在内存中按下标顺序依次存储,a[i]在内存中地址是a+i*。
多维数组在内存中按行序存储,二维数组a[m][n]的元素a[i][j] 在内存中的地址是a+(in+j)*
使用指针访问数组时需要控制指针的范围,确保指针指向数组的元素
四、begin()和end()
1.头文件:
2.用法:begin(数组名);//返回指向数组第一个元素的指针 end(数组名);//返回指向数组最后一个元素的下一个位置的指针,即第一个不合法位置的指针
3.指针运算:指向数组的指针可以执行解引用、自增、自减、加或减一个整数、两个指针相减、比较等运算。
(1)指针加或减一个整数n,结果仍是指针。
(2)两个指针相减的结果是它们之间的距离,参与运算的指针必须指向同一个数组中的元素。
(3)两个指针如果指向同一个数组的元素,可以利用关系运算符对其进行比较。
五、字符串(string)
1.头文件:
2.定义和初始化:

string s1;//默认初始化,s1为空串 string s2(s1);//s2是s1的一个副本 string s2=s1;//同上 string s3(“abc”);//s3为字面值为“abc”的副本,除了最后的空字符 sring s3="abc’;//同上 string s4(n,‘c’);//s4为有n个字符’c’组成的字符串
3.常用操作:

4.头文件中定义了一组获取或改变字符特性的标准库函数

ps:string对象s的下标范围从0到s.size()-1;下标变量的类型是string::size_type
六、vector

定义和初始化vector

vector中各种括号问题
vector v1(10);//v1有10个int元素,每个都初始化为0
vector v2{10}; //v2有1个元素,值是10
vector v3[10]; //v3是有10个元素的数组
//每个元素都是一个空vector对象
vector v4(10, 1); //v4有10个int元素,每个都初始化为1
vector v5{10, 1}; //v5有2个int元素,值分别是10和1

vector支持的操作

初始化指定vector对象大小和初始值
常用方法:创建一个空的vector,据需要向里面动态添加元素
·push¬_back() 将一个值添加到vector的末尾,并使vector大小增加
·pop_buck() 删除vector对象末尾的元素

注意事项
push_back()函数向vector中添加元素时,会创建参数的一个副本,添加的是这个新值而不是原始值
使用pop_back()函数删除vector对象中的元素时,要先检测对象是否为空
如果要用循环向vector对象中添加元素,不能使用范围for,范围for不能改变所遍历的容器的大小
不能用下标运算符向vector中添加元素,下标运算符只能访问已经存在的元素

七、文件读写
1.头文件
istream(ostream、iostream)的操作在ifstream(ofstream、fstream)中都可以使用
2.步骤:1)新建一个文件流对象:读文件用ifstream,写文件用ofstream;
(2)把文件流对象和文件关联起来:打开文件,使用文件流的open函数;
(3)操作文件流:使用与终端I/O相同的操作读写文件
(4)关闭文件流:使用文件流的close函数
3.字符串流
istringstream:从string对象中读取数据
ostringstream:向string对象写入格式化的内容
stringstream:从字符串读取数据,将数据写入字符串

函数知识点

一、函数基础
1.定义:函数是一个命名的代码块,通过调用函数可以执行相应的代码;可以用来实现各种算法,完成特定的任务
2.函数定义
语法形式为:返回类型 函数名(参数列表) { 函数体 }
函数必须指定一个返回类型函数返回类型,但是,可以返回函数指针和数组首地址如果函数不返回任何结果,将其返回类型声明为void
3.函数调用和返回
(1)调用语法:函数名(实参列表);
(2)形参和实参:
函数定义中的参数被称为形式参数,简称形参;在调用函数时提供的数据称为实际参数,简称实参。
函数调用时提供的实参个数和类型必须与函数定义中的形参个数和类型匹配。编译器进行参数类型检查,可以自动类型转换。
(3)调用时完成的工作:
用实参初始化函数对应的形参;将控制权转移给被调用的函数。
主调函数的执行暂时中断,被调函数开始执行
(4)函数的返回:遇到return语句时,结束函数的执行。
有返回值时返回return语句中的值,函数的返回值用于初始化调用表达式的结果;将控制权从被调函数转移回主调函数。
4.函数声明
(1)函数在使用之前必须声明一个函数可以在程序中多次声明
函数定义也可以被用作声明,但是函数在程序中只能定义一次
函数声明的形式
(2)声明语法:返回类型 函数名(参数列表) ;
二、参数传递
1.定义:参数传递是指用函数调用的实参来初始化函数形参存储区的过程。
2.函数的形参是局部对象,仅在函数的作用域内可见
形参的类型决定了实参初始化形参的方式
如果形参是引用类型,形参将绑定到对应的实参上
否则,将实参的值复制后赋给形参
3.当实参的值被复制给形参时,形参和实参是两个独立的对象,实参被称为按值传递,或传值调用函数
4.函数传递参数方程
(1)传指针:使用指针参数是传地址值
(2)传引用:按引用传递参数,引用形参绑定到实参,是实参对象的别名
当参数是引用时,函数接收的是实参的左值而不是值的副本。函数操纵的形参是实参的别名,因而可以改变实参的值
(3)传值:把实参的值复制到形参的存储区中,即用实参值初始化形参
按值传递参数的适用性:
优点:简单直接;不会改变实参的内容
缺点:大型的类对象或结构体变量作为实参时不适合;必须要修改实参的值时不适合
(4)传值方式的选择:
对于内置类型的对象,传值的方式更简单直接
如果想在函数内改变实参,使用传引用或传指针的方式
传指针的语法比引用复杂一些,但使用起来更清晰明确
对于类类型的对象,尽量使用引用传递参数,效率更高
使用const限定可以避免实参被修改
数组和函数作参数时必须传指针
拷贝构造函数的参数必须传引用
5.函数调用和返回:
函数调用会使程序的控制权传递给被调函数,当被调函数执行完成时,主调函数从调用语句之后的语句恢复执行
函数在执行完函数体的最后一条语句或遇到return语句时返回
6.main函数的参数
int main(int argc, char* argv[]){…}
main函数的参数表用于从命令行接收参数,处理命令行选项
argc是命令行参数的个数
字符串数组argv的每个元素依次保存接收的参数字符串
三、返回类型和return语句
1.return:
return;//用在返回类型为void的函数中,不是必需的 return 表达式;//用于其他类型

非void的函数必须返回一个与声明类型匹配的值,否则会引起编译错误
2.返回类型:
(1)返回值:默认情况下,函数的返回值是按值传递的;
返回值的方式和初始化变量或形参的方式完全一样。
(2)返回引用:将函数声明为返回引用,则不需要对return语句中的表达式进行复制,而是返回对象本身。函数返回的引用仅是它所指向对象的一个别名。
(3)函数的返回类型决定函数调用表达式的类型,以及是否是左值:调用一个返回引用的函数得到左值;其他返回类型得到右值。
(4)返回引用的函数调用表达式可以作为左值使用:可以为返回类型是非const引用的函数的结果赋值;对引用返回值的修改会改变实际返回的对象,为了避免这种情况,可以将返回值声明为const。
(5)返回列表:如果列表为空,临时量执行值初始化;否则,返回的值由函数的返回类型决定
3.main函数的返回值:
main函数的返回类型为int,main()函数返回0表示执行成功,返回非0值表示执行失败。
允许main函数没有return语句直接结束
4.尾置返回类型语法:
语法形式:auto 函数名(形参列表) -> 返回类型;
四、函数重载
1.C++函数重载机制:多个函数可以共享同一个函数名,针对不同的参数类型提供不同的操作
2重载函数:如果同一个作用域内的几个函数名字相同但形参列表不同,则它们是重载函数。调用重载函数时,编译器会根据实参的类型推断出要调用的是哪个函数。
3.注意:重载函数的参数表必须不同,或参数个数不同,或参数类型不同;返回类型不能区分两个重载函数,因为调用函数时可以忽略函数的返回值。
4const限定词对形参类型的影响:非指针和引用上的const限定词不能区分重载函数;const限定指针或引用时,可以实现函数重载。
五、作用域和存储类别
1.生存期、作用域和存储类别:
(1)对象的生存期:指程序执行过程中对象存在的时间;对象的生存期与对象的作用域和存储类别密切相关
(2)名字的作用域:程序的一段区域,名字的作用域指的是该名字可以在哪些程序文本区使用。
(3)对象的存储类别:创建对象时分配内存空间的方式和内存空间的类型。
2.作用域:
(1)全局对象:
a.全局变量和全局函数是在全局作用域中可以定义函数和变量;;在程序整个执行过程中都存在,可以在整个程序中使用;全局的内置类型变量,不指定初始值时被初始化为0值
b.全局变量和非inline 全局函数在程序中只能定义一次:关键字extern 用来声明全局对象,可以在同一文件中或同一程序的不同文件中多次出现
(2)局部对象:
局部对象的作用域从其声明点开始,到函数结束处为止;
在语句块中声明的对象具有块作用域,只在该语句块中可见。eg:for、if、while和switch 语句。
局部对象默认为自动存储,可以通过存储类别关键字static 和register 对其进行修改
声明为static的局部对象是静态存储的;
函数中频繁使用的自动变量可以用register 关键字声明。
(3)文件作用域:
a.static全局对象:在全局变量或全局函数的定义前加static 关键字,就将全局对象的作用域限制在当前源文件内;一个源文件中定义的static全局对象在该程序的其他源文件中是不可见的。
b.在全局范围内定义的const 对象默认是文件作用域:
定义const 对象时加关键字extern将作用域改为全局的。
c.inline 函数是文件作用域
(4)namespace作用域:
a.用户声明的每个namespace都是一个作用域:namespace只能在全局作用域或另一个namespace中定义;未命名namespace中的成员可以在其所属的文件内不加限定前缀使用,就像是具有文件作用域的名字。
b.using 声明可以将namespace中的名字引入特定作用域

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值