C++ 类与对象

面向对象程序设计基本特点

 特点:

  • 抽象(数据抽象,行为抽象)
    数据抽象:int hour,int minute.....,车:长,宽,高....
    功能抽象:showTime(),setTime() .....车:刹车,加速....
  • 封装 


    private , public , protect
  • 继承(将已有的代码拉来编写新的类,使其变得更加具体更详细的说明,一般与特殊的关系)
  • 多态


定义:

class 类名称

{

 public :

          外部接口

  protected:

           保护型成员

  private:

            私有成员

 } ;


 访问权限:private , public , protected

对象

类名   对象名 :

Clock myClock ; // 声明了一个时钟类型的myClock

调用时

对象名 . 函数成员名

myClock . showTime () ; // 在类的外部只能访问共有成员,在类的成员函数中,可以访问类的全部成员

类的成员函数

  • 成员函数的实现

    与普通函数不同,类的成员函数名需要用类名来限制 Clock :: showTime()
  • 带默认形参值的成员函数



  • 内联成员函数

    内联函数的声明有两种:隐式声明和显式声明
    隐式声明:   直接将函数放在结构体里

    显式声明:采用关键字inline,在函数的返回值类型前添加inline

🙋‍♂️实例(时钟类): 



构造函数

构造函数的作用:在对象创建时利用特定的值构建对象,将对象初始化为一个特定的状态

 将其封装出去

主函数部分:   

   int main()
   {
        Clock c(0,0,0); // 声明变量并赋值
        c.showTime();
        c.setTime(3,29,20);

    }

 初始化赋值,hour在开空间的同时将h赋值,minute在开空间的同时传参m

🙋‍♂️实例(α+βi):

 #include <iostream>
#define P 3.1415926
#include "circle.h"
using namespace std;class Complex
{
public:Complex(double r = 0,double i =0);void setReal(double r);void setImage(double i);void show(){cout<<real<<"+"<<image<<"i"<<endl;}private:double real;double image;
};
void Complex::setReal(double r)
{real= r;
}
void Complex::setImage(double i)
{image = i;
}
Complex ::Complex(double r, double i):real(r),image(i)
{}
int main()
{Complex c(10,20);c.show();
}

复制构造函数



复制构造函数定义与声明:

class 类名

{

public :

            类名(形参表); //构造函数

            类名(类名 & 对象名);  //复制构造函数

             ......

};

类名 ::类名(类名 & 对象名);  //复制构造函数的实现

{

             函数体

}

 


复制结构函数的实现:

Point :: Point(Point &p)

{

       x = p.x;

       y = p.y;

       cout <<  " Calling the copy constructor " << endl;

}

示例:

using namespace std;
class Point
{
public:Point (int x1 = 0,int y1 = 0)//构造函数{x = x1;y = y1;}Point (Point &p);//复制构造函数int getX()//获取private中的数值{return x;}int getY(){return y;}
private:int x,y;
};
//成员函数的实现
Point ::Point(Point &p)
{x = p.x;y = p.y;cout<<"Calling the constructor"<<endl;
}
//形参为point类对象的函数
void fun1(Point p)
{cout <<p.getX()<<endl;
}
//返回值为point类对象的函数
Point fun2()
{Point a(1,2);return a;
}
//主函数
int main()
{Point a(4,5);//第一个对象Point b =a; //情况1 用a初始化b,第一次调用复制构造函数cout<<b.getX()<<endl;fun1(b);    //情况2 对象b作为fun1的实参 第二次调用复制构造函数b = fun2(); //情况3 函数的返回值是类对象,函数返回时,调用复制构造函数cout<<b.getX()<<endl;return 0;}


 ​​​​​​

析构函数

析构函数的特点:

#include <iostream>  class MyClass {  
public:  MyClass() {  std::cout << "Constructor called\n";  }  ~MyClass() {  std::cout << "Destructor called\n";  // 清理工作,比如释放资源  }  
};  int main() {  MyClass obj; // 调用构造函数  // 当obj的生命周期结束时(main函数返回时),调用析构函数  return 0;  
}
  • ~  没有返回类型,也不接受任何参数
  • 当一个对象的生命周期结束时,析构函数会自动被调用。这包括局部对象在离开其作用域时、动态分配的对象被delete删除时、全局对象在程序结束时、以及容器中的对象被销毁时等情况。
  • 如果没有定义析构函数编译器会自动默认生成,但如果定义了析构函数编辑器便不会生产
  • 析构函数不能被重载,每个类只能有一个析构函数
  • 析构函数通常被声明为public,因为即使你创建了类的对象,也需要外部代码(如delete表达式)来销毁对象并调用析构函数。但是,在特定情况下(如基类的析构函数在派生类中被隐藏时),可能会将析构函数声明为protectedprivate   

🙋‍♂️实例(坐标显示,圆环面积)

#include <iostream>
#define P 3.1415926
#include "circle.h"
using namespace std;
class Point
{
public:Point(int x = 0,int y = 0);Point(const Point &other);void setX(int x);void setY(int y);int getX(){return m_x;}int getY(){return m_y;}void show();~Point(){cout << "~"<< endl;}
private:int m_x,m_y;
};void Point ::show()
{cout << "(" << m_x << "," << m_y << ")" << endl;
}
Point ::Point(int x, int y):m_x(x),m_y(y)
{cout <<" p "<<endl;
}
Point ::Point(const Point &other):m_x(other.m_x),m_y(other.m_y)
{cout << "p1 " << endl;
}int main()
{Point p(10,20);p.show();Point p1(p);p1.show();return 0;
}

求圆环的面积:
 
 

#include <iostream>
#define P 3.1415926  //宏定义using namespace std;class Circle   //声明定义类Circle及其数据和方法
{
public:    //外部接口double area()       // 计算面积{return  radius * radius * P;}void setRaius(double r)  // 获取private的数据{radius = r;}
private:double radius;
};int main()
{Circle c1;Circle c2;c1.setRaius(20);c2.setRaius(10);cout <<c1.area() - c2.area() <<endl;cout << "Hello World!" << endl;return 0;
}

封装:

类的组合



Circle :: Circle (double r) : radius ( r ) { }

radius 开空间的同时将 r 赋值

 🙋‍♂️练习(线段长度):

Line 类包含p1 , p2作为其数据成员,Line类具有计算线段长度的功能


 

#include <iostream>using namespace std;
class Point    //point 类定义
{
public:Point(int x = 0,int y = 0);  //构造函数Point(const Point &other);   void setX(int x);void setY(int y);int getX(){return m_x;}int getY(){return m_y;}void show();~Point(){cout << "~Point"<< endl;}
private:int m_x,m_y;
};void Point ::show()
{cout << "(" << m_x << "," << m_y << ")" << endl;
}
Point ::Point(int x, int y):m_x(x),m_y(y)
{cout <<" p(int,int) "<<endl;
}
//复制构造函数的实现
Point ::Point(const Point &other):m_x(other.m_x),m_y(other.m_y)
{cout << "point &other " << endl;
}//类的组合
class Line //line类的定义
{
public:    //外部接口Line(int x1,int y1,int x2,int y2):m_p1(x1,y1),m_p2(x2,y2){cout << "line(int,int,int,int)" <<endl;}Line(const Point &p1,const Point &p2):m_p1(p1),m_p2(p2){cout<<"point &p"<<endl;}void show(){m_p1.show();cout<<"->";m_p2.show();cout<<endl;}~Line(){cout<<"~Line"<<endl;}
private:   Point m_p1,m_p2; //point类的对象m_p1,m_p2
};
int main()
{Point p1(3,4); Point p2(9,10);  //建立point类对象Line l(p1,p2);   //建立line类的对象l.show();return 0;
}

 UML(类图)

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

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

相关文章

使用Cisco进行模拟配置OSPF路由协议

OSPF路由协议 1.实验目的 1&#xff09;理解OSPF 2&#xff09;掌握OSPF的配置方法 3&#xff09;掌握查看OSPF的相关信息 2.实验流程 开始 → 布置拓扑 → 配置IP地址 → 配置OSPF路由并验证PC路由的连通性 → 查看路由器路由信息 → 查看路由协议配置与统计信息 → 查看O…

【从零开始一步步学习VSOA开发】VSOA命令行工具vcx

VSOA命令行工具vcx vcx 介绍 vcx 是一个使用 VSOA RPC 客户端功能执行器&#xff0c;支持 RPC SET/GET 调用。 [rootsylixos:/root]# [rootsylixos:/root]# vcx -help USAGE: vcx [options] url -h : Show help message. -v : Show vcx version. -z …

[MRCTF2020]PYWebsite-1

打开以后查看源码信息 看到flag.php试着打开 提示看到&#xff0c;需要后端审计代码&#xff0c;而且应该要改ip&#xff0c;改成自己本地&#xff0c;burp抓包看一下 改X-Forwarded-For:127.0.0.1 得到flag flag{74242eb7-844f-4638-8aae-9ec37870d585}

通过LLM大模型将「白雪公主的故事」转为图数据存储

&#x1f4a1; 本次将使用LLM大模型将「白雪公主的故事」转为图数据存储于neo4j数据库中&#xff0c;并展示图数据部分的效果 故事内容 很久很久以前&#xff0c;在一个遥远的王国里&#xff0c;有一位美丽的**王后**生下了一个皮肤像雪一样白皙、嘴唇像血一样鲜红的**女儿**…

网页设计模板范例

随着互联网的发展&#xff0c;网页设计变得越来越重要。一个吸引人的网页设计可以吸引更多的用户&#xff0c;提升用户体验&#xff0c;并且使网站内容更加易于浏览和理解。在这篇文章中&#xff0c;我将为大家介绍一个网页设计模板范例。 1. 选择合适的颜色和字体&#xff1a;…

golang for range time.Ticker 和 time.Timer时间通道使用示例 - 每隔指定时间执行一次,执行指定时长后退出执行

golang中的 ticker和timer时间通道除了可以使用for select case语句来执行外&#xff0c; 还可以使用 for range语句来执行ticker或者timer时间通道。 for range time.Ticker 和 time.Timer时间通道使用示例 下面的示例演示了time.Ticker 和 time.Timer的区别和使用演示。 Ti…

JAVA分布式CAP原则

分布式CAP原则主要是使用SpringCloud框架的时候会涉及到该部分知识点 CAP原则指的是在一个分布式系统中&#xff0c;一致性&#xff0c;可用性&#xff0c;分区容错性 实际的项目开发中&#xff0c;这三者往往是不可兼顾的。 AP&#xff1a;牺牲一致性&#xff0c;保证可用性…

【学习笔记】Matlab和python双语言的学习(动态规划)

文章目录 前言一、动态规划动态规划的基本步骤示例1示例2 三、代码实现----Matlab1.示例12.示例2 四、代码实现----python1.示例12.示例2 总结 前言 通过模型算法&#xff0c;熟练对Matlab和python的应用。 学习视频链接&#xff1a; https://www.bilibili.com/video/BV1EK411…

Linux驱动开发—平台总线模型详解

文章目录 1.平台总线介绍1.1平台总线模型的组成部分1.2平台总线模型的优势 2.使用平台总线模型开发驱动2.1注册platform设备2.2注册platform驱动2.3效果演示 1.平台总线介绍 Linux 平台总线模型&#xff08;Platform Bus Model&#xff09;是一种设备驱动框架&#xff0c;用于…

Debezium报错处理系列之第116篇:Caused by: java.lang.NumberFormatException: null

Debezium报错处理系列之第116篇:Caused by: java.lang.NumberFormatException: null 一、完整报错二、错误原因三、解决方法Debezium从入门到精通系列之:研究Debezium技术遇到的各种错误解决方法汇总: Debezium从入门到精通系列之:百篇系列文章汇总之研究Debezium技术遇到的…

【从零开始一步步学习VSOA开发】VSOA命令行工具vcl

VSOA命令行工具vcl 介绍 vcl 是一个 VSOA 命令监听器&#xff0c;支持订阅来自特定服务器发布的所有数据。 [rootsylixos:/root]# [rootsylixos:/root]# vcl -help USAGE: vcl [options] host [topics] -h : Show help message. -v : Show vcl version. …

平安城市行业无人机解决方案(网格化巡逻场景应用)

场景痛点&#xff1a; 缺少飞手&#xff0c;导致无人机应用频次偏低 无人机需要人工换电池、维护及存储 日常巡逻 | 无人机补盲巡逻 大疆航点飞行功能&#xff0c;重复性任务只飞一遍&#xff0c;后续重复调用 无人机航点规划&#xff0c;一次设置&#xff0c;后续重复调用…

SpringBoot + RabbitMQ + WebSocket + STOMP 协议 + Vue 实现简单的实时在线聊天案例

1. 什么是WebSocket&#xff1f; WebSocket是一种在单个TCP连接上进行全双工通信的协议。它允许客户端和服务器之间的实时、双向数据传输。与传统的HTTP请求/响应模型相比&#xff0c;WebSocket更加高效&#xff0c;因为它在初次握手后&#xff0c;连接保持打开状态&#xff0…

前端(HTML + CSS)小兔鲜儿项目(仿)

前言 这是一个简单的商城网站&#xff0c;代码部分为HTML CSS 和少量JS代码 项目总览 一、头部区域 头部的 购物车 和 手机 用的是 文字图标&#xff0c;所以效果可以和文字一样 购物车右上角用的是绝对定位 logo用的是 h1 标签&#xff0c;用来提高网站搜索排名 二、banne…

Golang | Leetcode Golang题解之第331题验证二叉树的前序序列化

题目&#xff1a; 题解&#xff1a; func isValidSerialization(preorder string) bool {n : len(preorder)slots : 1for i : 0; i < n; {if slots 0 {return false}if preorder[i] , {i} else if preorder[i] # {slots--i} else {// 读一个数字for i < n &&…

各种高端链游 区块链游戏 休闲小游戏DAPP开发

【西游闯关】-高端区块链3D手游 【我朝有马】-高端区块链3D手游 【弹弹岛2】-高端区块链3D手游

FPGA第4篇,中国FPGA芯片市场,发展分析与报告

前言 FPGA&#xff08;Field-Programmable Gate Array&#xff09;&#xff0c;即现场可编程门阵列&#xff0c;是一种可由用户配置的集成电路&#xff0c;具有高度的灵活性和强大的计算能力&#xff0c;被广泛应用于通信、航空航天、汽车电子、消费电子、数据中心、人工智能等…

Java毕业设计-基于SSM框架的舞蹈网站系统项目实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

【mysql 第四篇章】bin log 的作用是啥呢?

一、redo Log 介绍 redo log 是一种偏向物理性质的重做日志&#xff0c;因为他里面记录类似的这样的东西&#xff0c;“对那个数据也中的什么记录&#xff0c;做了个什么修改”。它是 InnoDB 存储引擎特有的东西。 二、bin Log 日志 bin log 叫做归档日志&#xff0c;它里面…

STM32-USART时序与寄存器状态分析

一、时序分析 在UART&#xff08;通用异步收发传输&#xff09;通信中&#xff0c;信号线上的状态分为两种&#xff1a;逻辑1&#xff08;高电平&#xff09;和逻辑0&#xff08;低电平&#xff09;。在空闲状态下&#xff0c;数据线应保持逻辑高电平。UART协议中的各个信号位具…