andalousie 发表于 2014-2-22 16:32:56

各种构造函数,可以学习。

具体的我就不解释了,运行一下大家就会明白这个小程序的教学意义了。~帮助理解构造函数、按值传递
#include <iostream>
#include <cstring>

class StringVal
{
        friend StringVal operator+ (StringVal const &v1, StringVal const &v2);
public:
        StringVal (char const * cstr)
                :_buf (0)
        {
                std::cout << "Constructor taking char * "
                                  << cstr << std::endl;
                Init (cstr);
        }
        StringVal (StringVal const & str)
                :_buf (0)
        {
                std::cout << "Copy constructor "
                                  << str.c_str () << std::endl;
                Init (str.c_str ());
        }
        ~StringVal ()
        {
                std::cout << "Destructor of " << _buf << std::endl;
                delete _buf;
        }
        StringVal & operator= (StringVal const & str);
        char const * c_str () const { return _buf; }
private:
        StringVal () : _buf (0) {}
        void Init (char const * cstr)
        {
                _buf = new char ;
                std::strcpy (_buf, cstr);
        }
private:
        char* _buf;
};

StringVal & StringVal::operator= (StringVal const & str)
{
        std::cout << "Operator = " << str.c_str () << std::endl;
        if (this != &str)
        {
                if (std::strlen (_buf) < std::strlen (str.c_str ()))
                {
                        delete _buf;
                        Init (str.c_str ());
                }
                else
                        std::strcpy (_buf, str.c_str ());
        }
        return *this;
}

inline StringVal operator+ (StringVal const &v1, StringVal const &v2)
{
        std::cout << "operator + (" << v1.c_str () << ", "
                << v2.c_str () << ")\n";
               
        StringVal result; // empty
        int len = std::strlen (v1._buf) + std::strlen (v2._buf);
        char * buf = new char ;
        std::strcpy (buf, v1.c_str ());
        std::strcat (buf, v2.c_str ());
        result._buf = buf;
        std::cout << "Returning by value\n";
        return result;
}

StringVal ByValue ();

StringVal ByValue ()
{
        StringVal str ("Bar");
        return str;
}

int main ()
{
        StringVal str ("Foo");
        str = ByValue ();
        StringVal concat = str + "tosz";
        return 0;
}

oggplay 发表于 2014-2-22 16:53:53

C++比C烦 ,幕后工作太多

andalousie 发表于 2014-2-23 07:10:03

oggplay 发表于 2014-2-22 16:53 static/image/common/back.gif
C++比C烦 ,幕后工作太多

的确有点道理,但是我觉得用于实现比较复杂的结构,C++反而容易一些。
页: [1]
查看完整版本: 各种构造函数,可以学习。