学逆向论坛

找回密码
立即注册

只需一步,快速开始

发新帖

670

积分

1

好友

36

主题

[原创图文] C++ CString类

发表于 2021-1-30 18:19:07 | 查看: 1267| 回复: 0
本帖最后由 鸦领主 于 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))
里面的一个对象赋值给另一个对象,让另一个指针变量的地址指向和它相同的地址

温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的认可,还可以获得学币奖励,请尊重他人的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。

小黑屋|手机版|站务邮箱|学逆向论坛 ( 粤ICP备2021023307号 )|网站地图

GMT+8, 2024-4-20 12:23 , Processed in 0.094749 second(s), 37 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表