const形参和实参 :
/*
1.覆盖和虚函数是两个不同概念:虚函数是为了多态,在运行是才确定 ;而覆盖在编译时就确定了。
所以如果下面的1:void fun()const{} 变为 2: void virtual fun()const{} 他们的 constrefer(b);将不同输出 1:Afun() 2:Bfun()
2.函数分为const 和 非const
3.优先考虑最合适的,即形参和实参相同都是const 或都不是
如果实参是非const 而形参只有是const函数也是可以匹配的
4.在const函数中 mutalbe数据和static数据是可以被改变的
5.含有const成员变量的类,如果没有赋值函数编译器不会自动生成,要自己去定义:因为对象生产后它的const成员常量是不能变的,所以它不能向正常类一样对其成员const常量进行赋值。
6.vector这些stl容器是要求对象要有赋值能力的,所以如果含有const常量的类并且没有显性写了赋值函数是不能放入vector中的
7.C++中定义的const全局变量必须要初始化,而c中可以不用初始化,它会自动默认的初始化给它
*/
#include <iostream>
using namespace std;
class A{
public:
void fun()const {
cout<<"Afun()"<<endl;
}
void virtual funnoconst(){
cout<<"Afunno"<<endl;
}
};
class B:public A{
public:
void fun()const{
cout<<"Bfun"<<endl;
}
void virtual funnoconst(){
cout << "Bfunno"<<endl;
}
private:
//B a; false
B *c;//true
static B e;//true
};
void constrefer(const A* con){
con->fun();//传入的可以不是const变量 但是它引用的函数必须是const函数;因为这样才能保证const作为变量的特性
}
void constrefer(A* con){
con->funnoconst();
}
int main(){
A *a=new B();
const A *b=new B();
constrefer(a);
constrefer(b);
}
Static的问题:
1.静态成员函数不可以同时声明为 virtual、const、volatile函数。
没有this,也就没有virtual运行时确定;
因为静态成员函数是属于类的,那么它就无所谓用const,volatile来控制对象变量的改变情况了。它本来就不能改变,所以不需要,也就不允许了。
2.静态成员函数的地址可用普通函数指针储存,而普通成员函数地址需要用 类成员函数指针来储存。举例如下:
class base{
static int func1();
int func2();
};
int (*pf1)()=&base::func1;//普通的函数指针
int (base::*pf2)()=&base::func2;//成员函数指针