C++ this指针/静态成员函数/友元函数/友元类/操作符重载

this指针

如下有一个成员函数:

int getK() const
{
    this->m_k = 100;  //this指针不是Test const*型指针,但函数名尾部出现const时出错
    this++;  //error,因为this指针是一个常指针,Test *const
    return this->m_k;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

如果成员函数尾部出现const时,修饰this指针

静态成员函数

  1. 静态成员函数的意义,不在于信息共享,数据沟通,而在于管理静态数据成员,完成对静态数据成员的封装。
  2. 静态成员函数只能访问静态数据成员。原因:非静态成员函数,在调用时this指针被当做参数进行。而静态成员函数属于类,而不属于对象,没有this指针。

友元函数

当在类的外边定义一个函数,这个函数要使用类的私有成员,那么就要在类的public下用以下的方式声明此函数,让这个函数成为类的友元函数

friend double test(类名 &对象);
  • 1

友元类

在类B的成员函数中要使用类A的私有成员,那么在类A的public下就要声明类B为类A的友元类。

class A
{
   public:
     A(int a)
     {
         this->a = a;
     } 
     friend class B;
   private:
     int a;
};  

class B
{
    public:
     B(int b)
     {
         this->b = b;
     }
     void PrintA()
     {
         A objA(10);
         cout << objA.a << endl;
     }
    private:
     int b;
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 注意: 
    1. 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类B中是否有类A的相应声明。
    2. 友元关系不能被继承。
    3. 友元关系不具有传递性。

操作符重载

背景:C++编译器对普通变量的加法运算你可以识别,但是如果我们自定义俩对象相加,编译器就不能识别了。 
* 注意:操作符重载写全局时,在类中要用友元声明(“operator+”构成一个函数名) 
举例:(实现复数相加) 
下面这段函数实现了加法的操作符重载。

Plural operator+(Plural &c1,Plural &c2)
{
    return Plural temp(c1.a+c2.a,c1.b+c2.b);
}
  • 1
  • 2
  • 3
  • 4

利用上面这段函数实现完整的俩对象相加:

#include "iostream.h"
using namespace std;

class Plural
{
public:
    Plural(int a, int b)
    {
        this->a = a;
        this->b = b;
    }
    friend Plural operator+(Plural &c1, Plural &c2);
    void Printplural()
    {
        cout << "(" << this->a << ", " << this->b << "i)" << endl;
    }
private:
    int a;
    int b;
};

Plural operator+(Plural &c1, Plural &c2)
{
    Plural temp(c1.a + c2.a, c1.b + c2.b);
    return temp;
}

int main()
{
    Plural p1(1, 2);
    Plural p2(3, 4);
    p1.Printplural();
    p2.Printplural();
    Plural p3 = p1 + p2; //等于p3 = operator+(p1,p2);
    p3.Printplural();
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37


猜你喜欢

转载自blog.csdn.net/qq_40955914/article/details/80820319