(一)构造函数
1.构造函数:CMyString(){}
(1)函数名与类名相同 无返回值
对象构造时系统自动调用相应的构造函数
构造函数可以重载 可以在类内或者类外定义(指定作用域即可)
(2)初始化列表比函数内初始化更高效
对于自定义类型,在初始化时系统会自动生成初始化列表,即系统会先走一遍初始化列表,
然后在调用函数体内的初始化,也就是初始化了两遍;所以初始化列表更快速
(3)const修饰的常量,必须在定义时初始化
引用变量,必须在定义时初始化 并且只能初始化一次
没有缺省构造函数的自定义的成员变量
(4)应用程序可以自己提供构造函数,如果不提供 系统将调用默认的构造函数
在初始化对象的成员变量时,要注意在堆上分配内存的情况
(二)析构函数
2.析构函数:~CMyString(){}
函数名与类名相同 无返回值 无参数列表
在函数名前加上'~'字符
析构函数主要是清理对象所占用的额外资源,而不是对象的内存空间
系统会在return之后自动调用析构函数 在出“}”时属于主函数栈帧回退
析构函数不能重载
(三)拷贝构造函数
3.拷贝构造函数CMyString(const CMyString& rhs ){}
(1)用同类型已经存在的对象构造同类型的新的对象
(2)如果默认的拷贝构造函数会发生浅拷贝现象 需要自己提供
(3)拷贝构造函数参数不能值传递,必须传引用
(4)值传参的循环递归 CMyString(const CMyString rhs )
调用函数的步骤:先初始化形参,传形参;
调用函数
eg:CMyString str1 = str2 --->CMyString str1(str2);
初始化形参:CMyString rhs = str2;
调用函数:CMyString(CMyString rhs);
初始化形参:CMyString rhs = str2;
调用函数:CMyString(CMyString rhs);
一直循环死递归下去;
(5)传引用CMyString(const CMyString& rhs ){}
eg:CMyString str1 = str2 --->CMyString str1(str2);
引用str2对象,this指针指向新生成的对象str1,将引用的对象的内容拷贝一份给this指针指向的新对象
(6)拷贝构造函数要避免浅拷贝现象
eg:CMyString str1 = str2
str2和str1都指向同一块内存 如果两者中任意一个提前释放资源,都会造成另一个成为野指针
(7)系统默认会提供 但是涉及到浅拷贝时需要应用程序自己提供
(8)传参传const的原因:不修改引用的对象的内容
(四)赋值运算符重载函数
4.赋值运算符重载函数:CMyString& operator=(const CMyString& rhs)
(1)用同类型已经存在的对象赋值给另一个已经存在且类型相同的对象
(2)如果默认的赋值运算符重载函数会发生浅拷贝现象 需要自己提供
(3)五个不支持的运算符重载:sizeof/::/?:/./.*
(4)运算符重载后不能改变运算符的优先级和结合性
(5)传参传const的原因:不修改引用的对象的内容
(五)取地址操作符的重载函数
CMyString *operator&(){return this;}
(六)const修饰的取地址操作符的重载函数
const CMyString* opreator&()const{return this;}
代码示例如下:
//代码如下:C++默认的六个函数
/*
class CMyString
{
public:
CMyString( char *pdata = NULL);
CMyString(const CMyString& str);
CMyString& operator = (const CMyString &str);
~CMyString(void);
CMyString* operator &()
{
return this;
}
const CMyString* operator &()const
{
return this;
}
void Show()
{
cout<<"data ::"<<m_pdata<<endl;
}
private:
char *m_pdata;
};
//构造函数
CMyString::CMyString( char *pdata )
{
cout<<"CMyString()"<<endl;
m_pdata = new char[strlen(pdata)+1]; //还要有存放'\0'的位置
strcpy(m_pdata,pdata);
}
//拷贝构造函数:用同类型已经存在的对象构造同类型的新对象
CMyString::CMyString(const CMyString& str)
{
cout<<"CMyString(const CMyString& str)"<<endl;
m_pdata = new char[strlen(str.m_pdata)+1];//防止浅拷贝 重新开辟空间存放新对象的内容
strcpy(m_pdata,str.m_pdata);//str和this指针指向的对象共享拷贝构造函数
}
//赋值运算符重载函数:用一个同类型已经存在的对象复制给另一个同类型已经存在的对象
CMyString& CMyString:: operator = ( const CMyString &str)
{
cout<<"CMyString& operator="<<endl;
if( this == &str)
return *this;
delete []m_pdata;
m_pdata = NULL ;
m_pdata = new char[strlen(str.m_pdata)+1];
strcpy(m_pdata,str.m_pdata);
return *this ;
}
//析构函数:释放对象所占用的额外资源 比如堆上资源
CMyString::~CMyString()
{
cout<<"~CMyString"<<endl;
if(m_pdata != NULL)
{
delete []m_pdata;
}
}
*/