C++Primer Plus书之--C++动态内存和类, 复制构造函数和赋值运算符

从一个例子开始:

// 第一个文件
// stringbad.h
#include 
#ifndef STRINGBAD_H_
#define STRINGBAD_H_

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);
};

#endif

第二个文件:

// stringbad.cpp
#include 
#include "stringbad.h"

using std::cout;
using std::endl;

// 初始化类的静态成员
int StringBad::num_strings = 0;

// 构造函数
StringBad::StringBad(const char* s)
{
	len = std::strlen(s);
	str = new char(len + 1);
	// 初始化指针str
	std::strcpy(str, s);
	num_strings++;
	cout << num_strings << ": " << str << " object created" << endl;
}

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

// 析构函数
// 这个是必要的, 因为在析构函数中对new申请的内存进行了释放
StringBad::~StringBad()
{
	cout << str << " object deleted, ";
	--num_strings;
	cout << num_strings << " left" << endl;
	delete[] str;
}

// 重载了<<运算符, 友元函数
std::ostream & operator<<(std::ostream & os, const StringBad &st)
{
	os << st.str;
	return os;
}

要注意下面这句话

int StringBad::num_strings = 0;

要注意不能在类声明中初始化静态成员变量(类声明位于头文件中, 程序可能将头文件包含在多个文件中, 如果在头文件中进行初始化, 将出现多个初始化语句副本, 但是如果静态成员是整型或者枚举类型const 则可以在类声明中初始化), 这是因为声明描述了如何分配内存, 但并不分配内存. 对于静态类成员, 可以在类声明之外单独使用语句来进行初始化, 这是因为静态类成员是单独存储的, 而不是对象的组成部分. 注意初始化语句指明了类型, 并用了作用域运算符, 但没有使用关键字static

 

之所以使用下面的语句:

你可能感兴趣的:(C++,C,复制构造函数,C,赋值运算符,C,动态内存分配,类和动态内存分配)