C\C++常见基础编程题(1)

1. 编写下面类String的构造函数、拷贝构造函数、赋值运算符和析构函数。

class String 
{
    friend String operate+( const String &s1, const String &s2);
public:
    String(const char *str=””);
    ~String(void);
    String(const String &other);
    String& operate = (const String &other);
private:
    char *m_data;
};

答:

// 构造函数
String::String(const char *str)
{
if (NULL == str)
{
m_data = new char[1];
*m_data = ‘\0’;
}
else
{
size_t length = strlen(str);
m_data = new char[length+1];
strcpy(m_data, str);
}
}

// 析构函数
String::~String(void)
{
    delete [] m_data;
    m_data = NULL;
}

// 拷贝构造函数
String::String(const String &other)
{
    size_t length = strlen(other.m_data);
    m_data = new char[length+1];
    strcpy(m_data, other.m_data);
}

// 赋值运算符
String &String::operate=(const String &other) 
{
    if (this != &other)					// 检查自赋值
    {
        char *temp = new char[strlen(other.m_data)+1];
        strcpy(temp, other.m_data);
        delete [] m_data;
        m_data = temp;
    }
    return *this;
}

String operate+( const String &s1, const String &s2)
{
    String temp;
    delete temp.m_data;							// temp.m_data是仅含‘\0’的字符串
    temp.m_data = new char[strlen(s1.m_data) + strlen(s2.m_data) + 1];
    strcpy(temp.m_data, s1.m_data);
    strcat(temp.m_data, s2.m_data);
    return temp; 
}

2. 定义类StrBlobPtr的前置++/--和后置++/--运算符。

class StrBlobPtr
{
public:
    StrBlobPtr() : curr(0) {}

    StrBlobPtr& operator++();			// 前置递增
    StrBlobPtr& operator--();			// 前置递减
    StrBlobPtr operator++(int);			// 后置递增
    StrBlobPtr operator--(int);			// 后置递减

private:
    int curr;
}

答:


// 前置版本:返回递增/递减对象的引用
StrBlobPtr& StrBlobPtr::operator++()
{
    ++curr;
    return *this;
}

// 后置版本:返回递增/递减前的值,返回的形式是值而非引用
StrBlobPtr StrBlobPtr::operator++(int)
{
    StrBlobPtr ret = *this;
    ++*this;
    return ret;
}

3. 编写strcpy函数。

已知strcpy函数的原型为:char *strcpy(char *strDest, const char *strSrc);

其中,strDest是目的字符串,strSrc是源字符串。

(1) 不调用C++/C的字符串库函数,编写strcpy函数;

(2) strcpy能把strSrc的内容拷贝到strDest,为什么还要char*的返回值呢?

答:

char *strcpy(char *strDest, const char *strSrc)
{
    assert((strDest!=NULL)&&(strSrc!=NULL));

    char *temp = strDest;
    while (*strSrc != ‘\0’)
    {
        *strDest++ = *strSrc++; // 后置递增优先级>解引用>赋值,且都是右结合律
    }

    *strDest = ‘\0’;
    return temp;
}

为了实现链表表达式。

这样接受char*/const char*参数的函数,可以直接包含调用strcpy函数。比如:

size_t length = strlen(strcpy(strDest, "Good Luck"));
cout << strcpy(strDest, "Good Luck") << endl;

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值