C++学习笔记day45-----C++-成员指针、操作符重载

成员指针
成员指针,是指向类的成员的指针。具有以下语法形式:
int User::*p_m_data = &User::m_data;//指向成员变量
void (User::*func)(void) = &User::print;//指向成员函数

#include <iostream>
using namespace std;
class User{
private:
public:
        User(int data):m_data(data){}
        int m_data;
        void print(void){
                cout << m_data << endl;
        }
};
int main(void){
        int User::*p_m_data = &User::m_data;
        void (User::*func)(void) = &User::print;
        User u1(10);
        (u1.*func)();
        return 0;
}

操作符重载
操作符重载函数,最主要的是关键字 oparetor ,然后是语义分析。
当我们为一个类设计一个重载”+”的成员函数的时候,要考虑到,两个类类型的对象相加之后的结果是左值还是右值,两个参与运算的对象是否可以是常量对象。这将决定函数类型,也是重载操作符函数最重要的点。
1、通常情况下,我们认为”+”运算的结果,是不能再被赋值,是一个右值。
例如:int a = 1,b = 2; (a+b)=10;//感觉就是不行的,编译不会通过。那么操作符重载函数的返回值应该是一个同类型的常量
const 类名 operator+(){}
2、”+”的右操作数,可以是一个常量,所以操作符重载函数中代表右操作数的形参需要被const修饰,否则就无法接收常量类型的有操作数
const 类名 operator+(const 类名 &){}
3、”+”的左操作符,可以是一个常量,所以操作符重载函数是一个成员函数的时候,该成员函数需要被修饰成常函数,否则常对象无法调用这个函数。
const 类名 operator+(const 类名 &)const{}
分析结束,这样就可以确定一个操作符重载函数的类型。
<<,>>的重载
如果想要让自定义的类,也能通过输入输出操作符来操作,那么就需要对其进行重载。由于成员函数形式的操作符重载函数,需要写入到对象的类的源码中。而cout对象的类是ostream,是一个标准库中的类,显然不能轻易修改。所以就采用全局函数形式的操作符重载函数。如下:
ostream &operator<<(ostream &os,cosnt ClassName &that);
返回输出对象的引用是为了在连续打印输出时,不再创建新的临时输出对象。被输出的对象要加上const修饰,可以输出常量对象
istream &operator>>(istream &is,ClassName &that);


十九、成员指针//了解
1、成员变量指针
1) 定义
类型 类名::*成员指针变量名 = &类名::成员变量名;
2) 使用
对象.*成员指针变量名;
注:”.*”是一个操作附,成为直接成员指针解引用操作附
对象指针->*成员指针变量名;
注:”->*”,间接成员指针解引用操作附

2、成员函数指针
1) 返回类型 (类名::*函数指针)(形参表) = &类名::函数名;
2) 使用
(对象.*成员函数指针)(实参);
(对象指针->*成员函数指针)(实参);

二十、操作附重载

1、双目重载操作附 L # R
1.1 运算类双目运算符: + - ...
-->左右操作数可以是左值也可以是右值
-->表达式的结果为右值
-->实现的方式:
1)  成员函数形式(左调右参)
型如L#R的表达式可以被编译器处理成L.operator#(R)的成员函数调用形式,该函数的返回结果即为表达式的结果。
2)  全局函数方式
型如L#R的表达式可以被编译器处理成::operator#(L,R)的成员函数调用形式,该函数的返回结果即为表达式的结果。
注:通过"friend"关键字可以把一个全局函数声明为某个类的友元函数,该函数可以调用这个类中的私有成员。


1.2 赋值类双目运算: += -=
-->左操作数必须是一个左值,而右操作数可以是左值也可以是右值
-->表达式的结果是左值,就是左操作数的自身
1)  成员函数形式
L#R ==> L.operator#(R)
2)  全局函数形式
L#R ==> operator#(L,R)

2、单目操作附 #O
2.1计算类单目操作附 - ~ !
-->操作数可以是左值也可以是右值
-->表达式的结果是右值,不能对表达式结果进行赋值
-->实现方式有两种
1)  成员函数的形式
#O ==> O.operator#();
2)  全局函数的形式
#O ==> ::operator#(O);

2.2自增减单目操作附 ++/--
1)前缀++,--
-->操作数必须是左值,
-->表达式的结果也是左值,就是操作数的自身
成员函数:
#O ==> O.operator#();
全局函数:
#O ==> ::operator#(O);
2)后缀++,--
-->操作数必须是左值
-->表达式结果是右值,是操作数自增减之前数值
成员函数:
O# ==> O.operator#(int/*哑元*/);
全局函数:
O# ==> ::operator#(O,int/*哑元*/);

3、插入/提取操作附:<<,>>
功能:实现自定义类型对象的输入和输出
注:只能用全局函数形式(friend),不能使用成员函数形式(需要修改ostream源代码)。
—————-
friend ostream &operator<<(ostream &os,const RIGHT &right){}
friend istream &operator>>(istream &is,RIGHT &right){}

猜你喜欢

转载自blog.csdn.net/displaymessage/article/details/80542124