顶层const
1)int * const p1 顶层const ;指针p1是常量指针,指向固定,可以通过它改变指向的内容;
2)const int * p2 底层const ;指针p2指向不固定,不可以通过它改变指向的内容,等同于指向常量对象,其实对象不一定是常量对象;
2、执行拷贝操作,左右对象必须具有相同的底层const,或者两个对象的数据类型必须能够转换;一般来说,非常量可以转换为常量,即const int* = int* 成立,const int &=int成立;
3、执行拷贝操作,常量是顶层const还是底层const区别明显;顶层const不受影响;即int =const int 成立;const int*=const int const *成立;
函数默认
1)一旦某个形参被赋予了默认值,其后面的所有形参都必须有默认值;
2)多次声明同一个函数合法,不过在给定作用域中,一个形参只能被赋予一次默认实参,换句话说,后面的声明只能为那些没有默认值的形参添加默认实参,而且右侧所有形参必须有默认值;
string screen(int ,int ,char a='k');
string screen(int c=1 ,int d=2 ,char);
3)初始化时,只能省略尾部实参;重新指定实参的形参左侧必须都重新指定实参,因此让经常使用默认值的形参放在尾部;
构造函数与初始化
初始化:
1、可以通过构造函数初始化;
2、类内初始化:声明时,直接初始化:=或者{ }初始化;
inline内联函数 定义放在头文件中;
const 类内函数:函数体内的this指针也是const的;返回的类型也是const;
mutable可变数据成员,在const函数体中仍然可以修;改可变数据成员;
友元类成员函数,
1)定义顺序:
(1)友元类声明与定义,其中友元函数只能先声明,不能定义;
(2)主类声明与定义,包括对友元类函数的友元声明;
(3)友元函数的定义;因为此时才可以使用主类的成员;
2)对于类的重载函数,需要每个分别友元才有效;因为重载函数是不同的函数;
3)友元函数必须在类外声明,否则主类函数不可以调用友元函数;就算友元函数是在主类中声明和定义的,也不可以主类中别的函数调用;
类的作用域:
1)在类的作用域外,类的不同成员或数据只能由类的对象、引用、指针使用成员访问运算符来访问;
2)类名以后为类的作用域;
3)在类外定义函数时,如果成员函数的返回类型是在类中定义的,需要在返回类型前加上类名+范围限定符;
4)解析名字查找原则
一般名字查找原则:
类中名字查找原则:
上面的处理方式只适用于成员函数体中使用的名字,对于函数体返回类型或者其参数列表中使用的名字,都必须在使用前确保可见;
函数体中名字查找原则:
函数体中名字会隐藏类成员中的名字,不过可以通过加上类的名字或者显式地使用this指针来强制访问类成员;