learn_c++_lesson3

1.运算符重载:

运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。对于基本数据类型,+号这种运算符,是认识的,但是对于我们新建的这些类,他们是不认识的,所以我们需要进行运算符的重载。

运算符重载(operator overloading)只是一种语法上的方便,也就是它只是另一种函数调用的方式。

语法:   定义重载的运算符就像定义函数,只是该函数的名字是operator@,这里的@代表了被重载的运算符。函数的参数中参数个数取决于两个因素。

  1. 运算符是一元(一个参数)的还是二元(两个参数);
  2. 运算符被定义为全局函数(对于一元是一个参数,对于二元是两个参数)还是成员函数(对于一元没有参数,对于二元是一个参数-此时该类的对象用作左耳参数)

示例代码:

class person 
{
public:
    person(){}
    person(int a,int h):age(a),height(h){}
    int age;
    int height;
    
    // person operator+(person &m)
    // {
    //     person tmp;
    //     tmp.age = this->age+m.age;
    //     tmp.height = this->height+m.height;
    //     return tmp;

    // }

    person operator+(person m)
    {
        person tmp;
        tmp.age = this->age+m.age;
        tmp.height = this->height+m.height;
        return tmp;
    }
};
//全局函数的方式进行运算符重载
// person operator+(person &m,person &n)
// {
//     person tmp;
//     tmp.age = m.age+n.age;
//     tmp.height = m.height+n.height;
//     return tmp;
// }

3.左移运算符重载:

ostream & operator<<(ostream &cout,person &p)
{
    cout <<p.age<<p.height<<endl;
    return cout;
}
//返回值为引用,主要是为了实现cout <<"hello"<"zww"<<endl; 这样的形式,返回值不为引用的话,那么的话只能cout << p;

4.前置++和后置++ 运算符重载:

通过占位参数来判断前置还是后置:

    person & operator++()
    {
        this->age++;
        this->height++;
        return *this;
    }

    person operator++(int)
    {
        person tmp;
        tmp = *this;
        this->age++;
        this->height++;
        return tmp;

    }

5.智能指针:

class person
{
public:
	person(int age)
	{
		this->m_Age = age;
	}

	void showAge()
	{
		cout << "年龄为:" << this->m_Age << endl;
	}
	~person()
	{
		cout << "Person的析构调用" << endl;
	}

	int m_Age;
};


class smartpointer
{
public:
    smartpointer(person *p)
    {
        this->p = p;
    }

    ~smartpointer()
    {
        cout <<"智能指针西沟"<<endl;
        if(this->p != NULL)
        {
            delete this->p;
            this->p = NULL;
        }
    }

    person & operator*()
    {
        return *this->p;
    }
    person* operator->()
    {
        return this->p;
    }
private:
    person* p;
};
int main()
{
    person *p1 = new person(10);
    smartpointer pointer(p1);
    //pointer->showAge();
    (*pointer).showAge();
}

6.赋值运算符重载:

一个类默认创建 默认构造、析构、拷贝构造 operator=赋值运算符 进行简单的值传递 ,这个和深拷贝和浅拷贝类似,因为=赋值运算符只会简单的值拷贝,容易出问题,所以有时候我们需要 自己去写一个赋值运算符重载。

class Person2
{
public:
	Person2(char * name)
	{
		this->pName = new char[strlen(name) + 1];
		strcpy(this->pName, name);
	}

	//重载 = 赋值运算符
	Person2& operator= ( const Person2 & p)
	{
		//判断如果原来已经堆区有内容,先释放
		if (this->pName != NULL)
		{
			delete[] this->pName;
			this->pName = NULL;
		}

		this->pName = new char[strlen(p.pName) + 1];
		strcpy(this->pName, p.pName);

		return *this;
	}

	~Person2()
	{
		if (this->pName != NULL)
		{
			delete[] this->pName;
			this->pName = NULL;
		}
	}

	char * pName; 
};

void test02()
{
	Person2 p1("狗蛋");

	Person2 p2("狗剩");

	Person2 p3("");
	p3 = p2 = p1;

	cout << p2.pName << endl;
	cout << p3.pName << endl;
}

 

主要是学习了运算符重载,运算符重载主要是为了,对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用中的错误信息是关于一个叫做mqtt的库文件的错误,错误提示是在文件node_modules/_mqtt@4.3.7@mqtt/lib/client.js中出现了一个意外的标记。对应的错误信息是"Module parse failed: Unexpected token (118:38)",这通常意味着需要一个适当的加载器来处理该文件类型。而引用则说明了这个错误可能是因为版本不匹配或某些变量或用法不兼容导致的。 对于你提到的错误"C:\Learn\code\Qt\Learn_C \01mqtt_test\widget.cpp:20: error: cannot create a non-constant pointer to member function",这个错误是关于C++代码中的一个问题。根据错误信息可知,你在widget.cpp文件的第20行尝试创建一个非常量的成员函数指针,这是不允许的。 要解决这个问题,你可以考虑将成员函数指针声明为常量,或者重新评估你的代码逻辑,看是否有其他方式来达到你的目的。同时,还可以检查你的代码是否存在其他语法错误或逻辑错误,以确保没有其他问题导致这个错误的出现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [error in ./node_modules/_mqtt@4.3.7@mqtt/lib/client.js Module parse failed:](https://blog.csdn.net/qq_45327886/article/details/123556916)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值