VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 169|回复: 1

[已解决]关于学习运算符重载

[复制链接]
21_avatar_middle
最佳答案
0 
在线会员 发表于 2022-4-4 17:02:36 | 显示全部楼层 |阅读模式
我写的运算符重载代码好像没有调用,但是看不出问题在哪
Cstu& Cstu::operator=(Cstu& lisi) {           //重载+号的实现

        this->num = lisi.num;
        this->age = lisi.age;
        this->sex = lisi.sex;
        if (name_char) {
                delete[] name_char;
                name_char = NULL;
        }

        int len_c = strlen(lisi.name_char)+1;
        this->name_char = new char[len_c];
        strcpy(this->name_char, lisi.name_char);
        cout << "性别:" << this->sex << endl;
        return *this;
}

Cstu::Cstu(const char* name, char sex, int num, int age) {
        this->name = (char*)name;
        this->sex = sex;
        this->num = num;
        this->age = age;

}
复制代码


下面是声明:
#pragma once
#include <iostream>
using namespace std;
class Cstu
{
        public:
                char* name;
                char sex;
                int age;
                int num;
                Cstu() {};
                ~Cstu();
                Cstu(const char* name, char sex, int num, int age);
                Cstu& operator=(Cstu& lisi);
};
复制代码

下面是调用:
void test() {
    Cstu stu_zhangsan("张三", 'g', 12, 2345);
    Cstu stu_fuzhi = stu_zhangsan;
}

好像没有调用运算符重载,我在重载里面下断点,没有断下来
最佳答案
46_avatar_small
2022-4-8 22:08:16
这个是测试通过的重载=

#include <iostream>
using namespace std;

class Person
{
public:
        Person(int age)
        {
                m_Age = new int(age);
        }

        int* m_Age;

        ~Person()
        {
                if(m_Age != NULL)
                {
                        delete m_Age;
                        m_Age = NULL;
                }
        }

        Person& operator=(Person& p)
        {
                if(m_Age != NULL)
                {
                        //如果已经在堆区分配内存,先释放
                        delete m_Age;
                        m_Age = NULL;
                }
                //将赋值的对象,深拷贝给被赋值对象
                m_Age = new int(*p.m_Age);
                return *this;
        }
};

void test01()
{
        Person p1(18);
        cout << "p1 age: " << *p1.m_Age << endl;
        cout << "------------" << endl;

        Person p2(20);
        cout << "p2 age: " << *p2.m_Age << endl;

        /*需要重载=,进行深拷贝,防止p2,p1中m_Age都保存了同一块内存地址
         * 在p2调用析构函数释放了m_Age中的内存后,p1调用析构函数释放同一块内存
         * */
        p2 = p1;
        cout << "p1 age: " << *p1.m_Age << endl;
        cout << "p2 age: " << *p2.m_Age << endl;
        cout << "------------" << endl;

        Person p3(30);
        cout << "p3 age: " << *p3.m_Age << endl;

        p3 = p2 = p1;//连等号赋值
        cout << "p1 age: " << *p1.m_Age << endl;
        cout << "p2 age: " << *p2.m_Age << endl;
        cout << "p3 age: " << *p3.m_Age << endl;
}

int main(void)
{
        test01();
        return 0;
}




上一篇:socket 通讯接收不到数据
下一篇:GetCheckedRadioButton 获取 Radio 组选中状态时,提示未定义标识符
46_avatar_middle
最佳答案
4 
在线会员 发表于 2022-4-8 22:08:16 | 显示全部楼层    本楼为最佳答案   
bestAnswer
这个是测试通过的重载=

#include <iostream>
using namespace std;

class Person
{
public:
        Person(int age)
        {
                m_Age = new int(age);
        }

        int* m_Age;

        ~Person()
        {
                if(m_Age != NULL)
                {
                        delete m_Age;
                        m_Age = NULL;
                }
        }

        Person& operator=(Person& p)
        {
                if(m_Age != NULL)
                {
                        //如果已经在堆区分配内存,先释放
                        delete m_Age;
                        m_Age = NULL;
                }
                //将赋值的对象,深拷贝给被赋值对象
                m_Age = new int(*p.m_Age);
                return *this;
        }
};

void test01()
{
        Person p1(18);
        cout << "p1 age: " << *p1.m_Age << endl;
        cout << "------------" << endl;

        Person p2(20);
        cout << "p2 age: " << *p2.m_Age << endl;

        /*需要重载=,进行深拷贝,防止p2,p1中m_Age都保存了同一块内存地址
         * 在p2调用析构函数释放了m_Age中的内存后,p1调用析构函数释放同一块内存
         * */
        p2 = p1;
        cout << "p1 age: " << *p1.m_Age << endl;
        cout << "p2 age: " << *p2.m_Age << endl;
        cout << "------------" << endl;

        Person p3(30);
        cout << "p3 age: " << *p3.m_Age << endl;

        p3 = p2 = p1;//连等号赋值
        cout << "p1 age: " << *p1.m_Age << endl;
        cout << "p2 age: " << *p2.m_Age << endl;
        cout << "p3 age: " << *p3.m_Age << endl;
}

int main(void)
{
        test01();
        return 0;
}
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2022-7-7 17:49

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表