zoukankan      html  css  js  c++  java
  • 一个C++的有意思的例子

    最近为了学习QT,重新学习C++,拿起了厚厚的《C++ Primer Plus(第6版)》

    第12章:类与动态内存分配

    Stringbad.h

    #pragma once
    #include <iostream>
    class Stringbad
    {
    private:
        char* str;
        int len;
        static int num_strings;
    public:
        Stringbad(const char* s);    
        Stringbad();
        ~Stringbad();    
        friend std::ostream& operator<<(std::ostream& os, const Stringbad& st);
        //Stringbad& operator=(const Stringbad& st);
        //Stringbad(const Stringbad& st);
    };

    strngbad.cpp

    #include "strngbad.h"
    #include <cstring>
    
    using std::cout;
    int Stringbad::num_strings = 0;
    
    Stringbad::Stringbad(const char* s) {
        len = std::strlen(s);
        str = new char[len + 1];
        std::strcpy(str, s);
        num_strings++;
        cout << num_strings << ":"" << str << "" object created
    ";
    }
    
    Stringbad::Stringbad() {
        len = 4;
        str = new char[4];
        std::strcpy(str, "C++");
        num_strings++;
        cout << num_strings << ":"" << str << "" default object created
    ";
    }
    
    Stringbad::~Stringbad() {
        cout << """ << str << "" object deleted,";
        --num_strings;
        cout << num_strings << " left
    ";
        delete[] str;
    }
    
    std::ostream& operator<<(std::ostream& os, const Stringbad& st) {
        os << st.str;
        return os;
    }
    /*
    Stringbad& Stringbad::operator=(const Stringbad& st) {
        cout << "object assign " << st.str << std::endl;
        if (this == &st)
            return *this;
        delete[] str;
        len = st.len;
        str = new char(len + 1);
        std::strcpy(str, st.str);
        return *this;
    }
    
    Stringbad::Stringbad(const Stringbad& st) {
        len = st.len;
        str = new char[len + 1];
        std::strcpy(str, st.str);
        num_strings++;
        cout << num_strings << ":"" << str << "" object copy.
    ";
    }
    */
    strngbad.cpp

    看似没有问题的类定义,如下测试

    #include <iostream>
    #include <string>
    #include "Stock.h"
    #include "strngbad.h"
    
    void callme1(Stringbad&);
    void callme2(Stringbad);
    
    int stonetolb(int st) {
    
        return 14 * st;
    }
    using std::cout;
    int main()
    {    
        using std::endl;     
        {
            cout << "String an inner block.
    ";
            Stringbad headline1("Celera Stalks at Midnight");
            Stringbad headline2("Lettuce Prey");
            Stringbad sports("Spinach Leaves Bowl for Dollars");
    
            cout << "headline1:" << headline1 << endl;
            cout << "headline2:" << headline2 << endl;
            cout << "sports:" << sports << endl;
    
            callme1(headline1);
            cout << "headline1:" << headline1 << endl;
            callme2(headline2);
            cout << "headline2:" << headline2 << endl;
            cout << "Initialize one object to another:
    ";
            Stringbad knot;
            knot = headline1;
            cout << "knot: " << knot << endl;
            cout << "Exiting the block.
    ";
        }
        cout << "End of main()
    ";
        return 0;
    }
    
    void callme1(Stringbad& rsb) {
        cout << "String passed by reference:
    ";
        cout << "     "" << rsb << ""
    ";
    }
    
    void callme2(Stringbad rsb) {
        cout << "String passed by reference:
    ";
        cout << "     "" << rsb << ""
    ";
    }
    main.cpp

    结果,又是负数,又是乱码。以下是我的vs.net2019的运行结果,因为是异常退出,且输出的结果有时会少了一行,所以以下截图看不到-1的结果

     

    上面的代码你会发现我注释了部分代码,恢复后,你会发现程序死得更早。因为在赋值函数如此创建的数组

    str = new char(len + 1);

    而如此delete

    delete [] str;

  • 相关阅读:
    MySQL 你好,死锁
    Python+Scrapy+Selenium数据采集
    令牌桶限频(Token Bucket)
    Go 逃逸分析
    ElasticSearch 连载二 中文分词
    ElasticSearch 连载一 基础入门
    基于GitLab CI搭建Golang自动构建环境
    Go 性能分析之案例一
    MySQL InnoDB 行记录格式(ROW_FORMAT)
    MySQL InnoDB 逻辑存储结构
  • 原文地址:https://www.cnblogs.com/kevin-Y/p/12761259.html
Copyright © 2011-2022 走看看