五千年(敝帚自珍)

主题:【原创】编程心得 -- 荆棘探兴

共:💬198 🌺258
分页树展主题 · 全看首页 上页
/ 14
下页 末页
      • 家园 你这个问题充分说明了C++是一种比较复杂的语言

        像我这样多年没写程序的,用C写几个函数还很自然,但C++的语法和各种定义实在有点头大了。

        int strlen(char* psz)

        {

        int len = 0;

        while (*psz++)

        ++len;

        return len;

        }

        char* strcpy(char* dst, char* source)

        {

        char* p = dst;

        while (*dst++ = *source++) ;

        return p;

        }

        char* strcat(char* s1, char* s2)

        {

        char* p = s1;

        while (*s1)

        ++s1;

        while (*s1++ = *s2++);

        return p;

        }

        class string

        {

        public:

        string();

        string(char* psz);

        string(const string& str);

        ~string();

        string& operator=(const string& str);

        int length();

        char* get_str();

        private:

        char* m_pBuffer;

        };

        int string::length()

        {

        return strlen(m_pBuffer);

        }

        char* string::get_str()

        {

        return m_pBuffer;

        }

        string::string() : m_pBuffer(0)

        {

        }

        string::string(char* psz) : m_pBuffer(0)

        {

        if (psz) {

        int len = strlen(psz);

        m_pBuffer = (char*)::malloc(len+1);

        strcpy(m_pBuffer, psz);

        }

        }

        string::string(const string& str) : m_pBuffer(0)

        {

        if (str.m_pBuffer) {

        m_pBuffer = (char*)::malloc(str.length()+1);

        strcpy(m_pBuffer, str.m_pBuffer);

        }

        }

        string& string::operator=(const string& str)

        {

        if (this != &str) {

        ::free(m_pBuffer);

        m_pBuffer = 0;

        m_pBuffer = (char*)::malloc(strlen(str.m_pBuffer)+1);

        strcpy(m_pBuffer, str.m_pBuffer);

        }

        return *this;

        }

        string::~string()

        {

        if (m_pBuffer) {

        ::free(m_pBuffer);

        m_pBuffer = 0;

        }

        }

        string operator+(const string& s1, const string& s2)

        {

        char* pBuffer = (char*)::malloc(s1.length() + s2.length() + 1);

        strcpy(pBuffer, s1.get_str());

        strcat(pBuffer, s2.get_str());

        string s(pBuffer);

        ::free(pBuffer);

        return s;

        }

        • 家园 感谢参与!建议你看一下我推荐的书,

          如果你还对c++感兴趣的话,尤其是后两本。

          看得出你是有一定的编程经验的,你的代码避免了很多程序员很容易犯的错误。 我发现的大问题有:

          1. 从你的代码中看得出你是允许使用者用0指针的,而且你的string类缺省的内部就是0指针。可是你的strlen、strcpy、strcat都不能正确处理0指针(实际上库函数也不能)。这样如果用户的代码是

          string s1,s2,s3=s1+s2;

          程序就会崩溃。

          2. c++程序里一般地说是不应该有malloc/free这两个库函数的。 你的程序里用这两个函数还会导致一个问题:当内存分配失败的时候malloc会返回0。而由于问题1,0指针会导致程序失败。

          还有其他的一些小毛病,比如+函数里的内存使用有点笨拙,const可以再多用一些,get_str()破坏了封装,尤其是没有用const的时候。

      • 家园 think in c++ 不好

        他那一系列的 think 都不好,初学者不合适,高手也不合适。

        看 C++ Primer

        • 家园 太厚了

          你在现实中知道谁是看那个入门的吗?

          • 家园 看着厚

            实际上是循序渐进的,你自己看就知道了。我就是看这个入门的。

            相反,think倒是跟百科全书似的,什么都想讲,超不适合做入门数。

            • 家园 thinking系列的书全部都是不高不低的

              入门太深, 入了们以后想深入又太潜了。也就是以前书少,矮子里拔将军。

            • 家园 佩服佩服

              一共看了多少天?

              • 家园 断断续续看了两个多月

                看这本书不是要从头看到尾,兄弟就是上来看class的,太好奇了。

                然后再回头看前几章,最后几章到现在也没看。

      • 家园 设计模式那本书也不错。

        这道题好熟悉,被面过。

        • 家园 design pattern 不算是针对c++程序员的

          他的对象更广一些,不只是是c++。

          个人认为那本书写的不好,语言枯涩是个很大的问题,而且只有进行系统设计有了一定实际经验之后看这本书才有效,适合于总结而不适合于提高,后者应该找一些可读性更强的书。

          而且对于狭义的程序员这个层次来说,用处不是很大。

          • 家园 dp 不是给没有经验的人看的

            本来就是给至少有5年以上OO开发经验的人看的。 现在国内热炒模式,导致大量初级程序员翻了几本书就一堆anti-pattern的代码,头大的很。

      • 家园 谢谢推荐,献花。
    • 家园

      这个“强迫症后期”,我现在还有

      当年FORTRAN我学的不怎么样。后来转学美国,教C语言的那位美国教授上课很生动,我就喜欢上编程了。经常是作业发下来晚上睡不着觉,好几次在梦里想到方法半夜爬起来写程序。几乎都是在助教(在习题课)给提示之前就完成作业。

      现在我睡觉前尽量不想程序,否则还是可能几个小时睡不着--惭愧,工作10年了还这样。。。

      • 家园 花 梦里想到方法。

        俺要么不做梦,要么做梦就做那些乱八七杂的。

        俺晚上的工作效率不高,保证睡眠为第一任务。

        工作尽量在白天搞定。。

    • 家园 我虽然不是程序员,但是也要用C来编程进行课题研究。

      非常同意下面的观点,我如果怎么找不出问题,就去公园,逛街或运动。

      如果怎么也找不到问题,不妨放几天,事缓则圆,几天后说不定会“幕然回首,那人却在灯火阑珊处” 。

分页树展主题 · 全看首页 上页
/ 14
下页 末页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河