c++学习类中的常量const、友元、运算符重载

在这里插入图片描述

类中的常量 — const

  1. const 与函数 — 传参

    • 如果参数是指针,且仅作输入用,则应在类型前加const,以防止该指针在函数体内被意外修改。

    • 如果输入参数以值传递的方式传递对象,则宜改用“const&”方式来传递,这样可以省去临时对象的构造和析构过程,从而提高效率。

    • 在C++中,传递一个参数时,通常先选择通过引用传递,而且是通过常量(const)引用

    • void setName(const char *name);
      double getDistance(const Point &p1,const Point &p2);
      
  2. 常成员函数

    ​   用const修饰的函数,在声明和定义时都要加const

    const int getAge() const;//类中的声明
    
    const int Person::getAge() const//类外的定义
    {
        return m_age;
    }
    
  3. 常数据成员

    • const修饰的数据成员在每个对象中分配内存;

      (区别于常数:const修饰的为不可改变的变量)

    • const修饰的数据成员生命周期是对象的生命周期,不同的对象其const数据成员的值可以不同。

    • 不能在类声明中初始化const数据成员,const数据成员的初始化只能在类构造函数的初始化表中进行。

  4. 常对象

    ​   用const修饰的对象只能调用const成员函数

注:只有常成员函数才有资格操作常量或常对象,没有const关键字说明的函数不能用来操作常对象

(常成员函数的this指针是一个指向指向常量的指针 —> const Time *;普通的成员函数的this指针指向普通对象的指针 —> Time *若为const Time *则类型不匹配,即常对象不能调用普通成员函数)

const 的例外 – mutable

  1. 把常函数中隐含的this指针强制转换为非const。
  2. 在类中定义数据成员时使用mutable
  • const 所修饰的函数中,要由编译器负责保护类中的成员变量不被修改。
  • mutable用来修饰类的成员变量,让该变量在const 所修饰的成员函数中可以被修改。
  • const 修饰的函数只能是类的成员函数(不能为构造/析构函数);mutable修饰的变量只能是类的成员变量

友元 – 友元类 / 友元函数

友元函数:

在这里插入图片描述

友元类:

  • 友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)

    friend Time& operator++(Time&);//++a  在类中声明
    
    Time& operator++(Time& t)      //  在类外定义,与普通函数定义相同
    {
        cout << "Time& operator++(Time&)" <<endl;
    	//...
        return t;
    }
    

友元关系注意事项:

  • 友元关系不能被继承。
  • 友元关系是单向的,不具有交换性。
  • 友元关系不具有传递性。

运算符重载 — 友元函数的应用<现实中唯一>

  1. 单目运算符: ++ –
  2. 双目运算符:+ - * / +=
  3. 三目运算符: ? :

重载的方法友元函数 成员函数

友元函数

  对称的操作符,如算术运算、关系操作符、位操作符。(双目)

成员函数

 ​ 1. = [] () ->等必须定义为成员(+=不是必须)。

 2. 改变对象状态或与给定类型密切联系的其他运算符,如自增、自减。

成员函数:形参看起来比操作数数目少1;

a++ 与++a重载:用户在a++中多加一个int参数让编译器区分

friend Time& operator++ (Time& t);//++a  友元函数
friend Time operator++ (Time& t,int num);//a++ 友元函数

Time& Time::operator++ ();//++a 成员函数
Time Time::operator++ (int);//a++ 成员函数

Time t1 = t++;//t.operator++(0);
Time t1 = ++t;//t.operator++();

加号 + 重载

friend Time operator+ (const Time& t1,const Time& t2);//c = a + b  友元函数

Time Time::operator+ (const Time& t2) const;//a += b  成员函数

Time t = t1 + t2;//t1.operator+(t2);

加等于号 += 重载

friend Time& operator+= (Time& t1,const Time& t2);//a += b  友元函数

Time& Time::operator+= (const Time& t2);//a += b  成员函数

Time t = t1 += t2;//t1.operator+=(t2);
//t1 = t1 + t2 ; t = t1;

大于号 > 重载

friend bool operator>(const Time &t1,const Time &t2);

bool Time::operator>(const Time &t2) const;

t1 > t2//t1.operator>(t2);

数据流 - 输出流 << 输入流 >> 重载

ostream& operator<<(ostream& os,Time& t);//只有成员函数
istream& operator>>(istream& is,Time& t);

Time ttt;
cin >> ttt;
cout << ttt << endl;

重载的注意事项:

  • 不要重载具有内置含义的操作符 (& , && , ||)
  • 大多数操作符对类对象没有意义,根据需要将某些运算符重载
  • 选择成员或非成员实现

警告: 不要滥用运算符重载

©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页