类中的常量 — const
-
const 与函数 — 传参
-
如果参数是指针,且仅作输入用,则应在类型前加const,以防止该指针在函数体内被意外修改。
-
如果输入参数以值传递的方式传递对象,则宜改用“const&”方式来传递,这样可以省去临时对象的构造和析构过程,从而提高效率。
-
在C++中,传递一个参数时,通常先选择通过引用传递,而且是通过常量(const)引用
-
void setName(const char *name); double getDistance(const Point &p1,const Point &p2);
-
-
常成员函数
用const修饰的函数,在声明和定义时都要加const
const int getAge() const;//类中的声明 const int Person::getAge() const//类外的定义 { return m_age; }
-
常数据成员
-
const修饰的数据成员在每个对象中分配内存;
(区别于常数:const修饰的为不可改变的变量)
-
const修饰的数据成员生命周期是对象的生命周期,不同的对象其const数据成员的值可以不同。
-
不能在类声明中初始化const数据成员,const数据成员的初始化只能在类构造函数的初始化表中进行。
-
-
常对象
用const修饰的对象只能调用const成员函数
注:只有常成员函数才有资格操作常量或常对象,没有const关键字说明的函数不能用来操作常对象
(常成员函数的this指针是一个指向指向常量的指针 —> const Time *;普通的成员函数的this指针指向普通对象的指针 —> Time *若为const Time *则类型不匹配,即常对象不能调用普通成员函数)
const 的例外 – mutable
- 把常函数中隐含的this指针强制转换为非const。
- 在类中定义数据成员时使用mutable
- const 所修饰的函数中,要由编译器负责保护类中的成员变量不被修改。
- mutable用来修饰类的成员变量,让该变量在const 所修饰的成员函数中可以被修改。
- const 修饰的函数只能是类的成员函数(不能为构造/析构函数);mutable修饰的变量只能是类的成员变量
友元 – 友元类 / 友元函数
友元函数:
友元类:
-
友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)
friend Time& operator++(Time&);//++a 在类中声明 Time& operator++(Time& t) // 在类外定义,与普通函数定义相同 { cout << "Time& operator++(Time&)" <<endl; //... return t; }
友元关系注意事项:
- 友元关系不能被继承。
- 友元关系是单向的,不具有交换性。
- 友元关系不具有传递性。
运算符重载 — 友元函数的应用<现实中唯一>
- 单目运算符: ++ –
- 双目运算符:+ - * / +=
- 三目运算符: ? :
重载的方法:友元函数
成员函数
友元函数:
对称的操作符,如算术运算、关系操作符、位操作符。(双目)
成员函数:
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;
重载的注意事项:
- 不要重载具有内置含义的操作符 (& , && , ||)
- 大多数操作符对类对象没有意义,根据需要将某些运算符重载
- 选择成员或非成员实现
警告: 不要滥用运算符重载