1:const static 重载 覆盖隐藏 等知识点总结(更新)。

测试环境 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不同是隐藏。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值