#include <iostream>
using namespace std;
/* 使用动态内存分配的类,如使用了 new 关键字
* 需要显式析构函数,复制构造函数和赋值构造函数
*/
class classDMA{
private:
char * data;
public:
classDMA(const char *d = "default_value"); // 构造函数
classDMA(const classDMA & rs); // 复制构造函数
~classDMA(); // 析构函数
classDMA & operator=(const classDMA & rs);// 赋值构造函数
void showdata() const;
};
int main()
{
classDMA test1("test1");
test1.showdata(); // 显示 test1 数据
classDMA test2(test1);// 调用复制构造函数
test2.showdata(); // 显示 test2 数据
classDMA test3;
test3.showdata(); // 显示 test3 调用赋值构造前的数据
test3 = test1; // 调用赋值构造函数
test3.showdata(); // 显示 test3 调用赋值构造后的数据
return 0;
}
classDMA::classDMA(const char * d){
cout << this << "->构造函数"<< endl;
int len = strlen(d);
data = new char[len + 1];
strncpy(data, d, len);
data[len] = '/0';
}
classDMA::classDMA(const classDMA & rs){
cout << this << "->复制构造函数"<< endl;
int len = strlen(rs.data);
data = new char[len + 1];
strncpy(data, rs.data, len);
data[len] = '/0';
}
classDMA::~classDMA(){
cout << this << "->析构函数" << endl;
delete [] data;
}
classDMA & classDMA::operator=(const classDMA & rs){
if (this == &rs)
return *this;
cout << this << "->赋值构造函数" << endl;
delete [] data; // 先清理以前申请的内存
int len = strlen(rs.data);
data = new char[len + 1];
strncpy(data, rs.data, len);
data[len] = '/0';
return *this;
}
void classDMA::showdata() const{
cout << this << " data = " << data << endl;
}
-----------------------------------------------------------
winxp + codeblock 8.02 下编译通过
using namespace std;
/* 使用动态内存分配的类,如使用了 new 关键字
* 需要显式析构函数,复制构造函数和赋值构造函数
*/
class classDMA{
private:
char * data;
public:
classDMA(const char *d = "default_value"); // 构造函数
classDMA(const classDMA & rs); // 复制构造函数
~classDMA(); // 析构函数
classDMA & operator=(const classDMA & rs);// 赋值构造函数
void showdata() const;
};
int main()
{
classDMA test1("test1");
test1.showdata(); // 显示 test1 数据
classDMA test2(test1);// 调用复制构造函数
test2.showdata(); // 显示 test2 数据
classDMA test3;
test3.showdata(); // 显示 test3 调用赋值构造前的数据
test3 = test1; // 调用赋值构造函数
test3.showdata(); // 显示 test3 调用赋值构造后的数据
return 0;
}
classDMA::classDMA(const char * d){
cout << this << "->构造函数"<< endl;
int len = strlen(d);
data = new char[len + 1];
strncpy(data, d, len);
data[len] = '/0';
}
classDMA::classDMA(const classDMA & rs){
cout << this << "->复制构造函数"<< endl;
int len = strlen(rs.data);
data = new char[len + 1];
strncpy(data, rs.data, len);
data[len] = '/0';
}
classDMA::~classDMA(){
cout << this << "->析构函数" << endl;
delete [] data;
}
classDMA & classDMA::operator=(const classDMA & rs){
if (this == &rs)
return *this;
cout << this << "->赋值构造函数" << endl;
delete [] data; // 先清理以前申请的内存
int len = strlen(rs.data);
data = new char[len + 1];
strncpy(data, rs.data, len);
data[len] = '/0';
return *this;
}
void classDMA::showdata() const{
cout << this << " data = " << data << endl;
}
-----------------------------------------------------------
winxp + codeblock 8.02 下编译通过