C++学习笔记(三)运算符重载

我们在C++中在进行某些运算符操作时功能更强大,使代码更简洁
一、基础知识
(一)、定义:对已有的运算符赋予多重的含义,使同一运算符作用于不同类型的数据时导致不同类型的行为。
(二)、目的:扩展C++中提供的运算符的适用范围,使之能作用于对象
(三)、
1、运算符重载的实质是函数重载。
2、可以重载为普通函数,也可以重载为成员函数
3、把含运算符的表达式转换成对运算符函数的调用

// 假设+已被重载,返回example类
a+b=>operator(a,b);
a+b=>a.operator(b);

4、把运算符的操作数转换成运算符函数的参数
5、运算符被多次重载时,根据实参的类型决定调用哪个运算符函数
(四)、
返回值类型 operator 运算符(形参表)
{

}
(五)、示例

class example
{
public:
	int i,j;
	example(int i,int j):i(i),j(j){};
	example operator+(const example & c);
}
example::example operator+(const example &c)
{
	i += c.i;
	j += c.j;
	return *this;
}
a+b =>a.operator+(b);

重载为成员函数时,参数个数为运算符目数减一
重载为普通函数时,参数个数是运算符目数
二、赋值运算符重载
在编程时有时会用到赋值运算符两边的类型不匹配依然想赋值,如int赋给complex对象(不是类型转换构造函数)或char * 类型的字符串赋值给一个字符串对象,此时就需要重载赋值运算符“=”
注:赋值运算符“=”只能重载为成员函数
demo

class example_str
{
private:
	char * str;
public:
	example_str(void){str = new char[1];str[0] = 0;}
	const char * re_str(void){return str;}
	example_str & operator= (const char * s);
	~example_str(void){delete [] str;}
};
example_str::example_str & operator=(const char * s)
{
	delete [] str;  // 清空str
	str = new char[strlen(s)+1];
	strcpy(str,s);
	return * this;  // 返回当前对象
}

(一)深拷贝与浅拷贝
浅拷贝:将两个对象的成员指针变量指到同一个区域,会造成内存泄漏。
深拷贝:当一个对象拷贝另一个对象时,会为该对象分配一片区域,将值拷贝过去,不会造成内存泄漏。
当没有
简单说:浅拷贝是指针拷贝,深拷贝是数据拷贝。
注:系统默认的拷贝构造函数就是浅拷贝
demo

example_str & operator=(const example_str& s)
{
	if (this == &s)
		return *this;
	delete [] str;
	str = new char[strlen(s.str)+1];
	strcpy(str,s.str);
	return *this;
}

问:为什么要用example & 而不用void example
答:理论上都可以。但根据运算符重载后,使用方式尽量不变,若重载为void,连续赋值是不行的;若为example类,假设有(a=b)=c,这样赋值a中是b,但是想是c。
三、运算符重载为友元函数:一般情况下,较好的选择是重载为类的成员函数,但有时,成员函数不够用,重载为普通函数,不能访问类的私有成员。
四、运算符重载的实际应用:这个没什么记的,就一个思路吧。就是有一个需求,我们要实现,把需求拆分开,一个很大的需求也是无数小功能组成的。
四、流插入,提取运算符的重载:
在用C++写代码时经常会用cout<<,cin>>;
这些移位运算符通过重载可以实现输出,输入的功能
cout是在iostream这个头文件中定义的ostream类的对象,<<,>>在iostream中进行了重载
五、重载类型转换运算符,自增,自减运算符
1、类型转换运算符,没有参数的重载运算符。
2、自增、自减运算符的重载:这个有前后之分,前置作为一元运算符重载。后置运算符为二元运算符重载,多写一个没用的参数。
例:

example operator++(example & e, int);  // 后置
example & operator++(example )  //前置
operator int(){return n;}  //**是否有必要明早测试下**

针对上面参数列表内的形参,是否是对象的引用是无所谓的,但是返回是不是引用(明天测试下
注:类型强制转换运算符被重载时不能写返回值类型,实际上其返回值类型就是该类型强制转换运算符代表的类型。
六、注意事项:
1、C++不允许定义新的运算符
2、重载后的运算符含义应该符合日常习惯
3、运算符重载不改变运算符优先级
4、“. .* :: ?: sizeof”以上运算符无法被重载
5、(),[],->,=运算符重载时,必需声明为累得成员函数。

发布了27 篇原创文章 · 获赞 3 · 访问量 1409

猜你喜欢

转载自blog.csdn.net/qq_42860166/article/details/103176230