鱼C论坛

 找回密码
 立即注册
查看: 2833|回复: 2

[技术交流] 各种构造函数,可以学习。

[复制链接]
发表于 2014-2-22 16:32:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
具体的我就不解释了,运行一下大家就会明白这个小程序的教学意义了。~帮助理解构造函数、按值传递
#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::strlen (cstr) + 1];
                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 [len + 1];
        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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-2-22 16:53:53 | 显示全部楼层
C++比C烦 ,幕后工作太多
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-23 07:10:03 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 18:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表