最近为了学习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\n";
}

Stringbad::Stringbad() {
    len = 4;
    str = new char[4];
    std::strcpy(str, "C++");
    num_strings++;
    cout << num_strings << ":\"" << str << "\" default object created\n";
}

Stringbad::~Stringbad() {
    cout << "\"" << str << "\" object deleted,";
    --num_strings;
    cout << num_strings << " left\n";
    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.\n";
}
*/
strngbad.cpp

相关文章: