为什么要用const和static来修饰。

1、为什么重载函数里面的形参要用const修饰,有什么用?不加会影响什么?
2、重载输入运算符时,为什么要把str数组定义为static,如果没定义为static就会出现乱码,这是为什么?


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

class mystring
{
public:
    mystring() {}   //无参构造函数
    mystring(char s[]) :pstr(s), length(strlen(s)) {}//有参构造函数

    //重载输入输出
    friend istream& operator>>(istream& in, mystring& s);
    friend ostream& operator<<(ostream& out, const mystring &s);

    //重载+=
    void operator+=(const mystring &s)
    {
        strcat(this->pstr, s.pstr);
        this->length += strlen(s.pstr);
    }

    //重载=
    void operator=(const mystring &s) 
    {
        this->pstr = s.pstr;
        this->length = strlen(s.pstr);
    }

    //重载==
    int operator==(const mystring &s)
    {
        return strcmp(this->pstr, s.pstr) == 0;
    }

    //重载!=
    int operator!=(const mystring &s)
    {
        return strcmp(this->pstr, s.pstr);
    }

    //重载>
    int operator>(const mystring &s) 
    {
        return strcmp(this->pstr, s.pstr) > 0;
    }

    //重载<
    int operator<(const mystring &s)
    {
        return strcmp(this->pstr, s.pstr) < 0;
    }

    //重载下标运算符
    char operator[](int n) 
    {
        return *(this->pstr + n);
    }

private:
    char* pstr;
    int length;
};

istream& operator>>(istream& in, mystring& s)
{
    static  char str[50];
    cout << "请输入str数组的元素:";
    in >> str;

    s.pstr = str;
    s.length = strlen(str);

    return in;
}

ostream& operator<<(ostream& out,const mystring &s) 
{
    out << s.pstr;
    return out;
}


int main()
{
    char str[20];
    mystring s1(str);
    mystring s2;

    cout << "请输入s2:" << endl;
    cin >> s2;
    cout << s2 << endl;

    s2 += s1;
    cout <<"s1+=s2后s2为:"<< s2 << endl;

    s2 = s1;
    cout << s2[3] << endl;
    if (s1 != s2) {
        cout << "s1!=s2" << endl;
    }
    if (s1 == s2) {
        cout << "s1==s2" << endl;
    }
    if (s1 > s2) {
        cout << "s1>s2" << endl;
    }
    if (s1 < s2) {
        cout << "s1<s2" << endl;
    }


    return 0;
}

代码有问题,
const 是没有用错,const t& 有个重要做用是绑定临时变量 比如 cout<<(s1+s2)那么s1+s2必然有一个临时变量 然后那个临时变量通过cout输出,如果不用const mstring& 则无法通过引用绑定 。例如还有s=s1+s2+s3 这样的代码必然中间要产生临时变量
static 不出问题,是因位你的代码有问题。
你没有考虑深拷贝。s1=s2这样的代码s1,s2必然会同时引用一个char* ,当对象被回收时必然报错

const修饰表示不可修改对象内容、
使用static才显示正常数据、和内存指向有关

  • 建议你看下这篇博客👉 :const、static型数据在内存中如何存储?(变量存放位置)
  • 以下回答由chatgpt基于相关博客总结生成:

    const关键字的作用在段落1已经解释过了,这里重点讲一下static关键字的作用。static关键字可以修饰函数和变量。

    在函数中,static关键字的作用有以下几个方面:

    1. 限定函数的作用域。使用static修饰函数后,该函数只能在当前文件中使用,无法被其他文件调用。这样做可以有效避免函数命名冲突的问题。

    2. 使局部变量静态化。使用static修饰局部变量后,该变量的生命周期被延长到整个程序运行期间,只会在第一次进入到函数时被初始化,之后每次调用都会保留上一次调用后的值。

    3. 使全局变量静态化。使用static修饰全局变量后,该变量的作用域被限定在当前文件中,无法被其他文件访问。这样可以有效地防止全局变量命名冲突的问题。

    在变量中,static关键字的作用有以下几个方面:

    1. 使局部变量静态化。同函数中的作用一样,使用static修饰局部变量后,该变量的生命周期被延长到整个程序运行期间,只会在第一次进入到函数时被初始化,之后每次调用都会保留上一次调用后的值。

    2. 使全局变量静态化。同函数中的作用一样,使用static修饰全局变量后,该变量的作用域被限定在当前文件中,无法被其他文件访问。这样可以有效地防止全局变量命名冲突的问题。

    3. 使数据成员静态化。使用static修饰类的数据成员后,该成员变量不会与任何类对象绑定,而是被整个类共享,只有一份拷贝。这样做可以在全局范围内对数据进行统计和管理。

    在重载函数中,使用const修饰形参的作用是指明该参数为输入参数,在函数内部不会被修改,避免了无意中修改了输入参数的可能性。如果不加const,可能会导致输入参数被修改,产生不可预测的结果。

    在重载输入运算符时,将str数组定义为static的作用是为了使其只被初始化一次,避免重复初始化造成的资源浪费。如果没有定义为static,每当输入运算符被调用时都会重新初始化str数组。此外,定义为static还有避免重名的好处,可以使多个输入运算符共享一个str数组,不会发生冲突。如果没有定义为static,则每个输入运算符都会有一个str数组,会产生冲突。

加const是说明函数中不对该参数进行修改,一般只作为输入不作为输出的参数都要定义为const
加static是因为


in >> str;
    s.pstr = str;

这两句,s.pstr把指针传出,所以不能用栈内存,要用堆内存或全局内存,static 是静态内存,类似全局内存