每天学点C++

---------------------------------不积小流,无以成江海;不积跬步,无以至千里-------------------------------------

1.explicit主要用于 "修饰 "构造函数. 指明构造函数只能显示使用,目的是为了防止不必要的隐式转化
2.基类派生子类时,希望派生类重写哪些函数,需要由基类指定,指定方法为加virtual修饰,不加virtual修饰则表明希望派生类继承而非重写该功能。
class A {
public:
       void bookName();
       virtual int bookPrice();
};
class B : public A {
public:
      virtual int bookPrice();
};
B::bookPrice不会调用A::bookPrice
但B::bookName 输出的结果仍是A::bookName的

3.
#include<iostream>
using namespace std;
class A {
public:
     void bookNameA(string _string) {
            cout<<"A::bookName(string)"<<endl;
     }
     virtual int bookPrice() {
            cout<<"A::bookPrice()"<<endl;
     }

};
class B : public A {
public:
        virtual int bookPrice() {
             cout<<"B::bookPrice()"<<endl;
        }
       void bookName(string _string,string _etring) {
             cout<<"B::bookName(string,string)"<<endl;
       }
 //代替从A继承
      void bookName(string _string) {
            cout<<"B::bookName(string)"<<endl;
     }
};
int main(){
        A a;
        B *b = new B;
       a.bookNameA("a");
       a.bookPrice();
       b->bookName("a","b");
       b->bookName("a");//若从A继承,不在B中写该函数,则会报错,重新在B中写一个和A同样的情况,则不会报错
        b->bookNameA("a");//A中该函数改名以后,则可以利用B的对象指针调用
        b->bookPrice();
        //b->bookName("a");
       delete b;
        b = NULL;
        return 0;
}
注意
 1:当B*b;而不是B*b = new B;时,程序会报段错误,为什么?
 2:class A中 bookNameA写成bookName时,会报错,A中的bookName(string)和B中的bookName(string,string)参数不同,B公有继承A,同名不同参的函数为何不能继承?
 3:B中加入和A中同样的函数,即同名不同参,只是不再是继承而来,则程序不会报错,为什么?
 4:当派生类从基类public继承时,派生类的函数名和基类函数名相同时:(1)如果参数也相同,则子类覆盖基类函数。如果基类为virtual,这便是重写(2)如果参数不同,则编译报错;然而在同

一个类内出现此种情况则不会报错,这便是重载(重载:同一个类内的同名不同参的函数,重写:通过继承实现,不同类的同名同参且基类函数使用virtual修饰的函数)

4.
static_cast:DestType dest_type = static_cast<DestType>(SourceType) 将SourceType转换成DestType类型的
mutable:将某个变量指定为可修改的(正常情况下,const修饰的类对像的成员变量不可修改,使用mutable修饰某变量以后,该变量便可被修改)

5.
#include<iostream>
using namespace std;
class ConstTest{
public:
        ConstTest():a(0){}
        void changeValue()const;
private:
        int a;
};
void ConstTest::changeValue()const{

        cout<<"++a is "<<++a<<endl;
}
int main(){
        ConstTest _constTest;
        _constTest.changeValue();
return 0;
}
(1)编译时报错,因为changeValue()为const型函数,不能修改类的成员变量
(2)声明和实现必须同时加const,否则编译报错(个人观点:如果一个函数对成员变量操作比较频繁,但又不希望该函数对成员变量做任何可能的改变,那就赶紧行动,在第一个{前面加上const吧)
(3)_constTest.changeValue();changeValue()函数有一个隐形的实参,当函数内对对应类类型的变量进行操作时,自动对应为该函数所在对象的变量(猜测隐形实参应该就是this)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值