【C++】类和对象(四千字解析超完整附实例!!!不看会后悔!!!)

        新学期开始了,c++课程逐渐深入,今天来了解一下c++的类和对象中的封装与数据的初始化和清理!

PS.本博客参考b站up黑马程序员的相关课程,老师讲得非常非常好! 

 封装

封装是C++面向对象三大特性之一

1.封装的意义一:

  • 将属性和行为作为一个整体,表现生活中的事物
  • 将属性和行为加以权限控制

语法: 

class 类名{访问权限:    属性/行为}


封装应用一:


在设计类的时候,属性和行为写在一起,表现事物
示例1:没计一个圆类,求圆的周长

#include<iostream>
using namespace std;
const double PI=3.14;//class代表设计一个类 
class circle
{//访问权限 public://公共权限//属性(变量) //半径int m_r; //行为 //获取圆的周长double calculateZC() {return 2*PI*m_r;}
};int main()
{//通过圆类创建具体的圆(对象)//实例化(通过一个类创建一个对象) circle c1;//给圆对象的属性进行具体赋值c1.m_r=10;cout<<"圆的周长为:"<<c1.calculateZC()<<endl;return 0;
}

封装应用二:

创建一个学生类,属性有姓名和学号,可以给姓名和学号赋值并显示。

#include<iostream>
#include<string>
using namespace std;class student
{
public:
string m_Name;
int m_Id;
//行为 :显示姓名和学号
void showstudent()
{cout<<"姓名:"<<m_Name<<"学号:"<<m_Id;} 
void setname(string name)
{m_Name=name;}	
void setId(int Id);
{Id=m_Id;
}
};int main()
{student s1;//s1.m_Name="zhang";s1.setname("zhang"); //s1.m_Id=1;s1.setId(1)s1.showstudent();return 0;
}

专业术语补充:

类中的属性和行为,我们统一称为成员 
//属性:成员属性,成员变量
//行为:成员函数,成员方法 

2.封装意义二: 

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

访问权限分三种:

  1. public          公共权限           类内外都可以访问
  2. protected     保护权限           类内可以访问,类外不可以访问
  3. private          私有权限           类内可以访问,类外不可以访问

23的区别体现在继承

父的保护权限子也可以访问,父的私有权限子不可以访问

如图,类外只有public能访问到:

而类内是都可以访问的:

3.struct和class的区别 

 struct 默认权限为公共
class      默认权限为私有

4.成员属性设置为私有

优点1:自己控制读写权限

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

企业开发中常用

下面的代码展示了如何设置不同的读写权限

#include<iostream>
#include<string>
using namespace std;class Person
{
public:
void setName(string name)
{m_Name=name;
}string getName()
{return m_Name;
}void setIdol(string idol)
{m_idol=idol;
}private:string m_Name;//姓名 可读可写int m_age;//年龄 只读string m_idol;//偶像 只写 
};int main()
{Person p;p.setName("张三");//获取name cout<<"姓名:"<<p.getName()<<endl; return 0;
}

 对象的初始化和清理

生活中我们买的电子产品都基本会有出厂设置,在某一天我们不用时候也会删除一些自己信息数据保证安全
C++中的面向对象来源于生活,每个对象也都会有初始设置以及对象销毁前的清理数据的设置。
数调用时机

1.构造函数和析构函数

对象的初始化和清理也是两个非常重要的安全问题
 一个对象或者变量没有初始状态,对其使用后果是未知
同样的使用完一个对象或变量,没有及时清理,也会造成一定的安全问题

c++利用了构造函数和析构函数解决上述问题,这两个函数将会被编译器自动调用,完成对象初始化和清理工作。对象的初始化和清理工作是编译器强制要我们做的事情,因此如果我们不提供构造和析构,编译器会提供编译器提供的构造函数和析构函数是空实现。 

  • 构造函数;主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无须手动调用。
  • 析构函数:主要作用在于对象销毁前系统自动调用,执行一些清理工作。

构造函数语法 

类名( ){   }

1.构造函数,没有返回值也不写void
2.函数名称与类名相同
3.构造函数可以有参数,因此可以发生重载
4.程序在调用对象时候会白动调用构造,无须手动调用,而且只会调用1次

析构函数语法 

~类名() {    }

1.析构函数,没有返回值也不写void
2.函数名称与类名相同,在名称前加上符号~
3.析构函数不可以没有参数,因此不可以发生重载

4.程序在对象销毁前会自动调用析构,无需手动调用,而且只会调用一次

#include<iostream>
using namespace std;class Person
{public://1.构造函数初始化Person(){cout<<"构造函数Person的调用"<<endl; }~Person(){cout<<"析构函数~Person的调用"<<endl; }};void test01()
{Person p;
}
int main()
{test01();return 0;} 

构造函数和析构函数自动调用

 构造函数的分类和调用

两种分类方式:

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

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

三种调用方式 

括号法

显示法

隐式转换法

 括号法

#include<iostream>
using namespace std;
//构造函数的分类及调用 
class Person
{public://1.构造函数初始化//无参构造:int age; Person(){cout<<"Person的无参构造函数的调用"<<endl; }//有参构造:Person(int a){age=a;cout<<"Person的有参构造函数的调用"<<endl;}//拷贝构造函数Person(const Person &p)//本身不能修改 ,要用& {age=p.age;cout<<"Person的拷贝构造函数的调用"<<endl;} ~Person(){cout<<"析构函数~Person的调用"<<endl; }};
//调用 
void test01()
{//括号法Person p1;//默认构造函数的调用Person p2(10);//有参构造函数Person p3(p2);//拷贝构造函数cout<<"p2的年龄:"<<p2.age<<endl;cout<<"p3的年龄:"<<p3.age<<endl;}int main()
{test01();return 0;} 

 注意事项:调用默认构造函数时,不要加()
 写括号后不创建对象,因为这行代码,编译器会认为是一个函数的声明
 如Person p1();   就是不正确的

显示法 

#include<iostream>
using namespace std;
//构造函数的分类及调用 
class Person
{public://1.构造函数初始化//无参构造:int age; Person(){cout<<"Person的无参构造函数的调用"<<endl; }//有参构造:Person(int a){age=a;cout<<"Person的有参构造函数的调用"<<endl;}//拷贝构造函数Person(const Person &p)//本身不能修改 ,要用& {age=p.age;cout<<"Person的拷贝构造函数的调用"<<endl;} ~Person(){cout<<"析构函数~Person的调用"<<endl; }};
//调用 
void test01()
{//显示法 Person p1;Person p2=Person(10);//有参构造 Person p3=Person(p2);//拷贝构造 //注意事项2:不要利用拷贝构造函数来初始化匿名对象 //Person(10);//匿名对象:当前行执行结束后,系统立即回收}int main()
{test01();return 0;} 

 隐式转换法

#include<iostream>
using namespace std;
//构造函数的分类及调用 
class Person
{public://1.构造函数初始化//无参构造:int age; Person(){cout<<"Person的无参构造函数的调用"<<endl; }//有参构造:Person(int a){age=a;cout<<"Person的有参构造函数的调用"<<endl;}//拷贝构造函数Person(const Person &p)//本身不能修改 ,要用& {age=p.age;cout<<"Person的拷贝构造函数的调用"<<endl;} ~Person(){cout<<"析构函数~Person的调用"<<endl; }};
//调用 
void test01()
{//显示法 Person p1;Person p2=Person(10);//有参构造 Person p3=Person(p2);//拷贝构造 //注意事项2:不要利用拷贝构造函数来初始化匿名对象 //Person(10);//匿名对象:当前行执行结束后,系统立即回收//隐式转换法Person p4=10; //Person p4=Person(10);//有参构造 }int main()
{test01();return 0;} 

 注意事项2:不要利用拷贝构造函数来初始化匿名对象 ,编译器会以为是对象声明

拷贝构造函数使用时机

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

1.使用一个已经制建完毕的对象来初始化一个新对象

2.值传递的方式给函数参数传值
3.以值方式返回局部对象

构造函数调用规则

默认情况下,C++编译器至少给一个类添加3个函数
1.默认构造函数(无参,函数体为空)
2.默认析构函数(无参,函数体为空)
3.默认拷贝构造函数,对属性进行值拷贝
 

构造函数调用规则如下:

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

国家中英文名称、国家代码(地区代码)、国家域名、经纬度

因为要做世界地图对世界国家的标点&#xff0c;搜索使用到了世界各个国家的地理位置信息&#xff0c;此处做备份与学习。资源地址&#xff08;免费&#xff09; export default {"阿尔巴尼亚": {"m_longitude": "19.809","m_latitude&quo…

聚类分析|基于层次的聚类方法及其Python实现

聚类分析|基于层次的聚类方法及其Python实现 0. 基于层次的聚类方法1. 簇间距离度量方法1.1 最小距离1.2 最大距离1.3 平均距离1.4 中心法1.5 离差平方和 2. 基于层次的聚类算法2.1 凝聚&#xff08;Agglomerative&#xff09;2.3 分裂&#xff08;Divisive&#xff09; 3. 基于…

JavaScript 学习日记(1)---初识JavaScript

初识JavaScript 文章目录 初识JavaScript一、JavaScript 是什么?二、java 和JavaScript 的关系三、JavaScript 的组成四、JS的基本输入输出 ---> 单行注释五、js变量基本概念六、js基本数据类型七、js转义字符八、js类型转换九、运算符 END! 一、JavaScript 是什么? 我们…

沪漂8年回郑州三年如何走上创业之路

大家好&#xff0c;我是大牛&#xff0c;目前人在郑州。 现在标签是&#xff1a; 创业者&#x1f697;&#x1f438; (注册有自己的公司&#xff0c;主要是为了自己的产品和接外包项目)独立开发者&#x1f468;&#x1f3fb;&#x1f4bb; (有自己的小项目)数字游民&…

干货分享之反射笔记

入门级笔记-反射 一、利用反射破泛型集合二、Student类三、获取构造器的演示和使用1.getConstructors只能获取当前运行时类的被public修饰的构造器2.getDeclaredConstructors:获取运行时类的全部修饰符的构造器3.获取指定的构造器3.1得到空构造器3.2得到两个参数的有参构造器&a…

Quartus II仿真出现错误

ModelSim executable not found in D:/intelFPGA/18.0/quartus/bin64/modelsim_ase/win32aloem/ Error. 找不到modelsim地址&#xff0c;原来是我下载了.exe,但没有双击启动安装ase文件夹呀&#xff01;&#xff01;&#xff01;&#xff01;晕&#xff0c;服了我自己

常见测试技术都有哪些?

测试技术是用于评估系统或组件的方法&#xff0c;目的是发现它是否满足给定的要求。系统测试有助于识别缺口、错误&#xff0c;或与实际需求不同的任何类型的缺失需求。测试技术是测试团队根据给定的需求评估已开发软件所使用的最佳实践。这些技术可以确保产品或软件的整体质量…

前端面试拼图-数据结构与算法(二)

摘要&#xff1a;最近&#xff0c;看了下慕课2周刷完n道面试题&#xff0c;记录下... 1. 求一个二叉搜索树的第k小值 二叉树(Binary Tree) 是一棵树 每个节点最多两个子节点 树节点的数据结构{value, left?, right?} 二叉树的遍历 前序遍历&#xff1a;root→left→right 中…

视觉轮速滤波融合1讲:理论推导

视觉轮速滤波融合理论推导 文章目录 视觉轮速滤波融合理论推导1 坐标系2 轮速计2.1 运动学模型2.2 外参 3 状态和协方差矩阵3.1 状态3.2 协方差矩阵 4 Wheel Propagation4.1 连续运动学4.2 离散积分4.2.1 状态均值递推4.2.2 协方差递推 5 Visual update5.1 视觉残差与雅可比5.2…

【C语言】【Leetcode】70. 爬楼梯

文章目录 题目思路&#xff1a;简单递归 > 动态规划 题目 链接: link 思路&#xff1a;简单递归 > 动态规划 这题类似于斐波那契数列的算法&#xff0c;结果其实就是到达前一步和到达前两步的方法之和&#xff0c;一直递归到n1和n2时就行了&#xff0c;但是这种算法有个…

今天聊聊Docker

在数字化时代&#xff0c;软件应用的开发和部署变得越来越复杂。环境配置、依赖管理、版本控制等问题给开发者带来了不小的挑战。而Docker作为一种容器化技术&#xff0c;正以其独特的优势成为解决这些问题的利器。本文将介绍Docker的基本概念、优势以及应用场景&#xff0c;帮…

C++基础之继承续(十六)

一.基类与派生类之间的转换 可以把派生类赋值给基类可以把基类引用绑定派生类对象可以把基类指针指向派生类对象 #include <iostream>using std::cin; using std::cout; using std::endl;//基类与派生类相互转化 class Base { private:int _x; public:Base(int x0):_x(…

Amuse .NET application for stable diffusion

Amuse github地址&#xff1a;https://github.com/tianleiwu/Amuse .NET application for stable diffusion, Leveraging OnnxStack, Amuse seamlessly integrates many StableDiffusion capabilities all within the .NET eco-system Welcome to Amuse! Amuse is a profes…

CAPL - 如何实现弹窗提示和弹窗操作(续)

目录 函数介绍 openPanel closePanel 代码示例 1、简单的打开关闭panel面板

自动驾驶-如何进行多传感器的融合

自动驾驶-如何进行多传感器的融合 附赠自动驾驶学习资料和量产经验&#xff1a;链接 引言 自动驾驶中主要使用的感知传感器是摄像头和激光雷达&#xff0c;这两种模态的数据都可以进行目标检测和语义分割并用于自动驾驶中&#xff0c;但是如果只使用单一的传感器进行上述工作…

文献速递:文献速递:基于SAM的医学图像分割--SAM-Med3D

Title 题目 SAM-Med3D 01 文献速递介绍 医学图像分析已成为现代医疗保健不可或缺的基石&#xff0c;辅助诊断、治疗计划和进一步的医学研究]。在这一领域中最重要的挑战之一是精确分割体积医学图像。尽管众多方法在一系列目标上展现了值得称赞的有效性&#xff0c;但现有的…

C/C++ 语言中的 ​if...else if...else 语句

C/C 语言中的 ​if...else if...else 语句 1. if statement2. if...else statement3. if...else if...else statementReferences 1. if statement The syntax of the if statement is: if (condition) {// body of if statement }The code inside { } is the body of the if …

javaScript——BFS结合队列求迷宫最短路径

这里推荐先去看下B站这个老师讲的BFS迷宫问题&#xff0c;只用看前五分钟就能懂用BFS队列实现的原理。[POJ] 3984 迷宫问题 BFS_哔哩哔哩_bilibili 问题描述&#xff1a;由m*n的矩阵构成了一个迷宫&#xff0c; 矩阵中为1的元素表示障碍物&#xff0c;不能走&#xff0c;为0表示…

AcWing 830. 单调栈

解题思路 对于将要入栈的元素来说&#xff0c;在对栈进行更新后&#xff08;即弹出了所有比自己大的元素&#xff09;&#xff0c;此时栈顶元素就是数组中左侧第一个比自己小的元素&#xff1b; 对于将要入栈的元素来说&#xff0c;在对栈进行更新后&#xff08;即弹出了所有比…

【干货】无源滤波器设计讲解,工作原理+设计步骤

今天给大家分享的是&#xff1a;无源模拟滤波器针对很多入门小白不懂滤波器设计&#xff0c;一些老工程师上班很多年有的也不懂得总结知识点&#xff0c;以及想学习不知道怎么系统学习的这一类人群&#xff0c;前方知识点来袭&#xff0c;请君放心食用~ 在信号处理领域&#x…