0

我正在尝试为练习实现一个字符串类。这是我的所有代码:(您不需要全部阅读):

#include <iostream>
using namespace std;


// ******************************* String ************************
class String {
    private:
        char* char_arr;

        int strlen(const char* str) {
            int length;
            for(length=0;*(str+length)!='\0';length++);
            return length;
        }


        void strCopy(const char* str1, char* str2) {
            int length = strlen(str1);
            for(int i=0;i<length;i++)
                str2[i] = str1[i];                      
        }


    public:
        // --- Constructor ---
        String(const char* str) {
            int length = strlen(str);           
            char_arr = new char[strlen(str)+1];         
            char_arr[length] = '\0';
            strCopy(str,char_arr);
        }


        // --- size Constructor ---
        explicit String(int size) {
            char_arr = new char[size+1];
            char_arr[size+1] = '\0';
        }   



        // --- Destructor ---
        ~String() {
            delete char_arr;
        }




        // --- Copy Constructor ---
        String(const String& rhs) {
            char_arr = new char[strlen(rhs.char_arr)+1];
            strCopy(rhs.char_arr,char_arr);
        }



        // --- copy-assignment Constructor
        const String& operator=(const String& rhs) {
            delete char_arr;

            char_arr = new char[strlen(rhs.char_arr)+1];
            strCopy(rhs.char_arr,char_arr);         
        }



        // --- operator== ---
        bool operator==(const String& rhs) {
            int this_length = strlen(char_arr);
            int rhs_length = strlen(rhs.char_arr);
            if(this_length==rhs_length) {
                bool return_value = true;
                for(int i=0;i<this_length;i++) {
                    if(char_arr[i]!=rhs.char_arr[i]) {
                        return_value = false;
                        break;
                    }                   
                }

                return return_value;                    
            }

            return false;
        }



        // --- operator+ ---
        String operator+(const String& rhs) {
            int this_length = strlen(char_arr);
            int rhs_length = strlen(rhs.char_arr);

            String new_str(this_length+rhs_length);
            strCopy(char_arr,new_str.char_arr);

            for(int i=0;i<rhs_length;i++) {
                new_str.char_arr[i+this_length] = rhs.char_arr[i];
            }

            new_str.char_arr[this_length+rhs_length] = '\0';
            return new_str;
        }


        // --- print ---
        void print() {
            cout << char_arr;
        }   
};




// ~~~~~~~ main ~~~~~~~~~
int main() {
    String s = "This is";
    String s1 = " My Name";
    String s2 = s+s1;
    s1.print();



    return 0;
}

问题在于 operator+ 重载。如果查看主函数并更改 s 和 s1 的值,程序有时会崩溃,有时不会。任何想法为什么会发生?

4

2 回答 2

1

您的 strCopy 不会复制尾随的零字节。虽然它没有任何问题,但它有点违反直觉。

您的复制构造函数使用上面的 strCopy() 并且也不添加零字节,从而使复制的字符串未终止。这同样适用于赋值运算符。

您的连接运算符没有为尾随零字节分配足够的空间(但附加它)。程序崩溃是因为在分配的内存块之后放置了零字节。

于 2013-06-14T10:56:25.380 回答
0

不确定这是唯一的问题,但您需要返回*this您的const String& operator=(const String& rhs). 请在编译器中启用警告,它应该告诉您“到达函数末尾而不返回”。

于 2013-06-14T10:47:15.000 回答