C++重点和练习

发布于:2024-12-18 ⋅ 阅读:(6) ⋅ 点赞:(0)

 

 作业1:实现类中有类的几个特殊成员函数

#include <iostream>

using namespace std;

class Person
{
    string name;
    int *age;
public:
    Person():name("none"),age(new int(0)){}
    Person(int age):age(new int(age)){}
    Person(string name,int age):name(name),age(new int(age)){}
    Person(const Person &other):name(other.name),age(new int(*(other.age))){}
    ~Person()
    {
        delete age;

    }
    void show();
    void set_age(int age)
    {
        *(this->age) = age;
    }
    Person &operator=(const Person &other)
    {
        name = other.name;
        *age = *(other.age);
        return *this;
    }
};

class Stu
{
    Person p1;
    const double score;
public:
    Stu(string name,int age,double score):p1(name,age),score(score){}
    Stu():score(0){}
    Stu(const Stu &other):p1(other.p1),score(other.score){}
    ~Stu(){  }
    void show();
    void set_age(int age)
    {
        p1.set_age(age);
    }
    Stu &operator=(const Stu &other)
    {
        p1.operator=(other.p1);
        return *this;
    }

};

void Person::show()
{
    cout << "name: " << name << endl;
    cout << "age: " << *age << endl;
}

void Stu::show()
{
    p1.show();
    cout << "score: " << score << endl;
}

int main()
{
    Stu *s1 = new Stu;
    s1->show();
    delete s1;
    cout << endl;

    Stu *s2 = new Stu ("张三",18,99.8);
    s2->show();
    delete s2;
    cout << endl;

    Stu s3("李四",25,25.5);
    s3.show();
    cout << endl;

    Stu s4 = s3;
    s4.show();
    cout << endl;

    s3.set_age(99);
    s3.show();
    cout << endl;
    s4.show();
    cout << endl;

    s4.operator=(s3);
    s4.show();

    return 0;
}

作业2:实现自定义Mystring

#include <iostream>
#include <cstring>
using namespace std;
char c = '\0';
class My_string
{
    char *str;     //记录C风格的字符串
    int size;      //记录字符串长度
public:
    //无参构造
    //有参构造
    //拷贝构造
    //拷贝赋值
    //析构函数
    //at函数
    char &my_at(int num);
};

 答案1(优化版):

#include <iostream>
#include <cstring>
using namespace std;

class Mystring
{
    char *str;
    int len;
public:
    // 无参构造函数
    Mystring() : str(new char[1]), len(0)
    {
        str[0] = '\0';  // 确保空字符串以null结尾
    }
    // 有参构造函数
    Mystring(const char *str)
    {
        len = strlen(str);

        this->str = new char[len + 1];  // +1 为结束符留空间
        strcpy(this->str, str);
    }
    ~Mystring()
    {
        delete [] str;
    }
    //拷贝构造函数
    Mystring(const Mystring &other)
    {
        this->len = other.len;
        this->str = new char[other.len+1];
        strcpy(this->str,other.str);
    }
    // 拷贝赋值函数
    Mystring &operator=(const Mystring &other)
    {
        if (this != &other)
        {  // 添加自赋值检查
            delete[] str;  // 先删除原有内存
            len = other.len;
            str = new char[len + 1];  // +1 为结束符留空间
            strcpy(str, other.str);
        }
        return *this;
    }
    // 加法运算符重载
    Mystring operator+(const Mystring &other) const  // 返回新对象,参数使用const
    {
        Mystring result;
        result.len = this->len + other.len;
        delete[] result.str;  // 删除默认构造函数分配的内存
        result.str = new char[result.len + 1];  // +1 为结束符留空间
        strcpy(result.str, this->str);
        strcat(result.str, other.str);
        return result;
     }
    char &my_at(int location)
    {
        if(location>len)
        {
            perror("越界访问");
        }
        return *(str+location-1);
    }
    void show()
    {
        printf(str);
    }

};


int main()
{
    char s[10] = "hello";
    Mystring str1(s);
    str1.show();
    cout << endl;

    Mystring str2("world");
    str2.show();
    cout << endl;

    Mystring str3 = str2;  // 复制构造
    str3.show();
    cout << endl;

    Mystring str4;
    str4 = str1 + str2;    // 使用加法运算符
    str4.show();
    cout << endl;

    cout << str4.my_at(16) << endl;
    return 0;
}

答案2:

#include <iostream>
#include <cstring>
using namespace std;

class Mystring
{
    char *str;
    int len;
public:
    Mystring():str(new char[4]{0}),len(4){}
    Mystring(const char *str)
    {
        this->len = strlen(str);
        this->str = new char[len];
        for(int i=0;i<len;i++)
        {
            *((this->str)+i) = *(str+i);
        }
    }
    ~Mystring()
    {
        delete [] str;
    }
    Mystring(const Mystring &other)
    {
        this->len = other.len;
        this->str = new char[this->len];
        for(int i=0;i<len;i++)
        {
            *((this->str)+i) = *((other.str)+i);
        }
    }
    // 修改赋值运算符
    Mystring &operator=(const Mystring &other)  
    {
        if(this != &other)  // 添加自赋值检查
        {
            char *temp = new char[other.len];  // 先分配新内存
            for(int i = 0; i < other.len; i++)
            {
                temp[i] = other.str[i];
            }
            delete[] str;  // 再删除旧内存
            str = temp;
            len = other.len;
        }
        return *this;
    }

    Mystring operator+(Mystring &other)
    {
        Mystring temp;
        delete[] temp.str;  // 释放默认构造的内存
        temp.len = this->len+other.len;
        temp.str = new char [temp.len];
        for(int i = 0;i<temp.len;i++)
        {
            if(i<this->len)
            {
                *((temp.str)+i) = *((this->str)+i);
            }
            else
            {
                *((temp.str)+i) = *((other.str+i)-this->len);
            }
        }
        return temp;

    }
    void show()
    {
        for(int i = 0;i<len;i++)
        {
            printf("%c",*((this->str)+i));
        }
    }

};




int main()
{
    char s[10] = "hello";
    Mystring str1(s);
    str1.show();
    cout << endl;
    Mystring str2("world");
    str2.show();
    cout << endl;
    Mystring str3 = str2;
    str3.show();
    cout << endl;
    Mystring str4;
    str4 = str1+str2;
    str4.show();
    cout << endl;
    return 0;
}


网站公告

今日签到

点亮在社区的每一天
去签到