C++基础随笔004

1、类和对象

(1)C++面型对象的三大特性:封装、集成、多态

(2)C++认为万物皆可为对象,对象上有其属性和行为。

(3)封装

1)封装的意义:

  • 将属性和行为作为一个整体,表现生活中的事物。

  • 将属性和行为加以权限控制。

2)封装的意义一:

  • 在设计类的时候,属性和行为写在一起,表现事物。

  • 语法: class 类名 { 访问权限: 属性 / 行为 };

3)封装的意义二:

  • 在设计类的时候,可以把属性和行为放在不同的权限下,加以控制:

  • 访问权限有三种:

    • public 公共权限

    • protected 保护权限

    • private 私有权限

(4)struct和class区别

1)在C++中,struct和class唯一的区别在于默认的访问权限不同

2)区别:

  • struct默认权限为公共

  • class默认权限为私有

(5)成员属性设置为私有:

1)优点1:将所有成员属性设置为私有,可以自己控制读写权限

2)优点2:对于写权限,我们可以检测数据的有效性。

(6)对象的初始化和清理:

1)C++利用构造函数和析构函数完成对象的初始化和清理工作。

2)构造函数:主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无须手动调用。

3)析构函数:主要作用在于对象销毁前系统自动调用,执行一些清理工作。

(7)构造函数语法:类名 {}

1)构造函数,没有返回值也不用写void。

2)函数名与类名相同。

3)构造函数可以有参数,因此可以发生重载。

4)程序在调用对象的时候会自动调用构造函数,无须手动调用,而且只会调用一次。

(8)析构函数语法:~类名 {}

1)构造函数,没有返回值也不用写void。

2)函数名与类名相同,在名称前加上符号~。

3)构造函数不可以有参数,因此不可以发生重载。

4)程序在对象销毁前会自动调用析构函数,无须手动调用,而且只会调用一次。

(9)构造函数的分类及调用

1)两种分类方式:

  • 按参数分为:有参构造和无参构造

  • 按类型分为:普通构造和拷贝构造

2)三种调用方式:

  • 括号法

  • 显示法

  • 隐式转换法

(10)拷贝构造函数调用的时机:

C++ 中拷贝构造函数调用时机通常有三种情况:

  • 使用一个已经创建完毕的对象来初始化一个对象

  • 值传递的方式给函数参数传值

  • 以值方式返回局部对象

(11)构造函数调用规则:

默认情况下,C++编译器至少给一个类添加3个函数

1)默认构造函数(无参, 函数体为空)

2)默认析构函数(无参, 函数体为空)

3)默认拷贝构造函数,对属性进行值拷贝

4)构造函数调用规则如下:

  • 如果用户定义有参构造函数,C++不在提供默认无参构造函数,但是会提供默认拷贝构造函数;

  • 如果用户定义拷贝构造函数,C++不会再提供其他构造函数。

(12)深拷贝与浅拷贝

1)浅拷贝:简单的赋值拷贝操作

2)深拷贝:在堆区新申请空间,进行拷贝操作

3)注意:如果属性有在堆区开辟的,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题。

 

2、静态成员:

(1)静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员。

(2)静态成员分为:

1)静态成员变量:

  • 所有对象共享一份数据

  • 在编译阶段分配内存

  • 类内声明,类外初始化

2)静态成员函数:

  • 所有对象共享同一个函数

  • 静态成员函数只能访问静态成员变量

 

3、C++对象模型和this指针

(1)在C++中,类内的成员变量和成员函数分开存储的

(2)只要非静态成员变量才属于类对象上。

(3)this指针概念:

由于在C++中,类内的成员变量和成员函数分开存储的,每一个非静态成员函数只会诞 生一份函数实例,也就是说多个同类型的对象会公用一块代码,

那么问题是:这一块代码如何区分是哪个对象调用自己的呢?

C++中通过提供特殊的对象指针,this指针,解决上述问题。

this指针指向被调用的成员函数所属的对象。

this指针是隐含每一个非静态成员函数内的一种指针。

this指针不需要定义,直接使用即可。

this指针的用途:

  • 当形参和成员变量同名时,可用this指针来区分;

  • 在类的非静态成员函数中返回对象本身,直接使用即可。

 

4、const修饰成员函数

(1)常函数:

  • 成员函数后加const后我们称为这个函数为常函数
  • 常函数内不可以修改成员属性
  • 成员属性声明时可以加关键字mutable,在常函数中依然可以修改

(2)常对象:

  • 声明对象前加const称该对象为常对象
  • 常对象只能调用常函数

 

5、友元

(1)友元的目的就是让一个函数或者类,访问另一个类中的私有成员

(2)关键字:friend

(3)友元的三种实现

1)全局函数做友元

2)类做友元

3)成员函数做友元

 

6、运算符重载

(1)运算符重载的概念:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的类型数据。

 

7、继承

(1)继承的好处:可以减少重复的代码

class A : class B;

A类称为子类 或 派生类

B类称为父类 或 基类

(2)派生类中的成员,包含两大部分:

1)一类是从基类继承过来的,另一类是自己增加的成员。

2)从基类继承过来的表现其共性,二新增的成员体现其个性。

(3)继承中先调用父类的构造函数,再调用子类的构造函数,析构顺序与构造相反。

(4)子类对象可以直接访问到子类中同名成员;

(5)子类对象加作用域可以访问到父类同名成员;

(6)当子类与父类拥有同名的成员函数时,子类会隐藏父类中同名成员函数,加作用域可以访问到父类中同名函数。

(7)继承同名静态成员处理方式:

1)静态成员和非静态成员出现同名,处理方式一致

2)访问子类同名成员,直接访问即可

3)访问父类同名成员,需要加作用域

 

8、多态

(1)多态分为两类:

1)静态多态:函数重载和运算符重载属于静态多态,复用函数名

2)动态多态:派生类和虚函数实现运行时多态。

(2)静态多态和动态多态区别:

1)静态多态的函数地址早绑定 ——》编译阶段确定函数地址

2)动态多态的函数地址晚绑定 ——》运行阶段确定函数地址

(3)多态满足的条件:

1)有继承关系

2)子类重写父类中的虚函数

(4)多态使用条件:

1)父类指针或引用指向子类对象

(5)注意:

重写:函数返回值类型、函数名、参数列表完全一致称为重写。

 

9、纯虚函数和抽象函数

(1)在多态中,通常父类中虚函数的实现是毫无意义的,主要都是调用子类重写的内容,因此可以将虚函数改为纯虚函数;

(2)纯虚函数语法:virtual 返回值类型 函数名 (参数列表) = 0 ;

(3)当类中有了纯虚函数,这个类也称为抽象类;

(4)抽象类特点:

1)无法实例化对象

2)子类必须重写抽象类中的纯虚函数,否则也属于抽象类;

 

10、虚析构和纯虚析构

(1)多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码。

(2)解决方式:将父类中的析构函数改为虚析构或者纯虚析构;

(3)虚析构和纯虚析构的共性:

1)可以解决父类指针释放子类对象

2)都需要有具体的函数实现

(4)虚析构和纯虚析构的区别:

1)如果是纯虚析构,该类属于抽象类,无法实例化对象;

(5)虚析构语法:

virtual ~类名(){}

(6)纯虚析构语法:

virtual ~类名() = 0 ;

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xw-何妨吟啸且徐行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值