C++面向对象学习总结

一·常量表达式和constexpr
常量表达式:值不会改变并且在编译过程中就能计算出结果的表达式。
constexpr必须用常量表达式初始化,也就是说必须在编译过程就能计算出结果(若要用函数作为constexpr的初始值那么该函数应该是constexpr类型的函数)。
const 不要求在编译过程中就能计算出结果(强调运行时不可改变)。
大多数情况下并没有区别。
二auto和decltype
由auto声明变量的类型由编译器去自动分析表达式的类型,推断出变量的实际类型(auto变量必须有初始值)。eg:auto x=5; x的类型是int,但是当auto后定义多个变量时类型要一致(auto x=1,c=3.14;一个int 一个double错!)
decltype 可以通过表达式推断出定义的变量的类型但是不用该表达式初始化。
eg:int c=20;decltype© x;(x的类型便是int)。
三.new和delete
new在对上动态分配空间创建对象并返回对象的地址,一般将返回的地址保存在指针变量中,以便间接访问对上的对象
new表达式的形式
1.分配单个对象new 类型,new 类型(初始值)
2.分配多个连续存储的对象 new 类型[数组大小]
3.定位new(将对象创建在已经分配好的内存中) new (指针) 类型;
堆上的空间在使用后必须释放否则会造成内存泄漏,
new分配的空间用delete运算符释放。
1释放 new分配的单个对象 delete 指针;
2释放new分配的数组形式 delet[] 指针;
3 定位new没有对应的形式;
执行delete运算后指针指向的空间被释放不能再使用指针所指向的内容,但是指针自己的储存空间还是存在的。该指针被称为空悬指针指向不确定的单元如果在继续使用该指针间接使用这个单元就是非法的会引起不可预料的错误。
四 指针
概念:内存地址:程序运行时代码和需要的数据都被存储在内存中,内存是有序的字节序列,每个字节都有唯一的地址,使用这个地址就可以确定字节的位置。
直接访问通过名字访问变量的内存单元。
间接访问:通过内存地址找到存放数据的单元。

指针 持有一个对象的地址 称为指针指向这个对象。通过指针可以间接操纵他指向的对象。
(指针不能保存非地址值,也不能保存不同类型的地址)。
定义 类型 *指针变量;其中的类型并不是指针的类型 指针没有类型,这个类型是指针所指向地址的变量的类型。
&取地址符获取对象的地址 使用 int c=50;int *pi=&c(相当于int *pi; pi=&c;)
*解引用运算符 通过指针间接访问所指向的对象 使用 *pi=10;(此时c=10)
空指针:指针的值为0,不指向任何对象。
生成空指针的方法 0 nullptr NULL
void *指针(通用指针)可以持有任何类型的地址,只是持有地址但是不知道该地址所保存对象的类型,不能操纵void指针指向的对象,只传送该地址值或者和其他地址值进行比较,不允许void指针到其他类型指针的直接赋值。
指针的操作
同类型的指针可以进行比较返回bool类型表示是指向的是否是同一个地址。
进行加减数值运算表示从当前指向的地址向后移几个位置 如自加运算 指向与该地址相邻的下一个地址。
在定义指针时一定要初始化(初始化为空指针)否则会造成不可意料的后果。
五·引用
在赋值表达式中出现在赋值号左边的是左值在赋值号右边的称为右值。
可以取地址的有名字的就是左值,而不能取地址的没有名字的就是右值。
生成左值的表达式:返回左值引用的函数 赋值 下标 解引用和前缀自增自减运算符。
生成右值的表达式:返回非引用类型的函数 连同算术、关系、位运算、后缀自增自减运算符、字面值常量、要求转换的表达式。
左值引用 又称别名,它可以作为对象的另一个名字,通过引用可以间接的操纵对象,对引用的操作和对对象的直接操作一样。
定义 类型 &引用名=目标变量名;&在此不是求地址运算,而是标识符(引用必须被初始化
并且初始化完成之后引用将会和初始值对象一直绑定在一起)。
声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。故:对引用求地址,就是对目标变量求地址。引用本身不是对象所以不能定义引用的引用。
右值引用
右值引用就是必须要绑定到右值的引用
定义 类型 &&右值引用变量=右值表达式;(右值引用变量是左值)
可以显式的将一个左值转换为对应的右值引用类型。方法是调用标准库中定义的函数std::move() move()函数返回给定对象的右值引用。
六、const限定指针和引用。
指向const对象的指针(非const)
const地址无法赋给非const指针所以应该定义一个指向const的指针
定义 const type 指针 或 type const 指针
该指针指向的内存中的内容不可以改变但是该指针可以指向其他的const对象。
也可以将一个非const地址赋给 指向const的指针 但是不能通过该指针改变该变量的内容。
指向非const对象地const指针(常指针)
type
const 指针 指针的值初始化后不能改变指向固定的单元(只能指一次)
指向const对象的const指针
const type
const 指针(第一个const限定int表示指针指向的单元是常量,第二个const限定‘指针’表示指针的值也是常量,因此该指针所在的内存值不允许改变它所指向内存的值也不能改变)
const限定引用
const type &引用名(不能用const引用指向const对象)
const引用不能用来修改他所绑定的对象。
可以用任意表达式初始化const引用,只要表达式的结果能转换成引用的类型即可。
const引用仅对自己可参与的操作进行了限定对所指向的对象本身是不是常量未作限定。因为指向的对象也可能不是const,所以允许通过其他途径改变它的值。
七、文件的输入输出
头文件
定义输入文件流对象并打开文件 ifstream in(“文件名”); getline(in,strs)strs为字符串类型 从文件中读取一行存入strs。;
定义输出流对象并打开文件 ofstream out(“文件名”);
打开文件in.open(“文件名”)
完成操作后要关闭文件 eg:in.close()
字符串流
istringstream 从string中读取数据 定义 istringstream is(strs);
ostringstream 向string对象写入格式化的内容。
stringstream 即可以读取也可以写入。
对流的操作类似cin cout用<< >>操作
八、函数
实参一定是确定值 不需要类型!!!
参数传递
函数的形参是局部对象尽在函数的作用域内可见。如果形参是引用类型形参将绑定到对应的实参上,否则将实参的值复制后赋给形参
传值 将实参的值复制后赋给形参,形参和实参是两个独立的对象。
传指针传地址使用指针参数是传地址值。
传引用 将形参绑定到实参是实参对象的别名 可以直接改变实参的值不用返回值。
函数调用和返回
函数调用会使程序的控制权传递给被调函数而当前活动会被挂起。
当前函数执行完成后主函数从调用语句之后的语句恢复执行。
函数在执行完函数体的最后一条语句或或遇到return语句时返回。
默认情况下函数的返回值是按值传递的。数组和函数作参数时必须传指针
拷贝构造函数的参数必须传引用。
返回类型和return语句
return 语句形式
return; return表达式;
非void函数必须返回一个与声明类型匹配的值否则会引起编译错误。
返回值 默认情况下,函数的返回值是按值传递的,得到控制权的函数将接受return语句中指定的表达式值得副本。
返回引用
函数声明为返回引用,则不需要对return语句中的表达式进行复制,而是返回对象本身。
函数返回引用仅是它所指向对象的一个别名。

//找出s1和s2中比较短的一个并返回其引用
const string& shorter(const string& s1, const string& s2)
{	
return (s1.size() <= s2.size()) ? s1 : s2;
}
//函数返回结果时不会真正复制对象,返回的就是s1或s2本身。

对引用返回值的修改会改变实际返回的对象,为了避免这种情况,可以将返回值声明称const。
不能返回自动局部对象的指针或引用:函数执行结束后,函数占用的栈存储空间被释放,原本位于这段存储空间中的局部对象和临时变量都被释放,返回的局部对象引用或指针指向不再有效的内存区域
重载函数
如果同一个作用域内的几个函数名字相同但形参列表不同,则他们是重载函数
调用函数时如果存在多个重载函数,编译器将根据函数调用中指定的实参进行选择。
存储类别 static静态存储
static对象在控制流程第一次到达其定义点时被初始化,如果没有提供初始值就被自动初始化为0
在函数的后续调用中,初始化语句被跳过
静态对象的值在函数被多次调用之间保持有效,生存期会延续到整个程序结束但他的作用于仍然是局部的因此需要在同一函数的两次调用之间保留某些数据时可以使用局部static对象。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值