c语言能重写构造函数 构造函数constructor可以被重写override( 三 )


然而,有些情况下,当需要释放非托管资源时,就必须通过写代码的方式来解决 。通常是使用析构函数释放非托管资源,将用户自己编写的释放非托管资源的代码段放在析构函数中即可 。需要注意的是,如果一个类中没有使用到非托管资源,那么一定不要定义析构函数,这是因为对象执行了析构函数,那么"垃圾回收器"在释放托管资源之前要先调用析构函数 , 然后第二次才真正释放托管资源 , 这样一来,两次删除动作的花销比一次大多的 。下面使用一段代码来示析构函数是如何使用的:
public class ResourceHolder
{
~ResourceHolder()
{
// 这里是清理非托管资源的用户代码段
}
}
四.小结
构造函数与析构函数虽然是一个类中形式上较简单的函数,但它们的使用决非看上去那么简单,因此灵活而正确的使用构造函数与析构函数能够帮你更好的理解CLR的内存管理机制 , 以及更好的管理系统中的资源 。
如何用c语言实现CString的构造函数 , 析构函数和赋值函数类是编程人员表达自定义数据类型的C++机制 。它和C语言中的结构类似,C++类
支持数据抽象和面向对象的程序设计 , 从某种意义上说,也就是数据类型的设
计和实现 。
那么
String
类的原型如下
class
String
{
public:
String(const
char
*str=NULL);
//构造函数
String(const
String
other);
//拷贝构造函数
~String(void);
//析构函数
String
operator=(const
String
other);
//等号操作符重载,赋值函数
ShowString();
private:
char
*m_data;
//字符指针
};
String::~String()
{
delete
[]
m_data;
//析构函数,释放地址空间
}
String::String(const
char
*str)
{
if
(str==NULL)//当初始化串不存在的时候 , 为m_data申请一个空间存放'/0';
{
m_data=https://www.04ip.com/post/new
char[1];
*m_data='https://www.04ip.com/0';
}
else//当初始化串存在的时候,为m_data申请同样大小的空间存放该串;
{
int
length=strlen(str);
m_data=https://www.04ip.com/post/new
char[length+1];
strcpy(m_data,str);
}
}
String::String(const
String
other)//拷贝构造函数,功能与构造函数类似 。
{
int
length=strlen(other.m_data);
m_data=https://www.04ip.com/post/new
[length+1];
strcpy(m_data,other.m_data);
}
String
String::operator
=(const
String
other)
//赋值函数
{
if
(this==other)//当地址相同时,直接返回;
return
*this;
delete
[]
m_data;//当地址不相同时,删除原来申请的空间,重新开始构造;
int
length=sizeof(other.m_data);
m_data=https://www.04ip.com/post/new
[length+1];
strcpy(m_data,other.m_data);
return
*this;
}
String::ShowString()//由于m_data是私有成员,对象只能通过public成员函数来访问;
{
coutthis-m_dataendl;
}
测试一下:
main()
{
String
AD;
char
*
p="ABCDE";
String
B(p);
AD.ShowString();
AD=B;
AD.ShowString();
}
C语言为什么可以重写标准库函数?这个问题是一个好问题,我之前也没思索过或者尝试过,
首先我们弄清楚一件事,函数声明可以放在任何头文件,实现可以放在任何实现该函数的源文件中,那么就存在一个问题:

推荐阅读