c++编程题(有关析构函数和静态变量的一些问题)

c++编程题(有关析构函数和静态变量的一些问题),第1张

看注释

#include<亏谈iostream>

using

namespace

std

class

A

{

int

*i

static

int

a,b,c

static

int

count

public:

A(int

x,int

y,int

z)

{

a=x

b=y

c=z

i=new

int[b]

}

static

int

getCount()

{

count++

return

count

}

~A()

{

cout<<"旅汪析构函数"

}

}

int

A::count=0

int

A::a=0

//不是说不能定义为static变量,但销镇碰要在这里初始化

int

A::b=0

int

A::c=0

void

main()

{

int

a,b,c

cin>>a>>b>>c

A

*d=new

A(a,b,c)

cout<<d->getCount()

cout<<d->getCount()

cout<<d->getCount()

delete

d

//d是个指针,没有delete掉那个对象的内存,因此没调用析构函数,加个delete手动析构

}

class CString

{

private:

    char * m_pbuff //指向字符串的指针

    int m_length//表示当前字符串的最大允许长度,也就是字符数组的长度

public:

    ~CString()//析构

    CString() //构造函数1,设置为空字符串,m_length=100

    CString(CString &)    //拷贝构造

    CString(char *src) //构造函数2,在考虑了src的长度后初始化当前对象,m_length>=src的长度+1

    CString(char ch) //构造函数3,0号元素赋斗橡值为ch,m_length=100

    int SetString(char *src) //设置字符串,在考虑了src的长度后设置当前对象,m_length>=src的长度+1

    void trim()//  去除字符串最前和最后的空格

    int find(char ch) //查找字符串中的指定字符的第一次出现位置,如果未出现返回-1

    void toLower()//字符串转小芹闹写

    void toUpper()//字符串转大写

    void deletechar(char ch) // 删除其中的指定字符

    void show()

private:

    void freeBuff()

}

void CString::freeBuff()

{

    if(m_pbuff != 0)

    {

        delete []m_pbuff

        m_pbuff = 0

    }

}

CString::CString()

{

    m_pbuff = new char[100]

    m_length = 100

    m_pbuff[0] = 0

}

CString::CString(CString &ref)

{

    if(ref.m_length > 0)

    {

        m_length = ref.m_length

        m_pbuff = new char[m_length]

        memcpy(m_pbuff,ref.m_pbuff,m_length)

    }

    else

    {

        m_pbuff = 0

        m_length = 0

    }

}

CString::CString(char *src)

{

    m_length = src?strlen(src)+1:0

    if(m_length == 0)

        m_pbuff = 0

    else

    {

        m_pbuff = new char[m_length]

        memcpy(m_pbuff,src,m_length)

    }

}

CString::CString(char ch)

{

    m_length = 100

    m_pbuff = new char[m_length]

    m_pbuff[0] = ch

    m_pbuff[1] = 0

}

int CString::SetString(char *src)

{

    freeBuff()

    

    m_length = src?strlen(src)+1:0

    if(m_length == 0)

        m_pbuff = 0

    else

    {

        m_pbuff = new char[m_length]

        memcpy(m_pbuff,src,m_length)

    }

}

void CString::trim()

{

    int i,j=m_length

    for(i=0i<m_length++i)

    {

        if(m_pbuff[i] != ' ' || m_pbuff[i] == 0)

            break

    }

    

    //跳过\0字符后面的所有字符

    while(m_pbuff[--j] != 0)

    

    while(j>0 && m_pbuff[j-1] == ' ')

  嫌销罩      --j

    m_pbuff[j] = 0

    

    m_length = j-i

    if(m_length == 0)

        freeBuff()

    else

    {

        m_length += 1

        char *p = new char[m_length]

        memcpy(p,m_pbuff+i,m_length)

        

        freeBuff()

        m_pbuff = p

    }

}

int CString::find(char ch)

{

    for(int i=0i<m_length++i)

    {

        if(m_pbuff[i] == 0)

            return -1

        if(m_pbuff[i] == ch)

            return i

    }

    

    return -1

}

void CString::toLower()

{

    for(int i=0i<m_length && m_pbuff[i] != 0++i)

    {

        if(m_pbuff[i] >= 'A' && m_pbuff[i] <= 'Z')

            m_pbuff += 32

    }

}

void CString::toUpper()

{

    for(int i=0i<m_length && m_pbuff[i] != 0++i)

    {

        if(m_pbuff[i] >= 'a' && m_pbuff[i] <= 'z')

            m_pbuff -= 32

    }

}

void CString::deletechar(char ch)

{

    if(m_length == 0)

        return

    

    char *p = new char[m_length]

    for(int i=0,j=0i<m_length && m_pbuff[i] != 0++i)

    {

        if(m_pbuff[i] != ch)

            p[j++] = m_pbuff[i]

    }

    

    p[j] = 0

    freeBuff()

    m_pbuff = p

}

void CString::show()

{

    if(m_length > 0 && m_pbuff[0] != 0)

        printf(m_pbuff)

}

以上代码均为NOTEPAD++手敲,请自行测试。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12555607.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2025-08-26
下一篇2025-08-26

发表评论

登录后才能评论

评论列表(0条)

    保存