C++ 类与对象

news2024/9/22 7:27:51

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

 特点:

  • 抽象(数据抽象,行为抽象)
    数据抽象: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.coloradmin.cn/o/1994234.html

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

相关文章

rocketMQ5.0事务消息实战一

事务消息逻辑 首先我们来docker 部署rocketMQ与rocketMQDashBoard docker ps查看rocketMQ 容器名称 docker ps 进入容器内部 docker exec -it rmqnamesrv /bin/bash 创建事务消息 sh mqadmin updateTopic -c DefaultCluster -t TRANSACTIONTopic -n 127.0.0.1:9876 -a mes…

8.8 day bug

bug1 好家伙&#xff0c;最后一个t没看到&#xff0c;愣是学了一个小时原理和用法&#xff0c;都找不出问题在哪

基于Java中的SSM框架实现远程同步课堂系统项目【项目源码+论文说明】计算机毕业设计

基于Java中的SSM框架实现远程同步课堂系统演示 远程同步课堂系统设计与实现 摘要&#xff1a;在这样一个网络数据大爆炸的时代&#xff0c;人们获取知识、获取信息的通道非常的多元化&#xff0c;通过网络来实现数据信息的获取成为了现在非常常见的一种方式&#xff0c;而通过…

一款多功能漏洞利用管理与搜索工具(非常详细)零基础入门到精通,收藏这一篇就够了

sicat 介绍 SiCat是一款多功能漏洞利用管理与搜索工具&#xff0c;旨在帮助广大研究人员有效地识别和收集来自开源和本地存储库的漏洞信息。 SiCat 的主要优势在于它能够遍历在线和本地资源来收集有关相关漏洞的信息。该工具可帮助网络安全专业人员和研究人员了解潜在的安全风…

我主编的电子技术实验手册(13)——电磁元件之继电器

本专栏是笔者主编教材&#xff08;图0所示&#xff09;的电子版&#xff0c;依托简易的元器件和仪表安排了30多个实验&#xff0c;主要面向经费不太充足的中高职院校。每个实验都安排了必不可少的【预习知识】&#xff0c;精心设计的【实验步骤】&#xff0c;全面丰富的【思考习…

TCP 通信全流程分析:从连接建立到数据传输的深度探索

目录 一、TCP报头 二、三次握手 三、数据传输 四、四次挥手 本文通过一次TCP通信过程的分析来学习TCP协议 一、TCP报头 如图是一份TCP报文的报头&#xff0c;标准报头是20个字节&#xff0c;还可带有选项报头&#xff0c;也就是TCP报头的最小长度是20字节。以下是对报头的各…

一位入门者关于 JavaScript 单线程的一些思考

人们一提起 JavaScript 就会想起单线程&#xff0c;那么为什么会这样呢&#xff1f;这经得住推敲吗&#xff1f;不同的执行环境又有什么差异呢&#xff1f; 带着这些问题&#xff0c;我通过自问自答的方式&#xff0c;整理了一份关于 Javascript 单线程的知识汇总 整体的思考…

AI学习记录 - gpt如何进行token化,理论知识,以GPT2为举例

AI学习记录已经发了十几篇&#xff0c;大佬们可以看看&#xff0c;如果有帮助动动小手点赞 token入门版&#xff0c;有空会更新具体代码操作&#xff0c;能学到一点东西的话&#xff0c;大佬们点个赞&#xff01;&#xff01;&#xff01; GPT4当中&#xff0c;我们提问问题是…

Webpack构建工具

1 概述 Webpack 是一个现代 JavaScript 应用程序的静态模块打包器&#xff08;module bundler&#xff09;。 它的主要作用是将多个松散的模块&#xff0c;包括 JavaScript、CSS、图片、字体等资源&#xff0c;按照指定的规则和依赖关系打包成一个或多个优化后的静态资源文件…

基于RHEL7系统搭建PXE技术体系

目录 一、kickstart自动化安装脚本制作 1、实验前提 2、安装图形界面并启动&#xff0c;关闭DHCP服务 3、安装图形化生成kickstart自动安装脚本的工具并启动 二、搭建DHCP服务并测试脚本 1、安装dhcp 2、生成配置文件 3、编辑配置文件 三、搭建pxe网络安装环境实现服务…

centos安装maven

1.下载maven 去官网选择自己需要的版本 Maven – Download Apache Maven 复制链接 2.使用wget下载 先切换到opt文件夹 再将复制的链接使用wget下载 因为wget下载速度很慢&#xff0c;所以这里使用https://mirrors.tuna.tsinghua.edu.cn镜像 cd /opt wget https://mirrors.tu…

交易困境如何克服,可以先浏览Anzo Capital 昂首资本官网

是不是经常有这样的交易员&#xff0c;常因感到“我知道得不够多”而在交易中做出不合逻辑的行为。在这种心态下&#xff0c;交易员总想寻找更优秀的交易者、更佳的买卖时机以及更有效的策略。事实上&#xff0c;这类追求往往陷入过多无用信息的泥潭&#xff0c;让人难以甄别哪…

【系统架构设计师】二十五、大数据架构设计理论与实践③

目录 六、大数据架构设计案例分析 6.1 Lambda架构在某网奥运中的大数据应用 6.2 Lambda架构在某网广告平台的应用与演进 6.2.1 第一版架构 6.2.1 第二版架构 6.2.3 第三版架构 6.3 某证券公司大数据系统 6.4 某电商智能决策大数据系统 六、大数据架构设计案例分析 6.…

centos上传工具

yum install lrzsz 安装完成之后 作用是 输入 rz 可以本地上传文件

【生成式人工智能-八-大型语言模型的能力评估】

语言模型的能力评估 评估难度来自哪里输出没办法确定给出选择题本身就没标准答案 评估方法人力用语言模型来评估语言模型语言模型的偏爱 评估语言模型的数据集评估模型的不同能力阅读长文的能力心智测验道德性测试安全性测试 通常情况下我们想到的语言模型能力评估&#xff0c;…

图神经网络实战(18)——消息传播神经网络

图神经网络实战&#xff08;18&#xff09;——消息传播神经网络 0. 前言1. 消息传播神经网络2. 实现 MPNN 框架小结系列链接 0. 前言 我们已经学习了多种图神经网络 (Graph Neural Networks, GNN) 变体&#xff0c;包括图卷积网络 (Graph Convolutional Network, GCN)、图注意…

在macOS平台上通过Jenkins远程打包报错,提示errSecInternalComponent

问题&#xff1a;在macOS平台上通过Jenkins远程打包报错&#xff0c;提示errSecInternalComponent 原因 出现这个问题的主要原因&#xff1a;Jenkins以ssh方式到slave机上&#xff0c;默认是没有账户的&#xff0c;但是访问钥匙串要求必须有用户身份 通过Xcode打包的过程中&am…

Ps:通过 RGB 值计算 HSB 值

在 Photoshop 中&#xff0c;HSB&#xff08;色相、饱和度和明度&#xff09;仅作为表达颜色的一种方式而存在&#xff0c;并不是一种颜色模式。 色相/饱和度命令就是基于色彩三要素进行调色的常用命令。 还有一个与 HSB 相关的滤镜&#xff1a;HSB/HSL 滤镜&#xff0c;用于实…

无人机培训机构推广运营理论技术

一、市场定位与品牌建设 在无人机培训行业的激烈竞争中&#xff0c;精准的市场定位是成功的第一步。首先&#xff0c;需明确目标学员群体&#xff0c;如航拍爱好者、农业植保服务者、应急救援人员或专业无人机操作员等。基于目标群体的需求&#xff0c;构建差异化的品牌形象。…

一个升级的多租户权限管理系统,组件化,模块化,轻耦合,高扩展企业级的应用框架,功能强大(附源码)

前言 在现代软件开发中&#xff0c;多租户权限管理系统是企业级应用中的一个关键组件。然而&#xff0c;现有的一些框架&#xff0c;如RuoYi&#xff0c;虽然提供了一些基本的功能&#xff0c;但在面对更复杂的企业级需求时&#xff0c;如原生的MyBatis使用、复杂的分页处理&a…