C++类和对象

在C++中,结构体内不仅可以定义变量,还可以定义函数。但是C++的结构体完全不同于C语言的结构体,C语言的结构体仅仅只是一个多个基本数据类型的集合,但在C++中,结构体却是类的一种体现。两者几乎没有差别。

面向对性的三大特性:继承、封装、多态。

C++的结构体即是是孔结构体,在内存中也是占有一字节的空间的。

类是什么:类就是遵循了面向对象的原则,对某一个真实存在的类抽象成为一个计算机中的类,这样通过这个类,就可以实例化这个对象,进而对对这个对象进行操作。类中的数据称位类的属性或者是成员变量,函数称为成员函数或者是类的方法。

类有访问权限:默认的是private,只有通过说明public访问权限,才可以使得外部方法调用private成员函数或变量。访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限制符上的区别。而结构体的默认访问权限是public。

类的作用域:类定义了一个新的作用域,所有类的成员都在这个作用域里,需要使用::作用域解析符来指明成员属于哪个类。

类的实例化:类在定义的时候,仅仅只是画了一张图纸,只有当实例化一个类的时候,才是使用这张图纸早了一间房子,只有当类实例化以后,才会在内存中开辟位置。

计算类的大小:类的大小和结构体差不多,但是当类为空时,类的大小是1,编译器给了一个空类一个字节来唯一识别这个类。

类中成员的存储:类中有很多成员变量,也有很多成员函数,但是在存储的时候,只有每个成员变量会为每一个类的对象创建一份,就是内存的开辟,而成员函数在实例化的时候,并不进行内存的开辟,只有当要使用的时候,才通过该类的对象传入一个this指针,来完成类的对象的操作。

this指针:就是一个类的对象在调用这个类的成员方法的时候,因为一个类有很多对象,所以为了唯一标识出调用这个成员方法的对象,就使用一个this指针,通过给成员方法传入一个this指针,就可以只改变这个对象,而不改变这个类的其他对象。

类的6个成员函数:每个类都会有6个默认的成员函数,及时这个类中什么都没有,但是依然自动生成6个默认成员函数。(如下列举的六个默认成员函数)

构造函数:构造函数的作用就是对一个类的对象进行初始化,在不主动调用构造函数的时候,系统会在自动调用默认的构造函数,完成对对象的初始化。除了使用系统默认的构造函数外,还可以有我们自己写一个构造函数。构造函数是没有返回值类型的,访问权限必须是public,而且构造函数的函数名必须是类名,至于构造函数的参数,可以有也可以没有,并且构造函数也是可以重载的,根据创建对象时传入的参数,进行构造函数的选择。

析构函数:析构函数就是在程序结束的时候调用的,完成类的一些清理工作。当我们没有主动写析构函数的时候,系统会自动为我们的对象生成析构函数,析构函数的作用就是进行一些成员的销毁。(猜测)如果这个对象中有malloc开辟的指针的话,也会对这个指针进行free。

拷贝构造函数:拷贝构造函数就是将一个对象的所有值赋值给另一个同一个类的对象,也是系统会自动提供的一个成员函数,但是系统提供的拷贝构造函数是一个浅拷贝,只能进行内存的拷贝,即将A对象的内存中的所有值都拷贝给B对象,这样的拷贝,就被成为浅拷贝。由于类中有时候会有动态内存开辟的指针变量,在拷贝的时候,这个指针变量的指向也会进行拷贝,虽然在拷贝的时候没有问题,但是在使用的时候,就会发现,A对象中动态内存开辟的地址丢失了,而且在程序结束时,进行析构函数调用的时候,会对同一个动态内存开辟的空间进行多次释放,这个是一个错误的操作,所以浅拷贝是一种不太好的拷贝方式。

赋值操作符重载: 运算符重载就是对运算符进行重载,这里可以将运算符看做函数,如果将运算符看做类的成员函数,就可以理解运算符重载的概念了,因为运算符的作用不就是解决一些问题吗,或是赋值,或是取地址,他们归根结底不也还是一个函数吗,只不过这个函数没有参数,有的只有左值和右值。运算符重载的关键字是operator,并且运算符重载也是有返回值类型的,在operator后紧跟需要重载的运算符,然后再接着是参数列表。运算符重在的时候,有5个运算符是不能重载的,有: .*  、 :: 、  sizeof、  ?: 、. 这几个运算符不能重载,除此之外,剩下的运算符都可以进行重载,但是不能讲原本没有的运算符进行重载。也就是不能引入新的操作符。运算符重载后在调用的时候,传入的是一个this指针,如果重载运算符函数中,this指针被设为const,就不能进行通过编译,因为C++有着严格的类型检查,不能将一个非const类型的赋值给const类型的变量。一个类如果没有现实的定义运算符重载,编译器也会自动生成一个,完成对象按字节序的值拷贝。

 

const成员函数   const的使用特点就是类型对类型,如果类型不匹配,就会出现错误,所以看待const问题的时候,最主要的还是类型的匹配性。将const修饰的成员函数,表明该成员函数不能对类中的任何成员进行修改。如果成员函数中的this指针被限制为const类型的话,这个成员函数就不能进行任何传入参数的调用。

 

在上面的几个问题中,其实就是相当于只能将const视为一个进一步的限制,如果将一个正常限制的函数this指针传给有限制的话,就相当于自动给这个没有限制的加一个限制,这是可行的,但是反过来,如果将一个有限制的传给一个没有限制的话,就会使他的限制消除,所以这是不可行的。(我自己地理解)

 

取地址及const取地址操作符重载    通过对取地址操作符进行重载,那么执行取地址操作时,就不会拿到正确的地址了。有一个保护的作用。

 

static关键字的使用:static就是在将其命名的变量和函数放进静态区的关键字,static修饰的成员变量的初始化不是在调用构造函数的时候,而是在类的外面,通过显示初始化进行初始化,整个程序的执行过程中不会被销毁,并且在static修饰的类中,如果构造函数中进行了static成员的修改,那么整个类的static成员都会进行修改。

 

成员变量的初始化:成员变量在初始化的时候,如果类中有const修饰的变量,类类型成员(该类没有默认构造函数)或者是引用类型的时候,就需要使用初始化列表进行初始化。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值