文档介绍:提要
本章介绍对类使用动态分配技术,以及由此引起的问题的处理。
动态内存的使用将影响构造函数,析构函数的设计和操作符的重载
动态内存和类
一个使用动态内存的例子
class StringBad
{
private:
char * str; // pointer to string
int len; // length of string
static int num_strings; // number of objects
public:
StringBad(const char * s); // constructor
StringBad(); // default constructor
~StringBad(); // destructor
// friend function
friend std::ostream & operator<<(std::ostream & os,
const StringBad & st);
};
以下是其实现()
静态类成员的初始化
int StringBad::num_strings = 0; ///注意:
静态类成员位于静态存储区,并不是类对象的组成部分;
在类声明中声明,不可初始化(静态const整型或枚举除外除外);
在类方法实现文件中初始化。使用类型名和定义域限制操作符,不用关键字static。
然后是构造函数
StringBad::StringBad(const char * s)
{
len = std::strlen(s); // set size
str = new char[len + 1]; // allot storage
std::strcpy(str, s); // initialize pointer
num_strings++; // set object count
cout << num_strings << ": \"" << str
<< "\" object created\n"; // For Your Information
}
注意:字符串并没有保存在对象中,而是在单独的堆内存中。对象中存储字符串的地址。
析构函数
StringBad::~StringBad() // necessary destructor
{
cout << "\"" << str << "\" object deleted, "; // FYI
--num_strings; // required
cout << num_strings << " left\n"; // FYI
delete [] str; // required
}
此处析构函数是必须的。在构造函数中用new分配内存,必须在析构函数中用delete释放内存
。其中定义了两个函数:一个传引用作参数,一个传值作参数
void callme1(StringBad & rsb)
{
cout << "String passed by reference:\n";
cout << " \"" << rsb << "\"\n";
}
void callme2(StringBad sb)
{
cout << "String passed by value:\n";
cout << " \"" << sb << "\"\n";
}
1: "Celery Stalks at Midnight" object created
2: "Lettuce Prey" object created
3: "Spinach Leaves Bowl for Dollars" object created
headline1: Celery Stalks at Midnight
headline2: Lettuce Prey
sports: Spinach Leaves Bowl for Dollars
String passed by reference:
"Celery Stalks at Midnight"
headline1: Celery Stalks at Midnight
String passed by value:
"Lettuce Prey"
"Lettuce Prey" object deleted, 2 left
headline2: 葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺
Initialize one object to another:
sailor: Spinach Leaves Bowl for Dollars
Assign one object to a