2017C++基础——网课笔记(67到69)

六十七. 自定义的数组类

第一个文件: MyArray.h

#ifndef MYARRAY_H
#define MYARRAY_H

using namespace std;

class MyArray
{
    public:
        MyArray();
        MyArray(int len);
        MyArray(const MyArray & another);
        ~MyArray();

        void setData(int index,int data);
        int getData(int index);
        int getLen() const;
        MyArray& operator= (const MyArray& another);

        int& operator[](int index) const;

        friend ostream& operator<< (ostream& os, const MyArray & array); //这里我们需要注意,如果左移操作符这里的array是const
                                                                        //那么它用到的getLen与int& operator[](int index)后面都必须有const
                                                                        //这里是基于安全级高的const MyArray & array不能在使用中被可能修改。
        friend istream& operator>> (istream& is,MyArray& array);
        friend bool operator==(MyArray& array1, MyArray& array2);
        friend bool operator!=(MyArray& array1, MyArray& array2);
    protected:

    private:
        int len;
        int *space;
};

#endif // MYARRAY_H

第二个文件:MyArray. cpp

#include <iostream>
#include "MyArray.h"

using namespace std;

MyArray::MyArray()
{
    cout<<" MyArray()..."<<endl;//ctor
    this->len=0;
    this->space= NULL;
}

MyArray::MyArray(int len)
{
    if(len<0){
        this->len=0;
        return;
    }
    else{
        this->len = len;
        this->space= new int[this->len];
        cout<<" MyArray::MyArray(int len)..."<<endl;//ctor
    }
}

MyArray::MyArray(const MyArray & another)
{
    if(another.len >= 0){
        this->len = another.len;

        //deep copy
        this->space= new int[this->len];
        for(int i=0; i<this->len;i++){
            this->space[i] = another.space[i];
        }
        cout<<" MyArray::MyArray(const MyArray & another)..."<<endl;//ctor
    }
}

MyArray&   MyArray::operator=(const MyArray& another)
{
        if(this == &another)
        {
            return *this;
        }

        if(this->space !=NULL)
        {
            delete [] this->space;
            this->space= NULL;
            this->len=0;
        }

    if(another.len >= 0){
        this->len = another.len;

        //deep copy
        this->space= new int[this->len];
        for(int i=0; i<this->len;i++){
            this->space[i] = another.space[i];
        }
        cout<<" MyArray::MyArray(const MyArray & another)..."<<endl;//ctor
    }

    return *this;
}

MyArray::~MyArray()
{
    if(this->space != NULL){//dtor
        delete []this->space;
        this->space = NULL;
        len=0;
        cout<<"MyArray::~MyArray()... "<<endl;
    }
}

void MyArray::setData(int index, int data)
{
    if(this->space !=NULL){
        this->space[index] =data;
    }
}

int MyArray::getData(int index)
{

    return this->space[index];
}

int MyArray::getLen() const
{
    return this->len;
}

int& MyArray::operator[](int index) const
{
    return this->space[index];
}

ostream& operator<<(ostream& os, const MyArray & array)
{
    os<<"Iteration"<<endl;
    //array.getLen(); This means getLen(array);
    for(int i=0; i<array.getLen();i++){
        os<<array[i]<<" ";
    }

    os<<endl;

    os<<"Use << operator";

    return os;
}

istream& operator>> (istream& is,MyArray& array)
{
    cout<<"Please enter "<<array.getLen()<<" numbers"<<endl;
    for(int i=0; i<array.getLen();i++){
        cin>>array[i];
    }
    return is;
}

bool operator==(MyArray& array1, MyArray& array2)
{
    if(array1.len != array2.len)
        return false;

    for(int i=0;i<array1.len;i++){
        if(array1.space[i] != array2.space[i])
            return false;
    }

    return true;
}

bool operator!=(MyArray& array1, MyArray& array2)
{
    return !(array1 == array2);
}

第三个文件:main.cpp

#include <iostream>
#include "MyArray.h"


using namespace std;

int main()
{
    MyArray array1(10);

    for(int i=0; i<10;i++){
        array1.setData(i,i+10);
    }

    cout<<"-------------------------"<<endl;
    cout<<"array1:"<<endl;
    for(int i=0;i<10;i++){
        cout<<array1.getData(i)<<" ";
    }
    cout<<endl;

    cout<<"-------------------------"<<endl;
    MyArray array2(5);
    cin>>array2;
    cout<<"array2:"<<endl;
    cout<<array2<<" ";

     cout<<"-------------------------"<<endl;
    cout<<endl;
    if(array2 != array1){
        cout<<"Not Equal"<<endl;
    }
    else
        cout<<" equal"<<endl;


    return 0;
}

六十八. 重载小括号和new-delete操作符

#include <iostream>

using namespace std;

class Sqr
{
public:
    Sqr(int a){
        this->a=a;
    }

    int operator()(int value)
    {
        return value*value;
    }

    int operator()(int value1, int value2)
    {
        return value1 * value2;
    }
private:
    int a;
};

int main()
{
    Sqr s(10);

    int value= s(2);//这里的意思是求2的平方
                    //这里是将一个对象,当成一个普通函数来调用
                    //称这种对象时,仿函数,伪函数

    cout<<"value:"<<value<<endl;
    cout<<"----------------------"<<endl;
    value= s(10,20);
    cout<<"value:"<<value<<endl;
    return 0;
}

new和delete操作符的重载

#include <iostream>
#include <stdlib.h>

using namespace std;

class A
{
public:
    A(int a){
        cout<<"A(int a)..."<<endl;
        this->a=a;
    }

    //重载的new操作符,依然会触发构造函数
    void* operator new(size_t size){  //void* 是“万能指针”,和void没关系
        cout<<"重载了new操作符"<<endl;
        return malloc(size);
    }

    //重载的delete操作符,依然会触发析构函数
    void operator delete(void * p )
    {
        cout<<"重载了delete操作符"<<endl;
        if(p != NULL)
        {
            free(p);
            p = NULL;
        }
    }

    ~A(){
        cout<<"~A()..."<<endl;
    }
private:
    int a;
};

int main()
{
    A *ap=new A(10);

    delete ap;

    return 0;
}

运行结果:

重载了new操作符
A(int a)...
~A()...
重载了delete操作符

六十九. 重载小括号和new-delete操作符2
#include <iostream>
#include <stdlib.h>

using namespace std;

class A
{
public:
    A(int a){
        cout<<"A(int a)..."<<endl;
        this->a=a;
    }

    A(){
        cout<<"A()..."<<endl;
    }

    //重载的new操作符,依然会触发构造函数
    void* operator new(size_t size){  //void* 是“万能指针”,和void没关系
        cout<<"重载了new操作符"<<endl;
        return malloc(size);
    }

    //重载的delete操作符,依然会触发析构函数
    void operator delete(void * p )
    {
        cout<<"重载了delete操作符"<<endl;
        if(p != NULL)
        {
            free(p);
            p = NULL;
        }
    }

    ~A(){
        cout<<"~A()..."<<endl;
    }

    void* operator new[](size_t size)
    {
        cout<<"重载了new[] 操作符"<<endl;
        return malloc(size);
    }

    void operator delete[](void* p )
    {
        cout<<"重载了delete[] 操作符"<<endl;
        if(p != NULL){
            free(p);
            p = NULL;
        }
    }

private:
    int a;
};

int main()
{
    A *ap=new A(10);//ap->operator new(sizeof(A));
    delete ap;
    cout<<"-------------------------------"<<endl;

    A * array_p= new A[20]; //array_p->operator new[](sizeof(A[20]))
    delete []array_p;



    return 0;
}

运行结果


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值