Offer题1~3 重载=&指针和数组&二维数组替换

本文讨论了C++中赋值运算符函数的设计,强调了返回引用和使用常量引用参数的重要性。同时,介绍了如何区分数组和指针,以及在二维数组中进行查找的方法。在处理连续赋值时,文章提到了异常安全性的最佳实践。此外,还涵盖了检查二维数组参数有效性的方法和从特定方向进行查找的策略。

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

  1. 赋值运算符函数(P24)(面试题一)
  2. 数组和指针的区别(P37)& VS输出double会自动四舍五入
  3. 二维数组中的查找(P38)(面试题三)

这几个题比较简单,没什么好说,就只贴注意点和代码吧
1.赋值运算符函数(P24)(面试题1)
题目:如下类型CMyString的声明,请为该类型添加赋值运算符函数
注意点如下:
  • 返回一个引用,才能连续赋值str1=str2=str3
  • 传入参数类型声明为常量引用,既是为了避免调用复制构造函数,又是为了避免改变参数
  • 判断传入参数和当前实例(*this)是不是同一个实例,避免释放自身
  • 【创建临时实例,交换临时实例和原来的实例】或【先释放空间再new】前者符合异常安全性原则,避免先delete后new分配空间异常使CMyString实例不再保持有效状态
  • 出if后,会自动调用析构函数释放临时实例,但指针却无法自动释放
class CMyString
{
public:
	CMyString(char* pData = NULL);
	CMyString(const CMyString& str);
	~CMyString();
	CMyString& operator =(const CMyString&);
private:
	char* m_pData;
};
CMyString& CMyString::operator=(const CMyString& str)
{
	//if(this != &str) //写法二
	//{
	//	//先释放空间,避免内存泄露
	//	delete []m_pData;
	//	m_pData=NULL;
	//	//再申请空间,strlen返回字符长度,不包括结束符\0
	//	m_pData=new char[strlen(str.m_pData)+1]; 
	//	strcpy(m_pData,str.m_pData);
	//}
	if(this != &str) //避免将自身空间释放
	{
		//构造出一个新对象,在出if后会自动释放,相当于自动new+delete
		CMyString istrTemp(str); 
		//交换空间
		char *cpTemp=istrTemp.m_pData; 
		istrTemp.m_pData=m_pData;//要释放的空间
		m_pData=cpTemp; //要赋值的空间
	}
	return *this;
} 
测试用例:
  • 把一个CMyString实例赋值给另一个实例
  • 把一个CMyString实例赋值给自己
  • 连续赋值
2.数组和指针的区别(P37)& VS输出double会自动四舍五入
#include<iostream>
using namespace std; 
int GetSize(int data[])
{return sizeof(data);}//以字节为单位,1字节=8bit}
int main()
{
	//data1是数组,求数组大小=int(4字节)*5=20
	int data1[]={1,2,3,4,5};
	cout<<sizeof(data1)<<endl;  
	//data2是指针,32位系统中,指针固定为4字节
	int* data2=data1;
	cout<<sizeof(data2)<<endl;
	//作为参数传递,data1退化为int型指针,4字节
	cout<<GetSize(data1)<<endl;
	return 0;
}

#include<iomanip>
int main()
{
	double dTemp=100000.5;
	cout<<dTemp<<endl;
	cout<<setiosflags(ios::fixed)
		//<<setiosflags(ios_base::showpoint)
		<<setprecision(2)
		<<dTemp<<endl;
}
3.二维数组中的查找(P38)(面试题3)
题目:在一个二维数组中,每行都按照从左到右递增的顺序排列,每一列都按照从上到下的顺序递增的顺序排列。完成函数:输入一个这样的二维数组和一个整数,判断数组中是否含有该整数。
注意点如下:
  • 函数原型bool find(int* , int row,int column,int key)判断传入的【二维数组】是否为NULL,nROWs是否>0,【判断每个输入参数是否合法】
  • 从【右上】或【左下】开始比较,目的是>或<key都可以排除一整行或一整列
bool find(int *ngMatrix,int nRows,int nColumns,int key)
{
	if(ngMatrix!=NULL && nRows>0 && nColumns>0)
	{
		int Row=0,Col=nColumns-1; //从右上角开始比较
		while(Row<nRows && Col>=0)//只取右上角的元素比较
		{
			if(key == ngMatrix[Row*nColumns+Col])
				return true;
			else if(key < ngMatrix[Row*nColumns+Col])
				--Col;
			else
				++Row;
		}
	}
	return false;
}
int main()
{
	int key=0;
	int ngArray[4][4]={
		{1,2,8,9},
		{2,4,9,12},
		{4,7,10,13},
		{6,8,11,15}
	};
	if(find(ngArray[0],4,4,key))
		cout<<"找到了!"<<endl;
	else
		cout<<"找不到……"<<endl;
}
测试用例:
  • 查找二维数组中包含的数X(Max、Min、Min<X<Max)
  • 查找二维数组中不包含的数X(>Max、<Min、Min<X<Max)
  • 特殊输入,如NULL 或 nRows<0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值