---------------------------------不积小流,无以成江海;不积跬步,无以至千里-------------------------------------
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)