c++ 05

时间:2024-01-15 10:54:50

一、单例模式

二、成员指针
class Student {
public:
  string m_name;
  void print (void) { ... }
};
1.指向成员变量的指针
成员变量类型 类名::*指针变量名;
string Student::*pname;
pname是一个指向Student类中string类型成员变量的指针。
指针变量名 = &类名::成员变量名;
pname = &Student::m_name;
对象.*指针变量名/对象指针->*指针变量名
.*  - 成员指针解引用运算符
->* - 成员指针间接访问运算符
Student s (...), *p = &s;
cout << s.*pname << endl;
cout << p->*pname << endl;
2.指向成员函数的指针
成员函数返回类型 (类名::*指针变量名) (形参表);
void (Stduent::*pprint) (void);
指针变量名 = &类名::成员函数名;
pprint = &Student::print;
(对象.*指针变量名) (实参表)/
(对象指针->*指针变量名) (实参表)/
Student s (...), *p = &s;
(s.*pprint) ();
(p->*pprint) ();

三、操作符重载的基本概念
c1-(c2+c3)
c1.sub (c2.add (c3));
1.操作符和操作符函数
1)双目操作符:+-*/%...,+=/-=...,<</>>
L#R -> L.operator#(R),左调右参
    -> ::operator#(L,R),左一右二
2)单目操作符:-/~/!...,++/--
#O/O# -> O.operator#()
      -> ::operator#(O)

3)三目操作符:?:,不能表示为操作符函数
2.所谓操作符重载,其本质就是根据不同的数据类型,定义相应的操作符函数,以使自定义类型能够与基本类型应用相同或相近的语义进行运算。
3.能够被重载的操作符的操作数种至少有一个是类类型。
4.操作符的优先级和结合序不会因重载而发生变化。
5.操作符的操作数个数不会因重载而发生变化。
6.除了“()”操作符以外所有的操作符函数都不能带有缺省参数。
7.并不是所有的操作符都能重载。
8.不能发明新的操作符。
x ** y

四、双目操作符
1)+-*/
2)复合赋值:+=/-=
3)输入输出:>>/<<
cout << c1 -> cout.operator<< (c1)
ostream    -> ::operator<< (cout, c1)
cin >> c1
istream
cout << a << endl;
~~~~~~~~~
     cout

五、单目操作符
1)-/~/!
2)前缀自增减
++i
3)后缀自增减
i++
练习:实现一个3X3的矩阵类M33,支持如下运算:+/*/+=/*=/取负/前++/后--/<<
1 2 3   9 8 7   30
4 5 6 X 6 5 4 =
7 8 9   3 2 1
9+12+9