自己实现一把String类

本文介绍了一个简单的自定义String类的实现,包括构造函数、赋值运算符重载及比较等基本功能。通过C++代码展示了如何管理和操作字符串。
        好几次在笔试中要求写String类,我也都写了,但是从来没有完整的整理过,每次都是做题的时候写一写,笔试完了就忘了。今天忽然想起了,自己写了一点点。也只是简单测试了一下,欢迎拍砖。
#include <iostream>
#include 
<string.h>
using namespace std;

class MyString
{
public:
    MyString();
    
~MyString(){}
    MyString(
const char* str);
    MyString(MyString 
& str);
    MyString 
& operator=(const MyString & str);
    MyString 
& operator=(const char * c_str);

    
char operator[](const unsigned int index);

    MyString operator
+(const MyString & str);
    MyString operator
+(const char *);
    MyString operator
+=(const MyString & str);
    MyString operator
+=(const char * c_str);
    bool operator
>(const MyString &str);
    bool operator
>(const char * c_str);
    bool operator
>=(const MyString &str);
    bool operator
>=(const char * c_str);
    bool operator
<(const MyString &str);
    bool operator
<(const char * c_str);
    bool operator
<=(const MyString & str);
    bool operator
<=(const char * c_str);
    bool operator
==(const MyString & str);
    bool operator
==(const char * c_str);
    bool operator
!=(const MyString & str);
    bool operator
!=(const char * c_str);

    friend ostream 
& operator<<(ostream &ostr, MyString & str);
    friend istream 
& operator>>(istream &istr, MyString & str);
    friend MyString operator
+(char * c_str, MyString & str);
    friend MyString operator
!=(char * c_str, MyString & str);
    friend bool operator
>(const char * c_str, const MyString & str);
    friend bool operator
>=(const char * c_str, const MyString &str);
    friend bool operator
<(const char * c_str, const MyString &str);
    friend bool operator
<=(const char *c_str, const MyString & str);
    friend bool operator
==(const char * c_str, const MyString & str);
    friend bool operator
!=(const char * c_str, const MyString & str);

public:
    
char* getString() const;
    
int getSize() const;

private:
    
char * m_string;
    unsigned 
int m_size;
};

int MyString::getSize() const
{
    
return m_size;
}

char * MyString::getString() const
{
    
return m_string;
}

MyString::MyString()
{
    m_string 
= new char[1];
    m_string[
0= '';
    m_size 
= 0;
}

MyString::MyString(
const char * c_str)
{
    m_size 
= (unsigned int)strlen(c_str);
    m_string 
= new char[m_size+1];
    strcpy(m_string, c_str);
}

MyString::MyString(MyString 
&str)
{
    m_size 
= str.getSize();
    m_string 
= new char (m_size + 1);
    strcpy(m_string, str.getString());
}

MyString 
& MyString::operator =(const char *str)
{
    
if (strcmp(str, m_string) == 0)
        
return *this;
    
if (m_string)
        delete [] m_string;
    m_size 
= (unsigned int)strlen(str);
    m_string 
= new char(m_size + 1);
    strcpy(m_string, str);
    
return *this;
}

MyString 
& MyString::operator=(const MyString & str)
{
    
if (strcmp(str.getString(), m_string) == 0)
    {
        
return * this;
    }
    
if (m_string)
        delete m_string;
    m_size 
= str.getSize();
    m_string 
= new char (m_size + 1);
    strcpy(m_string, str.getString());
    
return * this;
}


char MyString::operator [](unsigned int index)
{
    
if (index > m_size)
    {
        index 
= m_size - 1;
    }
    
return m_string[index];
}

MyString MyString::operator
+(const MyString & str)
{
    
int i = m_size + str.getSize() + 1;
    
char * p = new char (i);
    strcpy(p, m_string);
    strcat(p, str.getString());
    
return MyString(p);
}

MyString MyString::operator 
+(const char * c_str)
{
    size_t i 
= strlen(c_str) + m_size + 1;
    
char * p = new char ((int)i);
    strcpy(p, m_string);
    strcat(p, c_str);
    
return MyString(p);
}

MyString MyString::operator 
+=(const char *str)
{
    strcpy(m_string, str);
    
return * this;
}

MyString MyString::operator 
+=(const MyString &str)
{
    strcpy(m_string, str.getString());
    
return * this;
}

bool MyString::operator 
>(const char *str)
{
    
return (strcmp(m_string, str) < 0);
}

bool MyString::operator
>(const MyString & str)
{
    
return (strcmp(m_string, str.getString())>0);
}

bool MyString::operator
>=(const char * c_str)
{
    
return (strcmp(m_string, c_str)>=0);
}

bool MyString::operator
>=(const MyString & str)
{
    
return (strcmp(m_string, str.getString())>=0);
}

bool MyString::operator
<(const char * c_str)
{
    
return (strcmp(m_string, c_str)<0);
}

bool MyString::operator
<(const MyString & str)
{
    
return (strcmp(m_string, str.getString()) < 0);
}

bool MyString::operator
<=(const char * c_str)
{
    
return (strcmp(m_string, c_str)<=0);
}

bool MyString::operator
<=(const MyString &str)
{
    
return (strcmp(m_string, str.getString()) == 0);
}

bool MyString::operator
==(const char * c_str)
{
    
return (strcmp(m_string, c_str)==0);
}

bool MyString::operator
==(const MyString & str)
{
    
return (strcmp(m_string, str.getString()) == 0);
}

bool MyString::operator 
!=(const char * c_str)
{
    
return (strcmp(m_string, c_str) != 0);
}

bool MyString::operator 
!=(const MyString &str)
{
    
return (strcmp(m_string, str.getString()) != 0);
}

// Friend Function
ostream & operator<<(ostream &ostr, MyString & str)
{
    ostr
<<str.getString();
    
return ostr;
}

istream 
& operator>>(istream & istr, MyString &str)
{
    
char tmp[255]; 
    istr
>>tmp;
    str 
= tmp;
    
return istr;
}

MyString operator
+(char * c_str, MyString & str)
{
    
int new_size = strlen(c_str) + str.getSize() + 1;
    
char * newStr = new char [new_size];
    strcpy (newStr, c_str);
    strcat (newStr, str.getString());

    
return MyString(newStr);
}

bool operator
!=(const char * c_str, MyString & str)
{
    
return (strcmp(c_str, str.getString()) != 0);
}

bool operator
>(const char * c_str, const MyString & str)
{
    
return (strcmp(c_str, str.getString()) > 0);
}
bool operator
>=(const char * c_str, const MyString &str)
{
    
return (strcmp(c_str, str.getString()) > 0);
}
bool operator
<(const char * c_str, const MyString &str)
{
    
return (strcmp(c_str, str.getString()) < 0);
}
bool operator
<=(const char *c_str, const MyString & str)
{
    
return (strcmp(c_str, str.getString()) <= 0);
}
bool operator
==(const char * c_str, const MyString & str)
{
    
return (strcmp(c_str, str.getString()) == 0);
}
bool operator
!=(const char * c_str, const MyString & str)
{
    
return (strcmp(c_str, str.getString()) != 0);
}

bool operator
>(char * c_str, const MyString & str)
{
    
return (strcmp(c_str, str.getString()) > 0);
}

 
<think>嗯,用户现在想了解Excel中的WEEKDAY函数,特别是参数的作用和具体例子WEEKDAY("2025/5/8", 2)的结果。首先,我需要回顾一下之前关于WEEKNUM函数的讨论,确保这次的回答保持一致性。用户之前询问了WEEKNUM的用法,现在转向了WEEKDAY,这可能是因为他们在处理日期相关的函数,或者在制作报表时需要更多的日期信息。 根据用户提供的引用,特别是引用[2]和[3],里面有关于WEEKDAY函数的介绍和示例。引用[3]中提到了不同的参数会导致不同的结果,比如参数2使用1(星期一)到7(星期日)。需要确认这些信息是否准确,并整合到回答中。另外,引用[4]提到其他编程语言中的类似函数,但用户关注的是Excel,所以可能不需要深入讨论这部分,但可以作为对比简要提及。 用户的问题集中在WEEKDAY的用法和参数含义,特别是参数为2的情况。需要明确参数的不同取值对应的星期几的编号方式。例如,参数1是默认值,周日为1,周六为7;参数2则是周一为1,周日为7。要确保解释清楚这些区别,并举例说明。 另外,用户给出的例子是WEEKDAY("2025/5/8", 2),需要验证这个日期的正确性。首先,20255月8日实际是星期几?可以通过计算或者查阅日历来确认。比如,20255月8日是星期四。那么当参数为2时,星期一为1,所以星期四是第4天,结果应该是4。需要确认是否正确,避免给出错误的信息。 还需要注意用户可能遇到的常见问题,比如日期格式的问题。用户输入的日期如果是文本格式,可能需要使用DATEVALUE或DATE函数转换。例如,直接使用"2025/5/8"可能会被Excel识别,但最好建议使用DATE函数来避免区域设置带来的问题,比如DATE(2025,5,8)。 此外,用户可能对参数的不同选项感到困惑,需要列出所有可能的参数值及其对应的星期排列,如参数1到3的不同编号方式,以及参数11到17的其他系统,但根据引用[3]中的示例,可能只需要关注参数1、2、3的情况,其他参数如11-17可能较少使用,但可以简要提及。 还需要考虑用户的应用场景,比如在制作周报时需要知道某一天是星期几,或者根据工作日调整计划。结合之前的回答中提到的项目管理、周报统计等场景,可以举例说明如何利用WEEKDAY函数来自动化这些任务。 最后,要检查是否有遗漏的信息,比如错误处理,如果输入的日期无效,或者参数不正确,Excel会返回什么错误值。例如,如果日期格式错误,可能会返回#VALUE!错误,或者参数超出范围导致的问题。这部分虽然用户没有直接提到,但作为全面的解释应该涵盖。 总结下来,回答需要结构清晰,先介绍函数作用,再详细参数,举例说明,注意事项,应用场景,最后相关问题。确保使用正确的中文术语,避免技术术语过于晦涩,同时保持示例的准确性和可操作性。</think>### Excel WEEKDAY函数详解:`WEEKDAY(日期, 参数)` #### 一、函数作用 `WEEKDAY` 是Excel中用于**判断指定日期是星期几**的函数,通过返回数字(1-7或0-6)表示星期几,具体规则由参数控制[^2][^3]。 **公式语法**: $$ \text{WEEKDAY}(serial\_number, [return\_type]) $$ - **参数解释**: - `serial_number`:目标日期(需为Excel可识别的日期格式或日期序列值)。 - `return_type`(可选):定义星期编号规则,默认值为 `1`(星期日为1,星期六为7)。 --- #### 二、参数 `return_type` 的详细说明 | 参数值 | 编号规则 | 典型应用场景 | |--------|---------------------------------------|------------------------| | `1` | 星期日=1,星期六=7(默认) | 北美习惯的周计划表 | | `2` | 星期一=1,星期日=7 | 中国/欧洲的工作日统计 | | `3` | 星期一=0,星期日=6 | 编程场景中的索引对齐 | | `11` | 星期一=1,星期日=7(与参数 `2` 相同) | ISO 8601兼容系统 | **示例**:`WEEKDAY("2025/5/8", 2)` - **计算逻辑**: 1. 日期 `2025/5/8` 实际为**星期四**。 2. 参数 `2` 规定:星期一=1,星期日=7。 3. 按周顺序排列: - 星期一(1)→ 星期二(2)→ 星期三(3)→ **星期四(4)** → ... → 星期日(7)。 - **结果**: $$ 4 $$ 验证方式:在单元格输入 `=WEEKDAY(DATE(2025,5,8), 2)` 即可返回结果[^3]。 --- #### 三、关键注意事项 1. **日期输入规范**: - 若直接使用文本格式日期(如 `"2025/5/8"`),需确保Excel能正确解析,否则需用 `DATEVALUE` 转换: ```excel =WEEKDAY(DATEVALUE("2025/5/8"), 2) ``` - 建议优先使用 `DATE` 函数避免格式错误: ```excel =WEEKDAY(DATE(2025,5,8), 2) ``` 2. **参数兼容性**: - 参数 `11`-`17` 是Excel 2010新增的选项,与参数 `2` 类似但支持更多国际标准,例如: - `11`:星期一=1,星期日=7(与参数 `2` 相同)。 - `12`:星期二=1,星期一=7(中东部分地区使用)。 3. **错误处理**: - 若日期无效(如 `"2025/13/1"`),返回 `#VALUE!` 错误。 - 若参数值超出范围(如 `return_type=5`),返回 `#NUM!` 错误。 --- #### 四、应用场景 1. **动态标注工作日**: - 结合 `IF` 函数标记工作日与非工作日: ```excel =IF(WEEKDAY(A1, 2) <= 5, "工作日", "周末") ``` 2. **周计划表排序**: - 按周一至周日自动排序任务: ```excel =SORTBY(任务列表, WEEKDAY(日期列, 2)) ``` 3. **条件格式高亮**: - 高亮所有周末日期: ```excel =WEEKDAY(A1, 2) > 5 ``` --- ### 相关问题 1. 如何将 `WEEKDAY` 返回的数字转换为“星期一”“星期二”等文本? 2. 为什么参数 `3` 的编号规则是星期一=0? 3. 如何用 `WEEKDAY` 计算某个月的所有周一日期? --- ### 附:不同参数对比(以2025/5/8为例) | 参数值 | 结果 | 规则说明 | |--------|------|-------------------------| | `1` | 5 | 星期日=1,星期四=5 | | `2` | 4 | 星期一=1,星期四=4 | | `3` | 3 | 星期一=0,星期四=3 | | `11` | 4 | 与参数 `2` 结果一致 | 如需更复杂的日期逻辑(如节假日排除),可结合 `WORKDAY` 函数使用[^1][^3]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值