若类中有指针型数据成员,类的几个函数的重写
来源:互联网 发布:北京铁路软件开发 编辑:程序博客网 时间:2024/05/27 20:46
当类中有指针成员变量时,类的构造函数,拷贝构造函数,赋值函数必须进行重写,以求为指针成员变量开辟独立的内存空间。
下面以赋值函数为例进行说明:
(1)对于类的赋值导致的构造函数需要重写的原因
进行讨论一番,如下:
Cname o1;
Cname o2(”ding”)//通过重载构造函数为该指针变量赋了初值
o1=o2;
以上程序段是不可以的,因为此时默认构造函数会使指针成员为空,由于对象o1中的指针没有指向任何内存空间,因此将数据拷贝到一个不存在的内存空间中,程序必然异常终止
(2)那么如何写带指针成员变量的类的构造函数和赋值函数呢?
class cname
{
public:
cname()
{
}
cname(char *str)
{
if(str==NULL)
{
//给指针变量开辟内存
strname = new char[1];
* strname =‘\0’;
}
else
{
strname =(char*)new char[strlen(str)+1];//
strcpy(strname,str);
}
}
~cname()
{
if(strname) delete []strname;
strname = NULL;
}
cname&operator= (cname &a)
{
if(strname)
{
delete []strname;
strname = NULL;
}
//以下就是关键,开辟空间来存放指针型数据成员
if(a.strname)
{
strname=(char*)new char[strlen(a.strname)+1];//
strcpy(strname,a.strname);
}
return *this;
}
public:
char *strname;
};
void main()
{
cname o1(“dd”);
cname o2("fghgffg");
o1=o2;
cout << o1.strname <<endl;
}
非常重要:此时,程序运行正确。但是当把cname o1(“dd”);改为cnameo1;时,程序会内存泄露。这是因为显示默认的构造函数会把strname置空,此时它不指向任何内存,故而会出错。
cname o1(“dd”);调用的是自己定义的构造函数,在那个构造函数中开辟一块内存给指针变量,所以则程序运行正常
- 若类中有指针型数据成员,类的几个函数的重写
- 类的数据成员指针和成员函数指针
- 指向类数据成员、类成员函数的指针
- 类成员函数的指针
- 类的成员函数指针
- 类的成员函数指针
- 类的成员函数指针
- 类成员函数的指针
- 指向类的数据成员和函数指针
- 指向类的数据成员和函数指针(转)
- 指向类的数据成员和函数指针
- C++指向类成员(数据、函数)的指针
- C++ 指向成员的指针(数据成员指针,函数成员指针)
- 成员函数的指针
- 成员函数的指针
- 学习笔记之类的数据成员指针和函数指针
- 类的成员变量偏移指针和成员函数指针
- 类的成员变量偏移指针和成员函数指针 .
- ere
- xshell无法在vim中复制黏贴
- cocos2d-x 中box2d 绘制线条帮助类
- ANSI、Unicode、UTF-8、DBCS等字符集及相关数据类型、函数的区别
- ASP.NET MVC3入门教程之第一个WEB应用程序
- 若类中有指针型数据成员,类的几个函数的重写
- Servlet 2014-3-3
- 继承
- Servlet(二)--session管理--HttpSession
- 谷歌反诉苹果微软专利联盟Rockstar
- JAVA面向对象思想
- Linux 杀死一个进程
- ios UITableView
- 数据存储-SharedPreferences(保存软件配置参数)