Firstly here is my code:
header:
#pragma once
#include <iostream>
using namespace std;
class CString
{
private://Main attribute
    char* str;
private:// Aux attribute
    int len;
public:
//constructor and destructor
    CString(char* x);
    CString() { len = 0; str = NULL; }
    ~CString() 
    {
        if (NULL != str) 
            delete[] str;
        str = NULL;
    }
//some operator
    CString operator+(CString x);
    CString operator+(char* x);
    void operator=(CString x);
//operator() is to extract a part of other CString object
    CString operator()(unsigned pos, unsigned c_len);
//operator[] return position of CString::str[pos]
    char& operator[](unsigned pos);
//Ostream output
    friend ostream& operator<<(ostream& os, CString x);
};
//to do char+CString
CString operator+(char* a, CString x);
header cpp code:
#include "CString.h"
CString::CString(char * x)
{
    len = 0;
    while(x[len])
        len++;
    str = new char[len];
    for (int i = 0;i < len;i++)
        str[i] = x[i];
    if (str[len - 1] != '\0')
    {
        len++;
        char* tmp;
        tmp = new char[len];
        for (int i = 0;i < len - 1;i++)
            tmp[i] = str[i];
        delete[]str;
        str = tmp;
        tmp = NULL;
        str[len - 1] = '\0';
    }
}
CString CString::operator+(CString x)
{
    CString* result;
    result = new CString;
    result->len = this->len + x.len - 1;
    result.str=new char[result.len];
    for (int i = 0; i < this->len - 1;i++)
    {
        result->str[i] = this->str[i];
    }
    for (int i = 0, j = this->len - 1;i < x.len;i++, j++)
    {
        result->str[j] = x.str[i];
    }
    return *result;
}
CString CString::operator+(char * x)
{
    return CString(*this+CString(x));
}
void CString::operator=(CString x)
{
    str = new char[x.len];
    for (int i = 0; i < x.len;i++)
        str[i] = x.str[i];
    len = x.len;
}
CString CString::operator()(unsigned pos, unsigned c_len)
{
    CString* result;
    result = new CString;
    result->len = c_len;
    result.str=new char[c_len];
    for (int i = pos;i < pos + c_len;i++)
        result->str[i - pos] = str[i];
    return *result;
}
char& CString::operator[](unsigned pos)
{
    if (pos < len - 1)
    {
        char* ptr;
        ptr = this->str + pos;
        return *ptr;
    }
    else
    {
        int o_len = len;
        len = pos + 2;
        char* tmp;
        tmp = new char[len];
        for (int i = 0;i < o_len;i++)
        {
            tmp[i] = str[i];
        }
        tmp[len - 1] = '\0';
        delete[]str;
        str = tmp;
        tmp = NULL;
        return *(str + pos);
    }
}
ostream & operator<<(ostream & os, CString x)
{
    os << x.str;
    return os;
}
CString operator+(char * a, CString x)
{
    return CString(CString(a) + x);
}
main:
            CString a("string 1"), b = "Initialize " + a;
            b[15] = '2'; cout << a + " - " + b << endl;
            CString c = a + b;
            cout << "String extracted from string \"" << c
                << "\" from position 3 with length of 6 is: \""
                << c(3, 6) << "\"" << endl;
Problem:
When I try to compile this program, there is no error, but still operator+(CString), operator(), and destructor seem to malfunction. 
When I debug this program, my program triggered a breakpoint some where at line CString a("String 1"), b = "initilize " + a; I have no idea why. I am do not know if there is any problem for the rest of the program because I always get stuck at that line. SO if somebody can find out any other problem, please tell me, that will save me another day. 
Btw, I just wonder at operator+(CString) and operator(), I have create a pointer then I use new and then I return that pointer, so that I have no change to delete that pointer, will it leave me an orphan memory? Since I have read another question about return a class object, I found out that if I use CString result and then return result, result would be destroyed before return. SO is there any better way to do that?
Summary:
1.My program triggered a breakpoint some where in the second line of main().
2.How to properly return a class object?
P.S: I am really bad at communicating and just have 1 year period of C/C++ learning. So if I have type some thing could give you a cancer, please forgive me.
Sincerely thank you.
 
    