2020.3.4
1.流插入,流提取运算符的重载只能作为全局函数进行,如果必须在类内写,可以考虑重载类型转换运算符(见笔记)。
2.在类内也可以写非成员函数(写成友元函数就不是成员函数了,这样可以在类内重载<<和>>)
3.如果是一个二维数组类,想要写出类似 a[i][j] 这种效果,可以考虑只重载第一个【】,其返回值类型为int*,这样第二个【】就不用重载了 见2020程序设计实习之运算符重载D题
int* operator[](int jj){//自定义数组的双括号可以这么搞
return parray+jj*c;
}
4.使用memcpy的第三个参数是字节数,如果是int型的一定要乘sizeof(int)!!!
memcpy(parray,ta.parray,(ta.r*ta.c)*sizeof(int));//memcpy要用字节数!
5.关于string,char[]字符串的几种操作的总结
(1)字符串初始化:
①char【】的初始化
char s[100]="buiabfi";//最后一位会自动补上‘\0’,初始数组要开大一点
//s="fas"; //直接写等号只能在初始化的时候用,在赋值的时候用会报错
②string的初始化
string s="afddfa";//初始化的时候直接写
string s2;//啥都不写就是空值
s="dnaosfno";//可以改成这样
(2)字符串长度:
①char[]:
char s[6]="12345"; //后面会自动保存\0,要记得多留出一位
cout<<strlen(s)<<endl;//5 strlen只能用在char[]数组,且计算到\0前一位
cout<<sizeof(s)<<endl;//6 sizeof计算的是整个数组的容量,与字符串长度无关!!
②string:
string s="123456";
cout<<s.length()<<endl;//6 string的长度计算只能用.length()
(3)整数和字符串的互换:
①整数转字符串:
→ 直接用atof即可,但是字符串必须是char[]类型的
char s[100]="154";
string s1="158";
int n=atof(s); //此处只接受char[]类型字符串
cout<<n<<endl;
cout<<atof(s1.c_str())<<endl;//string需要经过转化成char[]之后才能用
②字符串转整数:
→ 必须使用sprintf
char s[100];
sprintf(s,"%d",19991025); //此处必须是char[]
//string哪怕转换后也不行
cout<<s<<endl;//19991025
(4)字符串拼接
①cahr[]之间的拼接
char a1[100]="12345",a2[10]="abcde";
strcat(a1,a2);//a1必须开的足够大,因为这个函数是直接贴在a1里的
cout<<a1<<endl;
②string之间的拼接
string s1="12345",s2="abcde";
s1=s1+s2;
//s1+=s2; 也可以
cout<<s1<<endl;
(5)增添一个字符:
①char[]可以直接加
②string
string s1="12345";
s1+='a';
s1+="b";
cout<<s1<<endl;//12345ab
(6)字符串的复制:
①char[]
char a[5]="1234",b[7]="abcdef";
strcpy(a,b);//memcpy也行,但是记得最后一位写上字符数
cout<<a<<endl;//a可以比b小,但是非常不规范,建议a开的大一些。不规范原因见下
cout<<strlen(a)<<endl;//6
cout<<sizeof(a)<<endl;//5 这样很可能忘记a的长度,之后进行操作的时候出错
②string
string s1="12345",s2="abc";
s1=s2;
cout<<s1<<endl; //abc
(7)string和char[]的转换
①string->char[]:
string s;
s.c_str();//这个东西是char[]类型的
②char[]->string:
char s[100]="123456XY";
string s1;
s1=s;//可以直接赋值
string s2(s);//也可以写在初始化的时候
cout<<s1<<endl;
cout<<s2<<endl;
(8)判断string里每一位是什么:
string s="0123456";
int i;
for(i=0;i<s.length();++i){
if(s[i]=='6')//string里的每一位是字符型的
break;
}
cout<<i<<endl;//6