c++重载运算符注意
c++重载运算符的时候加&或不加:
如果加了&表示引用,说明用的都是同一块内存。如果不加,那么用的就是一份拷贝,即不同的内存。
一般连续操作的时候要加&。
可以重新定义一个对象,然后返回这个对象,这样就不会改变当前对象的值;也可以直接在当前对象
上进行操作,返回*this,这样会改变当前对象的值。
这个代码能说明我想说的。
#include<iostream>
#include<Windows.h>
using namespace std;
class Sample{
private:
int *p,len;
public:
Sample(){len=;}
Sample(int *a,int l);
Sample(Sample &fp); Sample operator = (Sample);
Sample operator + (Sample);
bool operator == (Sample);
Sample& operator ++ ();
Sample operator ++ (int);
~Sample(){
if(len)
delete[] p;
}
void display()
{
for(int i=;i<len;i++)
cout<<p[i]<<" ";
cout<<endl;
}
};
Sample::Sample(int *a,int l)
{
int i;
len=l;
p=new int[l];
for(i=;i<len;i++)
p[i]=a[i];
}
Sample::Sample(Sample &fp)
{
p=new int[fp.len];
len=fp.len;
for(int i=;i<len;i++)
p[i]=fp.p[i];
}
bool Sample::operator == (Sample t)
{
if(len==&&t.len==)
return true;
if(len!=t.len)
return false;
for(int i=;i<len;i++)
{
if(p[i]!=t.p[i])
return false;
}
return true;
}
Sample Sample::operator = (Sample t)
{
p=new int[t.len];
len=t.len;
for(int i=;i<len;i++)
p[i]=t.p[i];
return *this;
}
Sample& Sample::operator ++ ()
{
for(int i=;i<len;i++)
p[i]++;
return *this;
}
Sample Sample::operator ++ (int)
{
Sample old=*this;
++(*this);
return old;
}
Sample Sample::operator + (Sample t)
{
int i;
Sample fp;
if(len>t.len)
{
fp.p=new int[len];
fp.len=len;
for(i=;i<len;i++)
fp.p[i]=p[i];
for(i=;i<t.len;i++)
fp.p[i]+=t.p[i];
}
else
{
fp.p=new int[t.len];
fp.len=t.len;
for(i=;i<t.len;i++)
fp.p[i]=t.p[i];
for(i=;i<len;i++)
fp.p[i]+=p[i];
}
return fp;
}
int main()
{
int a[],b[],c[],i;
int lena,lenb,lenc; cout<<"输入a[]的长度: ";cin>>lena;
cout<<"输入a[]: ";
for(i=;i<lena;i++)
cin>>a[i];
cout<<"输入b[]的长度: ";cin>>lenb;
cout<<"输入b[]: ";
for(i=;i<lenb;i++)
cin>>b[i];
cout<<"输入c[]的长度: ";cin>>lenc;
cout<<"输入b[]: ";
for(i=;i<lenc;i++)
cin>>c[i]; Sample t1(a,lena),t2(b,lenb),t3(c,lenc),t4,t5;
cout<<"t1: ";t1.display();
cout<<"t2: ";t2.display();
cout<<"t3: ";t3.display(); cout<<endl; if(t1==t2)
cout<<"t1==t2 is true"<<endl;
else cout<<"t1==t2 is false"<<endl; cout<<"t4=t2: ";
t4=t2;
t4.display(); cout<<"t5=t2+t3: ";
t5=t2+t3;
t5.display(); cout<<"t1++ : ";
t1++;
t1.display(); cout<<"++t1 : ";
++t1;
t1.display();
system("pause");
}
/*
5 1 2 3 4 5 4 1 2 3 4 3 1 2 3
*/
c++重载运算符注意的更多相关文章
- c++的重载运算符
c++中允许重载运算符: 这是我辛苦的结果 #include"iostream"using namespace std;class aaa{ int x;public: aaa() ...
- C# 重载运算符
如果你想让自己定义的类型可以用运算符进行运算,那么可以通过重载运算符来实现: 示例: class Salary { public int RMB { get; set; } public static ...
- 【STL】重载运算符
重载运算符 为什么要重载运算符: C++中预定义的运算符的操作对象只能是基本数据类型.但实际上,对于许多用户自定义类型(例如结构体),也需要类似的运算操作.这时就必须在C++中重新定义这些运算符,赋予 ...
- c++中有些重载运算符为什么要返回引用
事实上,我们的重载运算符返回void.返回对象本身.返回对象引用都是可以的,并不是说一定要返回一个引用,只不过在不同的情况下需要不同的返回值. 那么什么情况下要返回对象的引用呢? 原因有两个: 允许进 ...
- C++ Primer : : 第十四章 : 重载运算符与类型转换之类型转换运算符和重载匹配
类型转换运算符 class SmallInt { public: SmallInt(int i = 0) : val(i) { if (i < 0 || i > 255) throw st ...
- C++ Primer : 第十四章 : 重载运算与类型转换之重载运算符
重载前须知 重载运算符是特殊的函数,它们的名字由operator和其后要重载的运算符号共同组成. 因为重载运算符时函数, 因此它包含返回值.参数列表和函数体. 对于重载运算符是成员函数时, 它的第一个 ...
- C#基础知识系列一(goto、i++、三元运算符、ref和out、String和string、重载运算符)
前言 这两天在网上看到的总结很多,尤其是博客园中的,很多很多,也给了我很多的启发,当然自己也总结过,而且有很多人也给与我一些意见和看法.不管怎样,自己还是先把所谓的基础知识加强巩固下吧. 2014年的 ...
- C++学习27 用全局函数重载运算符
运算符重载函数既可以声明为类的成员函数,也可以声明为所有类之外的全局函数. 运算符重载函数作为类的成员函数 将运算符重载函数声明为类的成员函数时,二元运算符的参数只有一个,一元运算符不需要参数.之所以 ...
- Chapter14:重载运算符
对于一个运算符函数来说,它或者是类的成员,或者至少含有一个类类型的参数. int operator+(int, int);//错误,不能为int重定义内置运算符 对于一个重载的运算符来说,其优先级和结 ...
随机推荐
- 【C#】1.算法温故而知新 - 简单的桶排序
该算法的时间复杂度是O(M+N),M为桶的个数,N为待排序的个数 缺点: 1.不适用于小数 2.当数值过多,太浪费空间,比如数值范围为0~99999,那需申请100000个变量,也就是要写成a[100 ...
- 【Ext.Net学习笔记】06:Ext.Net GridPanel的用法(GridPanel 折叠/展开行、GridPanel Selection、 可编辑的GridPanel)
GridPanel 折叠/展开行 Ext.Net GridPanel的行支持折叠/展开功能,这个功能个人觉得还说很有用处的,尤其是数据中包含图片等内容的时候. 下面来看看效果: 使用行折叠/展开功能之 ...
- disabled和readonly的区别?
在博客园中看到这样一篇文章,关于disabled和readonly的区别,以前还真的没有注意它们的区别,还是有必要知道它们的区别的,所以转载了. 这两个属性有类似之处,但是区别也是巨大的,之所以说类似 ...
- Codeforces 402B --耻辱的一题
这题昨天晚上花了我1个小时50多分钟来搞,都没有搞定..后来看别人代码,直接暴力枚举第一个数的值来做..最多1000*1000的复杂度.当时怎么就没想到呢?还有为啥我的方法不对呢.. 暴力方法代码: ...
- 关于jQuery的一些实用代码
(1)修改默认编码:(将默认的utf-8,修改为GB2312) $.ajaxSetup({ ajaxSettings:{contentType:"application/x-www-from ...
- RabbitMQ 一二事(3) - 订阅模式(微信公众号模式)的应用
之前讲的消费者互相可以把队列中的消息全部读取,但是不是读完整的所有信息 那么采用订阅模式就行,这就是微信公众号的模式, 比如10个人订阅了我的公众号"BeJavaGod",当我发送 ...
- java 20 -2 递归之找特定目录下的特定格式文件
/* 需求:把C:\Users\Administrator\Desktop\记录目录下所有以.java结尾的文件的绝对路径输出到控制台 分析: A:封装该目录 B:获取该目录下的所有文件或文件夹的Fi ...
- java 20 -1 递归的概述和案例
/* * 递归:方法定义中调用方法本身的现象 * * 方法的嵌套调用,这不是递归. * Math.max(Math.max(a,b),c); * * public void show(int n) { ...
- 普通请求和ajax请求的区别
普通请求和ajax请求的区别? 下面的action返回一个json文件,文件内容为sts.*,data1
- scrapy 爬取 useragent
useragentstring.com 网站几乎廊括了所有的User-Agent,刚学了scrapy,打算那它练手,把上面的 user-agent 爬取下来. 本文只爬取常见的 FireFox, Ch ...