首页 > 编程语言 >C++黑马程序员——P124-126. 赋值 关系运算符重载;函数调用运算符重载

C++黑马程序员——P124-126. 赋值 关系运算符重载;函数调用运算符重载

时间:2023-02-22 15:14:59浏览次数:48  
标签:Age 函数调用 运算符 Person 重载 赋值

  • P124. 类和对象——C++运算符重载——赋值运算符重载
  • P125. 类和对象——C++运算符重载——关系运算符重载
  • P126. 类和对象——C++运算符重载——函数调用运算符重载
  • P124. 赋值运算符重载

 C++编译器至少给一个类添加4个函数:

1. 默认构造函数(无参,函数体为空)

2. 默认析构函数(无参,函数体为空)

3. 默认拷贝构造函数,对属性进行值拷贝

4. 赋值运算符 operator=,对属性进行值拷贝

 

如果类中有属性指向堆区,做赋值操作时也会出现深浅拷贝问题。

 1 //赋值运算符重载
 2 class Person
 3 {
 4 public:
 5     Person(int age)
 6     {
 7         //将年龄数据开辟到堆区
 8         m_Age = new int(age);
 9     }
10     ~Person()
11     {
12         if (m_Age != NULL)
13         {
14             delete m_Age;
15             m_Age = NULL;
16         }
17     }
18 
19     //重载赋值运算符
20     Person& operator=(Person& p)
21     {
22         //编译器提供的浅拷贝:
23         //m_Age = p.m_Age;
24         //应该先判断本身是否有属性(m_Age)在堆区,如果有,先释放干净,然后再深拷贝
25         if (m_Age != NULL)
26         {
27             delete m_Age;
28             m_Age = NULL;
29         }
30         m_Age = new int(*p.m_Age); //深拷贝;*是解引用
31         //返回对象本身
32         return *this;    //返回值为本身是为了连等,例如 a=b=c;如果返回值是void,就调用不了连等(因为b=c时返回void,那么a就不能=void类型)
33     }
34 
35     int* m_Age;
36 };
37 
38 void test01()
39 {
40     Person p1(18);
41     Person p2(20);
42     Person p3(30);
43     p3 = p2 = p1;    //赋值操作;编译器提供的赋值操作为浅拷贝(p2和p1的m_Age都会指向同一块内存空间),析构时会重复释放,造成错误
44     cout << "p1的年龄为:" << *p1.m_Age << endl;
45     cout << "p2的年龄为:" << *p2.m_Age << endl;
46     cout << "p3的年龄为:" << *p3.m_Age << endl;
47 }
48 
49 int main()
50 {
51     test01();
52     return 0;
53 }

运行结果:

  

 

  • P125. 关系运算符重载

作用:重载关系运算符,可以让两个自定义类型对象进行对比操作

 1 //重载关系运算符
 2 class Person
 3 {
 4 public:
 5     Person(string name, int age)
 6     {
 7         m_Name = name;
 8         m_Age = age;
 9     }
10     string m_Name;
11     int m_Age;
12 };
13 
14 //==运算符重载
15 bool operator==(Person& p1, Person& p2)
16 {
17     if ((p1.m_Name == p2.m_Name) && (p1.m_Age == p2.m_Age))
18     {
19         return 1;
20     }
21     else
22     {
23         return 0;
24     }
25 }
26 
27 void test01()
28 {
29     Person p1("Tom", 18);
30     Person p2("Tom", 18);
31     if (p1 == p2)
32     {
33         cout << "p1 和 p2 相等" << endl;
34     }
35 }
36 
37 int main()
38 {
39     test01();
40     return 0;
41 }

运行结果:

  

 

  • P126. 函数调用运算符重载

函数调用运算符:()

● 函数调用运算符()也可以重载

● 由于重载后使用的方式非常像函数的调用,因此称为仿函数

● 仿函数没有固定写法,非常灵活

 1 //函数调用运算符()重载
 2 //打印输出类
 3 class MyPrint
 4 {
 5 public:
 6     //重载函数调用运算符
 7     void operator()(string test)
 8     {
 9         cout << test << endl;
10     }
11 };
12 
13 void test01()
14 {
15     MyPrint m1;
16     //调用 重载函数调用运算符
17     m1("hello world"); //由于使用起来非常类似函数调用,因此称为仿函数
18 }
19 
20 //仿函数非常灵活,没有固定写法
21 //加法类
22 class MyAdd
23 {
24 public:
25     int operator()(int num1, int num2)
26     {
27         return num1 + num2;
28     }
29 };
30 
31 void test02()
32 {
33     MyAdd add1;
34     int a1 = add1(1, 2);
35     cout << "a1 = " << a1 << endl;
36     //匿名函数对象;匿名对象特点:当前行执行完后,会被立即释放
37     cout << "MyAdd()(3, 4) = " << MyAdd()(3, 4) << endl; //类名+小括号+参数列表
38 }
39 
40 int main()
41 {
42     test01();
43     test02();
44     return 0;
45 }

运行结果:

  

(〃>_<;〃)(〃>_<;〃)(〃>_<;〃)

标签:Age,函数调用,运算符,Person,重载,赋值
From: https://www.cnblogs.com/wjjgame/p/17142435.html

相关文章

  • 【JavaScript】24_旧类与new运算符
    14、旧类早期JS中,直接通过函数来定义类一个函数如果直接调用xxx()那么这个函数就是一个普通函数一个函数如果通过new调用newxxx()那么这个函数就是一个够早函数​......
  • 函数重载
    当程序中有函数重载时,函数的匹配原则和顺序是什么?名字查找确定候选函数寻找最佳匹配你知道重载运算符吗?只能重载已有的运算符,而无权发明新的运算符两种重载方式:成......
  • 自定义的信号与槽发生重载的解决
    (一)解决方案1.方案在student.h中#ifndefSTUDENT_H#defineSTUDENT_H#include<QObject>classStudent:publicQObject{Q_OBJECTpublic:explicit......
  • C++黑马程序员——P121-123. + << ++运算符重载
    P121.类和对象——C++运算符重载——加号运算符重载P122.类和对象——C++运算符重载——左移运算符重载P123.类和对象——C++运算符重载——递增运算符重载P121.加......
  • 运算符:指数-链判断-Null判断-逻辑赋值
    指数运算符//2*2console.log(2**2);//4//2*2*2*2console.log(2**4);//16指数运算符是右结合,多个指数运算符连用时,从右边开始计算。console.log(......
  • 4.7自增自减运算符重载
    #include<iostream>#include<cstring>#include<algorithm>usingnamespacestd;classA{public:intfirst,second;A(inta,intb){firs......
  • 运算符
      %取余,java(模)关系运算符的结果:正确,错误,(布尔值)       ......
  • Java基础——控制语句、switch结构与三元运算符
    packagecom.zhao.demo;publicclassDemo03{publicstaticvoidmain(String[]args){intnum=1;switch(num){case1:......
  • 一元运算符 java 230220
    自增++inta=1;b=a++;自减--inta=1;b=--a;......
  • 三元运算符
    三元运算符三元运算符通常在Python里被称为条件表达式,这些表达式基于真(true)/假(not)的条件判断,在Python2.4以上才有了三元操作。下面是一个伪代码和例子:伪代码:#如......