c++(8.24)拷贝赋值对象,匿名对象,友元,常成员和常对象,mutable关键字,运算符重载

news2025/1/30 16:24:13

作业:

实现关系运算符重载(仅>,<,==):

#include <iostream>

using namespace std;

class Person
{
    int a;
    int b;
   friend bool operator== (const Person &L,const Person&R);
public:
    Person(){}
    Person(int a,int b):a(a),b(b){}
    bool operator> (const Person&R)const
    {
        if(a>R.a&&b>R.b)
        {

            return true;
        }
        else
        {

            return false;
        }
    }
    bool operator< (const Person&R)const
    {
        if(a<R.a&&b<R.b)
        {

            return true;
        }
        else
        {

            return false;
        }
    }
};
bool operator== (const Person &L,const Person&R)
{
    if(L.a==R.a&&L.b==R.b)
    {

        return true;
    }
    else
    {

        return false;
    }
}

int main()
{
    Person p1(10,10),p2(10,10),p3(20,20);
    if((p1>p2)==true)
    {
        cout << "p1大于p2" << endl;
    }
    else
        cout << "p1不大于p2" << endl;
    if((p1==p2)==true)
    {
        cout << "p1等于p2" << endl;
    }
    else
        cout << "p1不等于p2" << endl;
    if((p1<p2)==true)
    {
        cout << "p1小于p2" << endl;
    }
    else
        cout << "p1不小于p2" << endl;
    if((p2>p3)==true)
    {
        cout << "p2大于p3" << endl;
    }
    else
        cout << "p2不大于p3" << endl;
    if((p2==p3)==true)
    {
        cout << "p2等于p3" << endl;
    }
    else
        cout << "p2不等于p3" << endl;
    if((p2<p3)==true)
    {
        cout << "p2小于p3" << endl;
    }
    else
        cout << "p2不小于p3" << endl;
    return 0;
}

拷贝赋值函数实例:

#include <iostream>

using namespace std;
class stu
{
    string name;
    int age;
public:
    void show ()
    {
        cout << name << age << endl;
    }
    stu(string name,int age):name(name),age(age)
    {
        cout << "这是stu的构造函数" << endl;
    }
    stu(stu &other):name(other.name),age(other.age)//构造函数,需要初始化列表
    {
        cout << "这是stu的拷贝构造函数" << endl;
    }
    stu& operator=(const stu& other)//拷贝赋值函数,不需要初始化列表
    {
        if(this != &other)//避免自己被赋值给自己
        {
            name=other.name;
            age=other.age;
        }
            cout <<"这是stu的拷贝赋值函数"  << endl;
            return *this;
    }
    ~stu()
    {
        cout << "这是stu的析构函数" << endl;
    }
};

int main()
{
    stu s1("张三",20);
    stu s2=s1;
    stu s3("",0);
    s3=s2;
    return 0;
}

 

 匿名对象实例:

#include <iostream>

using namespace std;
class stu
{
    string name;
    int age;
public:
    stu(string name,int age):name(name),age(age)
    {
        cout << "这是stu的构造函数" << endl;
    }
    stu(const stu& other):name(other.name),age(other.age)
    {
        cout << "这是stu的拷贝构造函数" << endl;
    }
    stu& operator=(const stu& other)
    {
        name=other.name;
        age=other.age;
        return *this;
    }
    ~stu()
    {
        cout <<"这是stu的析构函数" << endl;
    }
};

int main()
{
    stu s1=stu("张三",20);//用匿名类做赋值操作
    stu s[3]={stu("a",1),stu("b",2),stu("c",3)};//用匿名类做类数组的赋值操作
    return 0;
}

 友元实例:

#include <iostream>

using namespace std;

class Room
{
    friend void good(Room &s);//声明good函数是友元函数,就可以调用本类中的所有成员
    friend class bad;//声明bad类是友元,bad类就可以调用本类中的所有成员
    string badroom;
public:
    string livingroom;
    Room(string badroom,string livingroom):badroom(badroom),livingroom(livingroom)
    {
        cout<< "这是Room的构造函数" << endl;
    }
    Room()//无参构造
    {}
};
void good(Room &s)
{
    cout << s.livingroom << endl;
    cout << s.badroom <<endl;
}
class bad
{
public:
    Room s1;
    void visit()
    {
        cout << s1.badroom << endl;//调用s1中的私有成员
        cout << s1.livingroom <<endl;
    }

};

int main()
{
    Room s("卧室","客厅");
    good(s);
    bad a;
    return 0;
}

常成员和常对象实例:

#include <iostream>

using namespace std;

class Stu
{
    string name;
    mutable int age;//加了mutable,就可以在常成员函数中修改
public:
    Stu()//无参构造函数
    {}
    Stu(string n,int a):name(n),age(a)//有参构造类型
    { }
    void show()const//常成员函数,不做修改
    {
        age=30;//会报错,因为是const类型的成员函数,不能做修改,当age加了mutable,就变成可以在常成员函数中修改
        cout << "名字是:" << name << endl;
        cout << "年龄是:" << age << endl;
    }
    void show()//非常成员函数
    {
        age=25;
        cout << "名字是:" << name << endl;
        cout << "年龄是:" << age << endl;
    }
};

int main()
{
    Stu s1("张三",18);//非常对象
    s1.show();//有常成员函数和非常成员函数,优先调用非常成员函数,只有常成员函数,调用常成员函数
    const Stu s2("里斯",20);//常对象
    s2.show();//调用常成员函数,年龄不会发生改变
    //当只有非常成员函数时,s2无法调用非常成员函数
    return 0;
}

算数运算符重载:

 

#include <iostream>

using namespace std;

class Person
{
    friend const Person operator+(const Person &L,const Person &R);
    friend const Person operator>(const Person &L,const Person &R);
    int a;
    int b;
public:
    Person(){};
    Person(int a,int b):a(a),b(b)
    {}
//    const Person operator+(const Person &R)
//    {
//        Person temp;
//        temp.a=a+R.a;
//        temp.b=b+R.b;
//        return temp;
//    }
    void show()
    {
        cout << "a = " << a << endl;
        cout << "b = " << b << endl;
    }
};
const Person operator+(const Person &L,const Person &R)//全局
{
    Person temp;
    temp.a = L.a + R.a;
    temp.b = L.b + R.b;
    return temp;
}
const Person operator>(const Person &L,const Person &R)
{
    Person temp;
    temp.a = (L.a > R.a) ? L.a : R.a;
    temp.b = (L.b > R.b) ? L.b : R.b;
    return temp;
}
int main()
{
    Person p1(10,10);
    Person p2(10,10);
    Person p3=p1+p2;//假设调用类内的运算符重载,本质:p3=p1.operator+(p2)
    p3.show();
    Person p4=p2+p3;//假设调用类外的运算符重载,本质:p4=operator(p2,p3)
    p4.show();
    Person p5(5,11);
    Person p6;
    p6 = p5 > p1;
    p6.show();
    return 0;
}

 

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

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

相关文章

【PostGreSQL】PostGreSQL到Oracle的数据迁移

项目需要&#xff0c;有个数据需要导入&#xff0c;拿到手一开始以为是mysql&#xff0c;结果是个PostGreSQL的数据&#xff0c;于是装数据库&#xff0c;但这个也不懂呀&#xff0c;而且本系统用的Oracle&#xff0c;于是得解决迁移转换的问题。 总结下来两个思路。 1、Postg…

七、pikachu之不安全的文件下载

文章目录 1、不安全的文件下载简介2、实战 1、不安全的文件下载简介 文件下载功能在很多web系统上都会出现&#xff0c;一般我们当点击下载链接&#xff0c;便会向后台发送一个下载请求&#xff0c;一般这个请求会包含一个需要下载的文件名称&#xff0c;后台在收到请求后&…

【附安装包】CIMCO Edit2022安装教程

软件下载 软件&#xff1a;CIMCO Edit版本&#xff1a;2022语言&#xff1a;简体中文大小&#xff1a;251.79M安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU2.0GHz 内存4G(或更高&#xff09;下载通道①百度网盘丨64位下载链接&#xff1a;https://pan.b…

新功能:部署远程办公支持第三方授权登录

随着业务的发展和信息管理的完善&#xff0c;企业的应用系统也逐渐增多&#xff0c;每个软件系统使用各自的软件数据&#xff0c;独立的用户管理模式&#xff0c;不仅会增加部署成本&#xff0c;对于企业应用平台化管理也是不小的挑战。 对于企业而言&#xff0c;如何实现应用系…

电商平台京东平台获得京东商品描述API接口演示案例

京东商品描述API接口可以获取京东商品描述&#xff1a; 详细介绍商品的特点和功能,让消费者能够了解商品的具体用途和效果。 使用简洁明了的语言,避免使用过于专业的术语和长句子,让消费者能够轻松理解。 重点突出商品的卖点和优势,让消费者能够更加清晰地了解商品的价值 …

SpingMVC拦截器-用户登录权限控制分析

视频链接&#xff1a;08-SpringMVC拦截器-用户登录权限控制代码实现2_哔哩哔哩_bilibili 114 1、做了一个用户跟角色添加的相关操作 1.1 这个后台工程&#xff0c;没有进行相关操作也能够进行登录&#xff1a; 2、现在我做一个用户的权限控制&#xff0c;如果当前我没有进行操…

马原——5.两大总特征(辩证法)

两大总特征是解释了世界是怎样存在的。 三大规律是对两大总特征的进一步细化 对立统一规律解释了世界是怎样联系的&#xff0c;为什么发展 量变质变规律解释了怎样发展 否定之否定规律那里发展 五对基本范畴解释了联系和发展环节上的逻辑 客观性&#xff1a;不以人的意志为转…

vscode | 开发神器vscode必备优秀插件

目录 一、koroFileHeader1.1 使用方法1.2 配置推荐 二、Markdown Preview Enhanced三、filesize四、Project Manager五、Live Server六、Bookmarks七、Image preview八、Chinese (Simplified) (简体中文) Language九、主题相关9.1 vscode-icons9.2 Winter is Coming Theme9.3 O…

Unity 之 Start 与Update 方法的区别

文章目录 当谈论Unity中的 Start和 Update方法时&#xff0c;我们实际上是在讨论MonoBehaviour类中的两个常用方法&#xff0c;用于编写游戏逻辑。这两个方法在不同的时机被调用&#xff0c;因此您可以根据需要选择在哪个方法中编写特定的代码。 Start 方法&#xff1a; Start…

(线特征)opencv+opencv contribute 配置

写一篇博客&#xff0c;记录开始线特征slam的历程。 在配置环境的时候&#xff0c;可以发现大多数都是用到了opencv3.4.16和其contribute版本&#xff0c;这里进行一个相关操作的教学。配置环境是在Ubuntu下面进行的&#xff0c;建议使用Ubuntu18来进行线特征的配置以及代码的…

JVM核心原理解读(一)---执行引擎

Java虚拟机规范制定了Java字节码执行引擎的概念模型,Java执行引擎作用概括起来就是执行编译产生的Java class文件,为用户提供了底层OS的调用,屏蔽了不同平台硬件和OS的差异性,使得编写的代码无差别的在各个平台运行; JVM运行时内存结构 运行时栈帧 局部变量表---方法的局部变…

mysql使用flashback恢复数据

常在河边走&#xff0c;哪有不湿鞋。如果我们经常操作数据库&#xff0c;很有可能就会造成误操作&#xff0c;假如我们不幸误删了数据&#xff0c;有没有办法快速恢复呢&#xff1f; 这里&#xff0c;我们就以用的最多的mysql举例&#xff0c;聊聊如何快速恢复数据。mysql官方貌…

海外网红力量:加速裂变营销,征服新市场

随着全球互联网的飞速发展&#xff0c;海外市场已经成为越来越多企业追逐的商机之地。在这个多元文化的时代&#xff0c;海外网红已经成为推动营销和品牌传播的强大力量。利用海外网红进行裂变营销已经成为许多企业成功进军海外市场的一项重要策略。本文Nox聚星将和大家探讨如何…

element-ui中的el-table合并单元格

描述&#xff1a; 在写项目的时候有时候会经常遇到把行和列合并起来的情况&#xff0c;因为有些数据是重复渲染的&#xff0c;不合并行列会使表格看起来非常的混乱&#xff0c;如下&#xff1a; 而我们想要的数据是下面这种情况&#xff0c;将重复的行进行合并&#xff0c;使表…

13.4 目标检测锚框标注 非极大值抑制

锚框的形状计算公式 假设原图的高为H,宽为W 锚框形状详细公式推导 以每个像素为中心生成不同形状的锚框 # s是缩放比&#xff0c;ratio是宽高比 def multibox_prior(data, sizes, ratios):"""生成以每个像素为中心具有不同形状的锚框"""in_he…

mysql 默认的4个数据库 介绍

mysql 存储MySQL的用户账号和权限信息&#xff0c;一些存储过程、事件的定义信息 一些运行过程中产生的日志信息&#xff0c;一些帮助信息以及时区信息等 information_schema 存储Mysql服务器 维护的所有其它数据库的信息&#xff0c;比如有哪些表、哪些视图、哪些触发器、哪…

C++设计模式(工厂方法模式)

文章目录 前言一、工厂方法模式介绍二、工厂方法模式和简单工厂模式对比三、工厂方法模式适用场景四、工厂方法模式示例代码总结 前言 本篇文章来带大家学习C中的工厂方法模式。 一、工厂方法模式介绍 工厂方法模式是一种创建型设计模式&#xff0c;用于通过工厂方法创建对象…

jdk新特性 02 .接口增强和函数式接口,方法引用

1.JDK8中接口的新增 在JDK8中针对接口有做增强&#xff0c;在JDK8之前 interface 接口名{ 静态常量; 抽象方法; }JDK8之后对接口做了增加&#xff0c;接口中可以有默认方法和静态方法 interface 接口名{ 静态常量; 抽象方法; 默认方法; 静态方法; }2.默认方法 2.1 为什么要增…

OS 内核级线程

用户级线程是两个栈&#xff0c;核心级线程是两套栈&#xff0c;用户栈和内核栈 用户级是并发&#xff08;同时触发、交替执行&#xff09;&#xff0c;这个是并行&#xff08;同时触发可以同时执行&#xff09; 进入内核的唯一方式是中断 根据TCB的切换&#xff0c;实现内核…

【经验贴】新手项目经理如何接手并管好项目?

最近有刷到这样一些求助帖&#xff1a;初入职场两三年的项目经理现在开始独立带项目&#xff0c;由于缺乏经验不知道从何下手&#xff0c;询问如何能快速接手并管好项目呢&#xff1f;这个话题也引起了大家的热议&#xff0c;今天就给大家分享一下一些实践经验。 1.刚拿到项目时…