本帖最后由 鸦领主 于 2021-1-30 18:18 编辑
CString类包含头文件#include<atlstr.h>
1.认识CString类
char c[20] = "abc";//以前c语言的将字符串记录进去是这样的
strlen(c);//c语言求字符串的长度
strcat(c, "def");//合并是用strcat这个函数
CString s1 = "abc";//c++是用这个类直接记录
s1 += "def";//一个对象直接用运算符加字符串
int i = 0;
while (i<s1.GetLength())//GetLength()是这个类的求字符串长度的函数
{
cout <<(char)s1 << endl;//如果要将这个对象的内容打印出来,前面需要强制转换,要不然打印出来的是数字
i++;
}
2.CString实现方法
CString s1 = "abc",s2="def";//在main中这样写
CString(const char *str);//构造函数声明
CString::CString(const char *p)//需要调用这样的构造函数
{
int n=strlen(p);//求指出指针向的字符串的长度
m_str = new char[n + 1];//堆空间申请空间
strcpy(m_str, p);//将p指向的内容拷贝给成员变量
}
CString s1;//这样的写法
CString();//构造函数声明
CString::CString()//会调用这个构造函数,如果没有则会显示没有合适的默认构造函数可用
{
m_str = new char(0);//申请一个字节内容为0的堆空间
}
CString s3 = s1 ;//这样的写法(深拷贝)
CString(const CString& str);//构造函数声明
CString::CString(const CString& str)//会调用这个构造函数
{
int n = str.GetLength();//求出右边对象的成员变量的长度
m_str = new char[n + 1];//将左边的对象申请一个堆空间
strcpy(m_str, str.m_str);//将右边对象的内容复制给左边的对象
s1 = s2;//这样的写法(深拷贝)
CString CString::operator=(CString& str)//会调用这个成员函数(运算符重载)=号只能当作成员函数
{
int n = str.GetLength();//求出右值的长度
if (GetLength() < str.GetLength())//判断左值是否比右值小,
{ //如果左边的长度是3右边的长度是4 ,赋值的话就会出错
delete[]m_str;//要不然就删除现在的堆空间
m_str = new char[n + 1];//在申请一个
strcpy(m_str, str.m_str);//在复制
}
strcpy(m_str, str.m_str);//如果左值小于等于右值的话就直接复制
return *this;
}
cout << s1 << endl;//因为我们自己编写的CString,cout并没有支持,所以不认识s1,需要补充输出符号
friend std::ostream &operator<<(std::ostream& out, CString& str);//函数声明,
std::ostream &operator<<(std::ostream& out, CString& str)//给我们自己的类加上cout的功能
{//系统中的cout的类型是ostream
out << str.m_str;//输出出去
return out; //将输出的返回出去
}
浅拷贝:
a)浅拷贝对于普通结构体就足够了,例如两个信息结构体对象之间的赋值和构造;
(sstud s1=s2)
b)浅拷贝会出问题,必须用深拷贝的情况,主要是类内有(指向堆空间)指针变量。
系统中存在着缺省的拷贝构造及对象之间的赋值符号(operator=)都是浅拷贝。
浅拷贝的实现代码:memcpy(&s1,&s2,sizeof(s1))
里面的一个对象赋值给另一个对象,让另一个指针变量的地址指向和它相同的地址
|