C++ 运算符重载四(自定义数组类)
//自定义数组类
#include<iostream>
using namespace std; //分析:能获取数组长度,添加元素,删除元素,修改元素
//要求重载[],=,==,!=运算符 class MyArray
{
private:
int mLength;
int* mSpace; public:
MyArray(int length){
cout << "有参构造函数被调用了1" << endl;
mLength = length;
mSpace = new int[mLength];
memset(mSpace, , sizeof(int)*mLength);
}
MyArray(const MyArray& obj){
cout << "拷贝构造函数被调用了2" << endl;
mLength = obj.mLength;
mSpace = new int[mLength];
int i = ;
for (i = ; i < mLength; i++)
{
mSpace[i] = obj.mSpace[i];
}
}
int length(){
return mLength;
}
void setData(int index, int value){
if (index>(mLength-))
{
cout << "数组越界!" << endl;
return;
}
mSpace[index] = value;
}
int getData(int index){
if (index>(mLength - ))
{
cout << "数组越界!" << endl;
return ;
}
return mSpace[index];
}
void PrintfA(){
for (int i = ; i < mLength; i++)
{
cout << "第"<<i<<"个元素是" << mSpace[i] << endl;
}
}
~MyArray(){
cout << "析构函数被调用了3" << endl;
if (mSpace!=NULL)
{ delete[] mSpace;
}
mLength = ;
}
public:
//[]操作符重载
int & operator[](int num){
if (num>(mLength-))
{
cout << "数组越界!" << endl;
return mSpace[mLength - ];
}
return mSpace[num];
}
//=操作符重载
MyArray & operator=(MyArray &obj){
mLength = obj.mLength;
if (mSpace==NULL)
{
mSpace = new int[mLength];
}
else{
//释放原来的数组内存
delete[] mSpace;
mSpace = new int[mLength];
}
int i = ;
for (i = ; i < mLength; i++)
{
mSpace[i] = obj.mSpace[i];
}
return *this;
}
//==操作符重载
bool operator==(MyArray &myarr){
bool flag = true;
if (mLength != myarr.mLength)
{
flag = false;
return flag;
}
for (int i = ; i < mLength; i++)
{
if (mSpace[i] != myarr.mSpace[i])
{
flag = false;
break;
}
}
return flag;
}
//!=操作符重载
bool operator!=(MyArray &myarr){
bool flag = false;
if (mLength == myarr.mLength)
{
for (int i = ; i < mLength; i++)
{
if (mSpace[i] != myarr.mSpace[i])
{
flag = true;
break;
}
}
}
else{
flag = true;
}
return flag;
} }; void ProtectA(){
MyArray arr();
arr.PrintfA();
//arr[10]; arr[10]=2;
//根据需求推理出参数列表是Int 返回值是int &
//int & arr.operator[](int num)
arr[]=;
arr.PrintfA();
//arr1=arr; 赋值操作
//分析可知:函数名operator=() ;操作数 2个(不涉及系统类库)arr.operator=(MyArray &arr1)
//因为存在 arr1=arr2=arr3; 所以返回值MyArray & ;结果:MyArray & operator=(MyArray &arr1)
MyArray arr2();
arr2[] = ;
arr2[] = ;
arr2[] = ;
arr2[] = ;
arr2[] = ;
arr = arr2;
arr.PrintfA(); } void ProtectB(){
//arr1==arr; 判断是否相等
//分析 :函数名 operator==(), 有2个操作数 arr1.operator==(arr) 返回值:判断是否相等 那么肯定返回bool值
//结果:bool operator==(MyArray &myarr)
MyArray arr1(), arr2();
if (arr1 == arr2)
{
cout << "这两个数组相等" << endl;
}
else{
cout << "这两个数组不相等" << endl;
}
if (arr1 != arr2)
{
cout << "这两个数不组相等" << endl;
}
else{
cout << "这两个数组相等" << endl;
}
} void main(){
ProtectB();
system("pause");
}
C++ 运算符重载四(自定义数组类)的更多相关文章
- python3.4中自定义数组类(即重写数组类)
'''自定义数组类,实现数组中数字之间的四则运算,内积运算,大小比较,数组元素访问修改及成员测试等功能''' class MyArray: '''保证输入值为数字元素(整型,浮点型,复数)''' de ...
- c++-变量,this指针,全局函数,成员函数,自定义数组类
区分变量属于哪个对象 c++对象管理模型初探 C++类对象中的成员变量和成员函数是分开存储的,C中内存四区仍然有效 C++编译器对普通成员函数的内部处理(隐藏this指针) this指针解决函数形参和 ...
- C++基础 (9) 第九天 编译器对模板类的二次编译 类模板 自定义数组类
1 昨日回顾 2 编译器对于模板的二次编译 写一个模板函数 然后进行调用 g++ template.cpp -o template // 汇编 g++ -S template.cpp –o templ ...
- python学习笔记四 (运算符重载和命名空间、类)
从以上代码中应该了解到: obj.attribute 查找的顺序: 从对象,类组成的树中,从下到上,从左到右到查找最近到attribute属性值,因为rec中存在name的属性,所以x.name可以 ...
- c++-重载等号,数组,指针,字符串类
重载 重载=操作符 1先释放旧对象资源 2用一个对象=给另外一个对象 3函数返回值当左值 返回一个引用 4 数组类 Array& operator=(Array& a1); 5 字符串 ...
- C++学习6-面向对象编程基础(运算符重载、类的派生与继承、命名空间)
运算符重载 重载的运算符是具有特殊名字的函数:它们的名字由关键字operator和其后要定义的运算符号共同组成.重载的运算符是遵循函数重载的选择原则,根据不同类型或不同参数来选择不同的重载运算符. 运 ...
- YTU 2617: B C++时间类的运算符重载
2617: B C++时间类的运算符重载 时间限制: 1 Sec 内存限制: 128 MB 提交: 284 解决: 108 题目描述 C++时间类的运算符重载 定义一个时间类Time,其数据成员为 ...
- C++学习之路—运算符重载(二)运算符重载作为类的成员函数和友元函数
(根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 对运算符重载的函数有两种处理方式:(1)把运算符 ...
- 问题 C: B C++时间类的运算符重载
题目描述 C++时间类的运算符重载 定义一个时间类Time,其数据成员为表示时间的小时(hour).分(minute),秒(second). 重载运算符“+”,使之能用于时间对象的加法运算:重载运算符 ...
随机推荐
- 初识 NoSQL Databases RethinkDB
初识 NoSQL Databases RethinkDB rethinkDB所有数据都是基于 json的Document; 官网:http://rethinkdb.com/ github: https ...
- Linux回环接口(loop-back/loopback)
回环接口(loop-back/loopback) Moakap整理 Loopback接口是一个虚拟网络接口,在不同的领域,其含义也大不一样. 1. TCP/IP协议栈中的loopback接口 在TCP ...
- SVN 快速入门!
输入账户密码即可!
- windows C:\documents and settings拒绝访问
windows C:\documents and settings拒绝访问 CreationTime--2018年7月26日09点16分 Author:Marydon 1.情景再现 win+r-- ...
- java的重写、重载、覆盖的差别
多态性 通过继承,一个类能够用作多种类型:能够用作它自己的类型.不论什么基类型,或者在实现接口时用作不论什么接口类型.这称为多态性 重载 每一个类型成员都有一个唯一的签名.方法签名由方法名称和一 ...
- PHP-密码学算法及其应用-对称密码算法
转自:http://www.smatrix.org/bbs/simple/index.php?t5662.html ////////////////////////////////////////// ...
- 虚拟机运行Linux提示【此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态。】的问题
虚拟机运行Linux提示[此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态.]的问题 换了台新笔记本,安装了虚拟机,导入以前的Linux系统镜像,出问题了. 提示以下错误信息: ...
- C#指南,重温基础,展望远方!(11)C#委托
委托类型表示对具有特定参数列表和返回类型的方法的引用. 通过委托,可以将方法视为可分配给变量并可作为参数传递的实体. 委托类似于其他一些语言中的函数指针概念,但与函数指针不同的是,委托不仅面向对象,还 ...
- CSC时无法找到C:\Program Files\Microsoft SDKs\Windows\v6.0A\lib
偶然用到CSC编译c#程序,出现如下问题: warning CS1668: “LIB 环境变量”中指定的搜索路径“C:\Program Files\Microsoft SDKs\Wind ...
- xaf 修改主页logo
https://documentation.devexpress.com/#Xaf/CustomDocument3156