C++默认的六个函数

本文详细介绍了C++中的六大特殊函数:构造函数、析构函数、拷贝构造函数、赋值运算符重载函数、取地址操作符的重载函数以及const修饰的取地址操作符的重载函数。讲解了它们的作用、使用场景以及注意事项,特别是浅拷贝问题和常量引用参数的使用原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(一)构造函数

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;
	}
}
*/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值