1.const 的运用
const修饰对象时,const+类名+对象名[实参列表] 类名+const+对象名[实参列表]
- const修饰的对象只能调用常成员函数,并且对象内的数据成员只能被访问,不能修改。要想修改需要将数据声明为mutable类型。
const修饰成员函数时,类型名+函数名(形参列表)+const
eg:void max(int ,int ) const { }
在函数声明和函数定义时都要带const关键字,否则被编译器认为是不同的两个函数,但是在函数调用的时候不必带const;
- 常对象可以调用常成员函数,不可以调用非常成员函数,非常对象既可以调用常成员函数,又可以调用非常成员函数。
2.this指针
- 每一个非静态成员函数中都包含一个this指针
- this指针是一个指向对象的指针,是为了让成员函数能获取属于该对象的数据成员。
- this指针并不是对象自身的一部分,不会影响sizeof(“对象”)的结果。
3.静态数据成员
- 在类内声明,并且只能在类外(全局作用域中)定义,不可以在main函数内定义
静态数据成员在const函数中可以被修改,因为const表示的是当前函数里this指针所指向的对象是const类型,所以该对象的数据成员不可以被修改,但是静态数据成员是不不属于任何对象的,所以可以更改。
```cpp
```cpp
```cpp
```cpp
```cpp
eg. class Test
{public:
Test():b(0){}
static int a; //静态数据成员
int b;
void test() const const指的不能修改当前调用该函数对象的数据成员 { a++; b++; }};
int Test::a; //给静态数据成员定义,不赋初值则初值为0
4静态成员函数
- 静态成员函数不可以调用非静态成员函数,但是反过来是可以的。
- 静态成员函数没有this指针,也就是说静态成员函数不能使用修饰符(也就是函数后面的const关键字)
- 静态成员函数的地址可用普通函数指针储存,而普通成员函数地址需要用类成员函数指针来储存。
5.类的静态方法(函数)中为什么不能调用非静态成员(属性)?
类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问;非静态成员(变量和方法)属于类的对象,所以只有在类的对象产生(创建类的实例)时才会分配内存,然后通过类的对象(实例)去访问。在一个类的静态成员中去访问其非静态成员之所以会出错是因为在类的非静态成员不存在的时候类的静态成员就已经存在了,访问一个内存中不存在的东西当然会出错。
**另一种解释:**在本类的方法中访问本类的其它成员,我们需要使用this指针,而this这个引用指针是代表调用此方法的对象,我们说了静态的方法是不用对象调用的,而是使用类名来访问,所以根本就没有对象存在,也就没有this指针这个引用了,没有了this指针这个引用就不能访问类里面的非静态成员,又因为类里面的静态成员是可以不用对象来访问的,所以类里面的静态方法只能访问类的静态的属性.
6.友元函数
- 一个类的友元函数可以是不属于任何类的非成员函数,也可以是某个类的成员函数
- 一个类的友元函数可以访问该类的私有数据成员友元函数在访问私有数据成员时,必须通过对象名+成员运算符"."+成员名的方式访问,这是因为该友元函数是不属于这个类的,所以不能默认访问该类的数据成员
- friend修饰成员函数时,要对声明为友元成员函数的类进行提前声明
- 一个函数可以被多个类声明为友元函数
7.友元类
- 在一个类的定义体中用 friend+类名来声明它的友元类
- 友元类的关系是单向的,即A声明B为A的友元类,则B可以访问A的私有数据成员,但不等于A为B的友元类,所以A是不能访问B的私有数据成员的
- 友元类的关系不具有传递性,即若B为A的友元类,C为B的友元类,不可以直接退出C为A的友元类若B为A的友元类,则B中所有函数均为A的友元函数
8.运算符重载
-
格式:函数类型 operator 运算符名称 (形参表列){ }
-
运算符的重载本质上是函数的重载,相当于是 operator 与运算符名称共同构成了函数名运算符重载的规则
-
c++不允许用户定义新的运算符,只能对已有的运算符进行重载
-
不能重载的运算符有5个
-
. (成员访问运算符) . *(成员指针访问运算符) :: (域运算符) sizeof (长度运算符) ?: (条件运算符)
-
运算符重载不能改变运算对象(操作数)的个数
-
运算符重载不能改变运算符的结合性
-
运算符重载不能改变运算符的优先级
-
重载运算符的函数不能有默认的参数重载的运算符必须和用户自定义的类型的对象一起使用,其参数必须至少有一个是类的对象或类对象的引用