C++基础——C++面向对象之类、对象与继承基础总结(类和对象概念、构造函数与析构函数、this指针、继承)

news2025/7/26 8:27:35

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 

《QT开发实战》

《嵌入式通用开发实战》

《从0到1学习嵌入式Linux开发》

《Android开发实战》

《实用硬件方案设计》

长期持续带来更多案例与技术文章分享;

欢迎商业项目咨询,10年+软硬全栈内功,助力解决您的尊贵需求。

原文链接:https://winter.blog.csdn.net/article/details/129376476

——————————————————————————————————

目录

0 引言

1 类和对象

1.1 类和对象基本概念 

1.2 构造函数和析构函数

1.3 this指针

2 继承

3 总结


0 引言

        C++面向对象有三大特征,分别是继承、多态和封装,接下来的三篇博文将会对这三大特性分别进行总结,并结合实例编程测试,加深理解,本次博文首先总结下C++的继承特征。

1 类和对象

1.1 类和对象基本概念 

       C++ 在 C 语言的基础上增加了面向对象编程, C++ 支持面向对象程序设计。类是 C++的核心特性,通常被称为用户定义的类型。类用于指定对象的形式,它包含了数据表示法和用于处理数据的方法。类中的数据和方法称为类的成员,函数在一个类中被称为类的成员(C++中的类跟Java语言实在太像了)。

        举个例子,一个人,他有名字、年龄等等这些属性,同时人也会吃饭、走路、睡觉,将人统称为一个类,类就抽象出来的一个概念,具体到是哪个人,就叫做对象。从类中实例化对象有两种方法:从栈中实例化、从堆中实例化

下面自定义一个people类,看下如何自定义类和使用对象的。

在Ubuntu下新建一个03_class_people目录,其下新建一个03_class_people.cpp文件,代码如下:

#include <iostream>
#include <string>
using namespace std;

class People
{
public:
	string name;
	int age;
	void speak(){
		cout << "my name is " << name << ", age is " << age << endl;
	}	
};

int main()
{
	//从栈中实例化对象
	People people1;
	people1.name = "小芳";
	people1.age = 18;
	people1.speak();

	//从堆中实例化对象
	People *people2 = new People();
	if(NULL == people2){
		return 0;	
	}
	people2->name = "张三";
	people2->age = 20;
	people2->speak();

	delete people2;
	people2 = NULL;
	return 0;
}

首先,定义了一个People类,内部定义了两个变量,一个方法,其中string 是C++的数据类型,使用频率很高;使用了public(公有的)访问限定符,目的为了下面使用类时调用这些变量和方法,若不加限定,默认的private(私有的);

然后,从栈中实例化一个对象people1,并为people1中的成员变量赋值,然后调用对象中的speak()方法打印输出;

接着,从堆中实例化一个对象people2(使用关键字 new 的都是从堆中实例化对象),这种方式需要开辟内存,指针会指向对应的内存空间,若申请内存失败,指针就会指向NULL,程序退出;赋值后,同样打印输出,最后释放内存。

编译程序,运行测试下:

        从上面我们可以理清了C++中类和对象的概念,从类实例化出来的就是对象,对象拥有类的属性,可以从栈或堆中实例化出来。

1.2 构造函数和析构函数

        构造函数在对象实例化时被系统自动调用,仅且调用一次。实际上定义类时, 如果没有人为定义构造函数和析构函数, 编译器就会生成一个构造函数和析构函数, 只是他们不会做任何事情,所以对我们来说不会关注到。构造函数特点:

  • 1)构造函数必须与类名同名;
  • 2)可以重载;
  • 3)没有返回类型,即使是 void 也不行。

        析构函数与构造函数相反, 在对象结束其生命周期时系统自动执行析构函数。析构函数的特点:

  • 1)析构函数的格式为~类名();
  • 2)调用时释放内存(资源);
  • 3)~类名()不能加参数;
  • 4)没有返回值,即使是 void 也不行。

下面举例说明这两个函数的使用。

在Ubuntu下新建一个04_structor目录,在其中新建一个04_structor.cpp文件,代码如下:

#include <iostream>
#include <string>
using namespace std;

class People
{
public:
	People()
	{
		cout<<"构造函数执行!"<<endl;
	};
	~People()
	{
		cout<<"析构函数执行!"<<endl;
	}
};

int main()
{
	People people;
	cout<<"构造与析构函数示例"<<endl;
    	return 0;
}

        仍然是定义一个People类,然后自己写一个构造函数和析构函数,在函数中及main函数中打印信息。

我们运行程序,查看下打印的顺序:

        可见执行顺序是:构造函数-》主函数-》析构函数,实例化对象时调用构造函数,然后main函数打印输出,最后对象生命周期结束时执行析构函数。

1.3 this指针

        每个对象都拥有一个 this 指针, this 指针记录对象的内存地址,在 C++中, this 指针是指向类自身数据的指针, 简单的来说就是指向当前类的当前实例对象。类的 this 指针有以下特点:

  • 1)this 只能在成员函数中使用, 全局函数、静态函数都不能使用 this。 实际上,成员函数默认第一个参数为 T * const this。 如一个类里面的成员函数 int func(int p), func 的原型在编译器看来应该是 int func(T * const this,int p);
  • 2)this 在成员函数的开始前构造,在成员函数的结束后清除;
  • 3)this 指针会因编译器不同而有不同的放置位置。可能是栈,也可能是寄存器,甚至全局变量。

下面举例说明this的用法。

在Ubuntu下新建一个05_this_pointer目录,在其中新建一个05_this_pointer.cpp文件,代码如下:

#include <iostream>
#include <string>
using namespace std;

class People
{
public:
	string name;
	void func(); 
};

int main()
{
	People people;
	people.func();
    	return 0;
}

void People::func()
{
	this->name = "小芳";
	cout << "她的名字叫:" << this->name << endl;
}

在类的成员函数中使用了this指针,指向类中的name成员,赋值后并将其打印了出来。

编译运行程序:

2 继承

        有了上面的类和对象基础,才好理解下面要讲的继承。继承允许我们依据一个类来定义另一个类,这使得创建和维护一个应用程序变得更容易,也可达到重用代码功能和提高执行效率的效果。

        当创建一个类时,不用重新编写新的数据成员和成员函数,只需指定新建的类(派生类)继承了一个已有的类(基类)的成员即可,在 Qt 里大量的使用这种特性, 当 Qt 里的类不满足自己的要求时,我们可以重写这个类,就是通过继承需要重写的类,来实现自己的类的功能。

        一个类可以派生自多个类,这意味着,它可以从多个基类继承数据和函数。定义一个派生类,我们使用一个类派生列表来指定基类。

        类派生列表以一个或多个基类命名,形式如下:

class derived-class: access-specifier base-class

access-specifier:访问修饰符,与类的访问修饰限定符一样,可以使用public、 protected 或 private,若未使用,默认为private;

base-class:已经定义的某个类的名称;

下面对比下3种访问修饰符:

  • 1)公有继承(public):当一个类派生继承公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问,但是可以通过调用基类的公有和保护成员来访问。
  • 2)保护继承(protected): 当一个类派生继承保护基类时,基类的公有和保护成员将成为派生类的保护成员。
  • 3)私有继承(private):当一个类派生继承私有基类时,基类的公有和保护成员将成为派生类的私有成员。

下面举个例子说明继承的使用。

        接着1.1节的程序,有一个People类,其中已经定义了name、age、speak()方法,若不想重写这个People类,现在新建一个Animal类,让People类继承Animal类,若是共用继承,则People类实例对象中就可以使用Animal类中成员了。

        在Ubuntu下新建一个06_inherit目录,在其中新建一个06_inherit.cpp文件,代码如下:

#include <iostream>
#include <string>
using namespace std;

//抽象出两个属性,各种动物都有的
class Animal
{
public:
	string sex;
	int weight;
};

//People类去继承Animal类
class People : public Animal
{
public:
	string name;
	int age;
	void speak(){
		cout << "my name is " << name << ", age is " << age << endl;
	}	
};

int main()
{
	//从栈中实例化对象
	People people;
	people.name = "小芳";
	people.age = 18;
	people.sex = "女";
	people.weight = 90;
	cout << "我的名字叫 " << people.name << ",年龄 " << people.age << ",性别 "  << people.sex << ",体重 " << people.weight << "斤" << endl;
	
	return 0;
}

编译程序运行:

3 总结

        本次博文首先是总结了C++中类和对象的基本概念,给出了构造函数和析构函数的区别,并总结了this指针的使用方法,有了以上基础后,进一步总结了C++语言的三大特征之一继承的基本概念,并结合实例演示了继承的使用方法。

作于202303072230,已归档

———————————————————————————————————

本文为博主原创文章,未经博主允许不得转载!

若本文对您有帮助,轻抬您发财的小手,关注/评论/点赞/收藏,就是对我最大的支持!

祝君升职加薪,鹏程万里!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/394775.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

14_MySQL视图

1. 常见的数据库对象2. 视图概述2.1 使用视图的好处视图一方面可以帮我们使用表的一部分而不是所有的表&#xff0c;另一方面也可以针对不同的用户制定不同的查询视图。比如&#xff0c;针对一个公司的销售人员&#xff0c;我们只想给他看部分数据&#xff0c;而某些特殊的数据…

前瞻洞察|DoH,隐蔽隧道又添利器,强盾在何方?

DoH这个词对于很多安全从业人员并不是个新词&#xff0c;但对其前世今生能洞若观火的却不多。本期前瞻洞察将从DNS的隐私与安全问题出发&#xff0c;讲述DoH为什么诞生&#xff0c;DoH的出现到底利弊几何&#xff0c;对其弊端如何应对。为了便于读者理解&#xff0c;对于“何为…

轴承轮廓测量解决方案

标题滚动轴承组成、分类 滚动轴承一般由内圈、外圈、滚动体和保持架组成。对于密封轴承&#xff0c;再加上润滑剂和密封圈&#xff08;或防尘盖&#xff09;。这就是轴承的全部组成。 标题滚动轴承分类 滚动轴承代号&#xff1a;轴承型号一般有前置代号&#xff0c;基本代号和…

一、webpack基础

webpack基础 一、webpack是什么 webpack 是一个用于现代 JavaScript 应用程序的静态模块打包工具。 说白了webpack就是一个构建和管理静态资源的工具&#xff0c;在我们使用框架开发时&#xff0c;它会在我们内部的一个或者多个入口根据我们引入的各个模块将他们根据一定的规…

ATool软件使用实验(22)

实验目的 1、学习ATool软件监控主机行为的原理&#xff1b; 2、学习利用ATool软件监控可疑进程的行为&#xff1b; 3、学习利用ATool软件实现对本机进行文件、注册表管理&#xff1b; 4、学习利用ATool软件实现对本机进行内核模块信息和HOOK信息查看。 预备知识 ATool是针…

axios请求响应结果的结构,axios的请求对象

axios请求响应结果的结构 config&#xff1a;配置对象&#xff0c;包括很多内容&#xff0c;请求类型&#xff0c;请求url&#xff0c;请求体等等 data:响应体&#xff0c;服务器返回结果&#xff0c;并且将结果进行json解析&#xff0c;转为对象 headers:响应的头信息 requ…

Telink之标准SDK的介绍_1

前提&#xff1a;常见的项目架构&#xff1a;应用层----》驱动层----》硬件层 1、软件组织架构 顶层⽂件夹( 8 个)&#xff1a; algorithm&#xff0c;application&#xff0c;boot&#xff0c;common&#xff0c;drivers&#xff0c;proj_lib&#xff0c;stack&#xff0c;v…

YOLOv5害虫识别项目代码打包完整上传Gitee仓库(已开源)以及git上传速率限制踩坑记录

YOLOv5害虫识别项目代码打包完整上传Gitee仓库&#xff08;已开源&#xff09;以及git上传速率限制踩坑记录 ps: ​ 最近很多小伙伴需要这个害虫识别项目的源码&#xff0c;由于文件过大&#xff0c;所以将代码完整上传至gitee&#xff0c;所有文件、教程、论文、以及代码模型…

Python之metaclass和dataclass

metaclass:MetaClass元类&#xff0c;本质也是一个类&#xff0c;但和普通类的用法不同&#xff0c;它可以对类内部的定义&#xff08;包括类属性和类方法&#xff09;进行动态的修改。可以这么说&#xff0c;使用元类的主要目的就是为了实现在创建类时&#xff0c;能够动态地改…

ProcessExplorer工具使用(24)

实验目的 1、了解Process Explorer的使用方法预备知识 Process Explorer&#xff08;可执行文件名为procexp.exe&#xff09;是一款由Sysinternals开发的Windows系统和应用程序监视工具&#xff0c;目前Sysinternals已经被微软收购&#xff0c;此款不仅结合了文件监视和注册表监…

日报周报月报工作总结生成器【智能文案生成器】

日报周报月报工作总结生成器【智能文案生成器】 天天写日报&#xff0c;我真的快奔溃了&#xff01; 摸了一天鱼&#xff0c;下班还要写日报&#xff1b; 划了一周的水&#xff0c;周末还要写周报&#xff1b; 啊啊啊啊… 在职场上&#xff0c;尤其是互联网公司里&#xff0c…

Python的数据分析相关的框架

Python特别强大&#xff0c;也是一款可以实现可数据分析语言&#xff0c;它有很多开源的库和工具&#xff0c;可以帮助数据科学家处理和分析数据。 以下是一些常用的Python库和工具&#xff1a; NumPy&#xff1a;NumPy是一个Python库&#xff0c;用于处理大型多维数组和矩阵&…

小程序技术如何提升企业的移动研发效率?

随着移动互联网的普及&#xff0c;移动应用程序已成为企业营销和服务的重要途径。随着技术的不断发展和革新&#xff0c;移动应用程序的开发方式也在不断地演变。 一些技术趋势 1、跨平台开发 跨平台开发已成为移动应用程序开发的趋势。根据 Statista 的报告&#xff0c;截至…

洗地机哪家强?洗地机排行榜

随着清洁行业电器的开展&#xff0c;越来越多的新颖工具和电器开端进入消费者的生活之中。众所周知&#xff0c;面对美不胜收的清洁电器产品&#xff0c;选购也是一大头疼事&#xff0c;应该怎样选购洗地机等清洁电器呢&#xff0c;实在的用户体验和清洁效率莫过于消费者最看重…

如何给电脑重装系统

如何给电脑重装系统 UltraISO(软碟通)、Win10镜像下载UltraISO(软碟通)安装启动盘的制作重装系统 UltraISO(软碟通)、镜像下载&#xff1a; UltraISO(软碟通)安装包下载&#xff1a; 英文版下载链接&#xff1a;http://coderyyn.cn/software/uiso9_pe.exe中文版下载链接&am…

35 openEuler搭建repo(yum)服务器-创建、更新本地repo源

文章目录35 openEuler搭建repo&#xff08;yum&#xff09;服务器-创建、更新本地repo源35.1 获取ISO发布包35.2 挂载ISO创建repo源35.3 创建本地repo源35.4 更新repo源35 openEuler搭建repo&#xff08;yum&#xff09;服务器-创建、更新本地repo源 使用mount挂载&#xff0c…

openpnp - 为贴片工程中的PCB上的mark点元件创建openpnp可识别的定位封装

文章目录openpnp - 为贴片工程中的PCB上的mark点元件创建openpnp可识别的定位封装概述做自己PCB视觉识别用的Mark点封装ENDopenpnp - 为贴片工程中的PCB上的mark点元件创建openpnp可识别的定位封装 概述 建立openpnp Job, brd之后, 载入坐标文件, 精确定位3个mark点, 精确定位…

C++基础了解-03-C++变量类型

C变量类型 一、变量类型 变量其实只不过是程序可操作的存储区的名称。C 中每个变量都有指定的类型&#xff0c;类型决定了变量存储的大小和布局&#xff0c;该范围内的值都可以存储在内存中&#xff0c;运算符可应用于变量上。 变量的名称可以由字母、数字和下划线字符组成。…

C++ Butterworth N阶滤波器设计

介绍一个 Butterworth Nth 滤波器设计系数的函数&#xff0c;像 Matlab 函数一样的&#xff1a; [bl,al]butter(but_order,Ws); 和 [bh,ah]butter(but_order,2*bandwidth(1)/fs,high);rtfilter 在 Ububtu 中&#xff0c;容易找到&#xff1a; $ aptitude search ~dbutterwo…

Linux安装Oracle数据库

Linux安装Oracle数据库 文章目录Linux安装Oracle数据库0. 写在前面1. Oracle 数据库1.1 简介1.2 Oracle 与 MySQL 的SQL 区别2. 前置准备2.1 安装依赖包2.2 配置用户组2.3 上传安装包并解压2.4 修改配置文件 sysctl.conf2.5 修改配置文件 limits.conf2.6 设置环境变量3. Linux最…