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关键字的作用在段落1已经解释过了,这里重点讲一下static关键字的作用。static关键字可以修饰函数和变量。
在函数中,static关键字的作用有以下几个方面:
限定函数的作用域。使用static修饰函数后,该函数只能在当前文件中使用,无法被其他文件调用。这样做可以有效避免函数命名冲突的问题。
使局部变量静态化。使用static修饰局部变量后,该变量的生命周期被延长到整个程序运行期间,只会在第一次进入到函数时被初始化,之后每次调用都会保留上一次调用后的值。
使全局变量静态化。使用static修饰全局变量后,该变量的作用域被限定在当前文件中,无法被其他文件访问。这样可以有效地防止全局变量命名冲突的问题。
在变量中,static关键字的作用有以下几个方面:
使局部变量静态化。同函数中的作用一样,使用static修饰局部变量后,该变量的生命周期被延长到整个程序运行期间,只会在第一次进入到函数时被初始化,之后每次调用都会保留上一次调用后的值。
使全局变量静态化。同函数中的作用一样,使用static修饰全局变量后,该变量的作用域被限定在当前文件中,无法被其他文件访问。这样可以有效地防止全局变量命名冲突的问题。
使数据成员静态化。使用static修饰类的数据成员后,该成员变量不会与任何类对象绑定,而是被整个类共享,只有一份拷贝。这样做可以在全局范围内对数据进行统计和管理。
在重载函数中,使用const修饰形参的作用是指明该参数为输入参数,在函数内部不会被修改,避免了无意中修改了输入参数的可能性。如果不加const,可能会导致输入参数被修改,产生不可预测的结果。
在重载输入运算符时,将str数组定义为static的作用是为了使其只被初始化一次,避免重复初始化造成的资源浪费。如果没有定义为static,每当输入运算符被调用时都会重新初始化str数组。此外,定义为static还有避免重名的好处,可以使多个输入运算符共享一个str数组,不会发生冲突。如果没有定义为static,则每个输入运算符都会有一个str数组,会产生冲突。
加const是说明函数中不对该参数进行修改,一般只作为输入不作为输出的参数都要定义为const
加static是因为
in >> str;
s.pstr = str;
这两句,s.pstr把指针传出,所以不能用栈内存,要用堆内存或全局内存,static 是静态内存,类似全局内存