测试环境 VS2013
主要描述下自己工作中容易混淆的点。
const
1- 不能只基于返回值是否为const来进行重载,换句话说,重载和返回值无关,即是否重载时不看函数返回值(包括返回值加了const和static限定时也不会构成重载条件)
因为当调用foo(1)的时候,编译器不知道是不是要把返回值置为const。
2- 不能只基于形参列表中的形参是否限定为const进行重载。因为对于foo(1),系统不知道调用形参是否限定了const的函数。
3- 可以只基于成员函数是否为const进行重载。
4- const成员只能在初始化列表中初始化。
5-当非const对象调用时,优先调用非const的函数,若只有对应的const函数,则也调用。
而Const对象调用时,只能调用const的函数(经测试,发现const对象也可以调用static函数!)。
6- const 函数与非const函数。 非const函数可以调用const函数,反之不可。
7- const函数与const成员,非const成员,mutable成员,static成员。
const函数内上述变量均可访问,但是不能修改const成员和非const成员,而mutable成员和static成员可以修改。
8.C函数不能声明为const函数。
static
1 不能只基于某函数是不是加static限定来进行重载
2 static不单独从属某一个对象,但是又属于任意一个对象(任意对象都可以调用,也可以直接类名::函数调用)
3 static外部使用表明变量本文件起作用(一般定义在源文件)。
4 static对象可以调用各种函数。
5 static函数不能调用非static函数,反之可以。
6 static成员函数只能直接访问static数据,当然可以通过携带this形参的方式访问其他的。
7 static函数的重载覆盖隐藏场景
7.1 static函数不能是虚函数,编译错误,即没有覆盖场景。
7.2 static 函数可以重载,但是不能基于是否为const来重载,即不能有CV限定(C–const V volitile)。
因此static函数只能根据形参列表来进行重载。
7.3 static函数可以实现隐藏场景。
————- 综上,类的static函数不能实现覆盖场景和基于函数const的重载场景,其他是可以的。
8:static数据成员只能初始化于cpp文件,当其带有模板时,则只能初始化于h文件
const和static部分测试代码
class foo{
int i;
static int si;
const int ci;
mutable int mci;
public:
foo(int x, int y) :ci(x), mci(y){}
void func(){ ++i; ++mci; ++si; cfunc(); }
//const void func()const { ++mci; ++si; }
static void sfunc(){ cout << si <<endl; }
void cfunc()const { ++mci; ++si; }
};
int foo::si = 0;
void main(void)
{
int a = 0;
int &refa = a;
const int &crefa = a;
const int b = 0;
// int &refb = b;
const int & crefb = b;
// int & c = 0;// initial value of reference to non-const must be an lvalue
const int & cc = 0;
const foo fo(1,1);
fo.cfunc();
fo.sfunc();
// fo.func();
const foo *p = &fo;
static foo fo2(1, 1);
fo2.cfunc();
fo2.sfunc();
fo2.func();
foo * p2 = &fo2;
system("pause");
}
重载:
1 同一个类的同名函数
2 形参类型列表不同或者有const函数区分。
3:返回类型是否相同不是必须条件。
覆盖:发生于基类指针(可以)调用子类函数时
1:父子类函数形参类型列表和const限定完全一致(此处的const限定指的是函数是否为const,而形参是否为const则忽略)
2:父类有virtual
3:调用时调用子类的实现
4:函数返回值必须相同,不过形参是否带const则无所谓。
PS:若仅仅子类对应函数返回值不同则编译不通过。而如果是子类和父类const限定不同则可以编译通过但是不是“覆盖”的场景了,此时是“隐藏”的场景
隐藏:基类指针不能调用子类函数
场景1: 父子类形参列表和const限定相同,没有virtual–
场景2: 父子类形参列表和const限定不同,不管有没有virtual
3:返回类型是否相同不是必须条件。
此时,基类指针不能调用子类函数(因为不是覆盖),子类指针或对象也不能调用父类函数(因为父类的被隐藏)
因此如果把同名函数的形参类型列表和const函数限定定义为A的话:
1:同一个类里面A不同的函数之间是重载
2:父子类里面A相同+父类有virtual是覆盖
3:父子类里面A相同+父类无VIRTUAL 或者 父子类的A不同是隐藏。