C++面相对象学习总结

C++面相对象学习总结

指针与引用

指针就是地址,定义一个指针的时候可以初始化也可以在随后再初始化

在指针定义的时候的*表示后面的是指针,而在程序运行执行的过程中的*是一个指针运算符,*p表示指针p指向的变量,指针进行相等或不等时类型为bool。

指针语法:类型 *指针变量;指针值为0时是一个空指针,即不指向任何对象的指针。

void*指针:可以持有任何类型的地址值;相关的值是个地址;void指针只能传送该地址值或者和其他地址值进行比较;void指针不能到其他类型指针的直接赋值。

引用语法:类型 &引用名 = 初始值;

左值引用:可以通过左值引用间接地操纵对象。引用一旦初始化,就不能再指向其他的对象。

定义:type& refVariable = leftValue;//引用必须被初始化,初始值是一个有内存地址的对象

右值引用语法:类型 &&右值引用变量 = 右值表达式;

引用比指针更安全。由于不存在空引用,并且引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用,因此引用很安全。对于指针来说,它可以随时指向别的对象,并且可以不被初始化,或为NULL,所以不安全。const 指针虽然不能改变指向,但仍然存在空指针。

指针常量与引用常量:

在指针定义语句的指针名前加const,表示指针本身是常量。在定义指针常量时必须初始化!而这是引用与生俱来的属性,无需使用const。

指针常量定义"int* const pointer=&b"告诉编译器,pointer(地址)是常量,不能作为左值进行操作,但是允许修改间接访问值,即*pointer(地址所指向内存的值)可以修改。

指针传递与引用传递:

引用传递和指针传递是不同的,虽然它们都是在被调函数栈空间上的一个局部变量,但是任何对于引用参数的处理都会通过一个间接寻址的方式操作到主调函数中的相关变量。而对于指针传递的参数,如果改变被调函数中的指针地址,它将影响不到主调函数的相关变量。如果想通过指针参数传递来改变主调函数中的相关变量, 那就得使用指向指针的指针,或者指针引用。

 

函数:

函数使用方法:返回类型 函数名(参数列表) { 函数体 }

函数需要声明其使用的返回类型,void可以作为不返回任何结果的返回类型。

函数定义中所用到的参数称为形式参数,在调用函数时提供数据的参数称为实际参数。

code blocks的编译器可以自动转换参数类型,使用时可以不必细较。

函数调用与使用与main函数的使用规则一样,即定义什么用什么。

当读代码到所写函数时,主函数暂停运作,控制权交给被调函数,待所写函数执行完成后自动把控制权交还主函数。

函数定义也可以被用作声明,但是函数在程序中只能定义一次

函数声明的形式:返回类型 函数名(参数列表) ;

函数重载:多个函数可以共享同一个函数名,针对不同的参数类型提供不同的操作

重载函数:如果同一个作用域内的几个函数名字相同但形参列表不同,则它们是重载函数

函数使用感悟:

首先要知道自己自己定义的函数要解决什么样的问题,不能完成的任务需要写多个函数解决。函数不要做多余的事情,只需要完成原本它应该要完成的事情就行,否则会使程序不够精炼。

 

参数传递

参数传递是指用函数调用的实参来初始化函数形参存储区的过程。

如果形参是引用类型,形参将绑定到对应的实参上,否则,将实参的值复制后赋给形参。

main函数的参数表用于从命令行接收参数,处理命令行选项,函数swap以两个指针变量作为参数,当main()调用swap时,是以值传递的方式将指针变量p1、p2的值(也就是变量a、b的地址)放在了swap在堆栈中为形式参数x、y开辟的内存单元中。

按值传递、地址传递、引用传递

按值传递的过程为:首先计算出实参表达式的值,接着给对应的形参变量分配一个存储空间,该空间的大小等于该形参类型的,然后把以求出的实参表达式的值一一存入到形参变量分配的存储空间中,成为形参变量的初值,供被调用函数执行时使用。这种传递是把实参表达式的值传送给对应的形参变量,故称这种传递方式为“按值传递”。

使用这种方式,调用函数本身不对实参进行操作,也就是说,即使形参的值在函数中发生了变化,实参的值也完全不会受到影响,仍为调用前的值。

如果在函数定义时将形参说明成指针,对这样的函数进行调用时就需要指定地址值形式的实参。这时的参数传递方式就是地址传递方式。

地址传递与按值传递的不同在于,它把实参的存储地址传送给对应的形参,从而使得形参指针和实参指针指向同一个地址。因此,被调用函数中对形参指针所指向的地址中内容的任何改变都会影响到实参。

按值传递方式容易理解,但形参值的改变不能对实参产生影响。

地址传递方式虽然可以使得形参的改变对相应的实参有效,但如果在函数中反复利用指针进行间接访问,会使程序容易产生错误且难以阅读。

如果以引用为参数,则既可以使得对形参的任何操作都能改变相应的数据,又使得函数调用显得方便、自然。引用传递方式是在函数定义时在形参前面加上引用运算符“&”。

值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。

引用传递过程中,被调函数的形式参数虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。

 

结构体

结构体把一组来自不同类型的数据组合在一起构成复合类型。

结构体语法:struct 结构体类型名{ 成员声明; };

结构体的成员不能独立使用,必须由结构体类型的变量通过成员选择运算符“.”来选择,或者由结构体类型的指针通过“->”运算符选择。

定义了结构体之后,可以用结构体名来创建对象。

 

枚举

枚举类型定义了一组命名的整数常量,以提高代码的可读性。编译器会给未指定值的枚举成员赋予相邻的值的下一整数值。

枚举的注意事项枚举提高了类型安全性;枚举可以很容易地在switch语句块中使用;枚举可以遍历;枚举可以有字段,构造函数和方法。

枚举是用户定义的整数类型。在声明一个枚举时,要指定该枚举可以包含的一组可接受的实例值。不仅如此,还可以给值指定易于记忆的名称。如果在代码的某个地方,要试图把一个不在可接受范围内的值赋予枚举的一个实例,编译器就会报告一个错误。

 

数组和指针

1.使用数组时一般会转换为指针:ia是一个int类型的指针常量;==ia和&ia[0]==都表示数组第一个元素的地址;可以使用指针对数组进行访问

2.auto和decltype与数组名:

(1)当使用数组名作为一个auto 变量的初始值时,得到的类型是指针而不是数组

eg:auto ia2(ia); //ia2 是一个指针,指向ia 的第一个元素

(2)decltype(数组名)返回的是数组类型:大小和元素类型

 

字符串

定义和初始化:字符串可以看成一个连续的字符数组,但是字符串有一个结尾符

要使用string 类型必须先包含相关的头文件

#include <string>

例如下面是上一小节定义的字符数组

#include <string>

string st( "The expense of spiritn" );

st 的长度由size()操作返回不包含终止空字符。

字符串长度:C++提供了两个函数来获取字符串的长度。一个是size()函数,一个是length()函数。这两个函数都是返回字符串的长度,且返回值均为size_type

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值