c++primer——面向对象编程关键字
2015-10-15 17:27
267 查看
1.虚函数:virtual关键字来定义,主要是基类的派生类,作用是为了派生类可以在相同函数名的时候,可以有自己的功能,而不用执行基类的行为。
2.关键字:static(静态成员):
静态成员如果有n个同类的对象,那么每一个对象都分别有自己的数据成员,不同对象的数据成员各自有值,互不相干。但是有时人们希望有某一个或几个数据成员为所有对象所共有。这样可以实现数据共享。
如果想在同类的多个对象之间实现数据共享,也不要用全局对象,可以用静态的数据成员。
如果只声明了类而未定义对象,则类的一般数据成员是不占内存空间的,只有在定义对象时,才为对象的数据成员分配空间。
但是静态数据成员不属于某一个对象,在为对象所分配的空间中不包括静态数据成员所占的空间。静态数据成员是在所有对象之外单独开辟空间。只要在类中定义了静态数据成员,即使不定义对象,也为静态数据成员分配空间,它可以被引用。在一个类中可以有一个或多个静态数据成员,所有的对象共享这些静态数据成员,都可以引用它。
静态数据成员是在程序编译时被分配空间的,到程序结束时才释放空间。
静态数据成员既可以通过对象名引用,也可以通过类名来引用。这就验证了所有对象的静态数据成员实际上是同一个数据成员。同时也说明静态数据成员并不是属于对象的,而是属于类的,但类的对象可以引用它。
3.final关键字的作用:
4.override关键字:这个关键字作用在派生类中,起到提醒程序员是否有想要覆盖基类的虚函数却用错了参数。如下:
const对象只能调用const成员函数。
const对象的值不能被修改,在const成员函数中修改const对象数据成员的值是语法错误
在const函数中调用非const成员函数是语法错误
任何不会修改数据成员的函数都应该声明为const类型。如果在编写const成员函数时,不慎修改了数据成员,或者调用了其它非const成员函数,编译器将指出错误,这无疑会提高程序的健壮性。
以下程序中,类stack的成员函数GetCount仅用于计数,从逻辑上讲GetCount应当为const函数。编译器将指出GetCount函数中的错误。
6.pure virtual (纯虚函数):含有纯虚函数的类称为抽象类。在基类中,只告诉一个接口,而不需要告诉具体做什么,这样就变成了纯虚函数,一个纯虚函数只是提供一个接口,不去具体实现它,而通过子类去实现,这样就实现了数据隐藏和多态。
1)实现了纯虚函数的子类,该纯虚函数在子类中就变成了虚函数,子类的子类即孙子类可以覆盖
该虚函数,由多态方式调用的时候动态绑定。
2)纯虚函数必须在子类(sub class)中实现该函数才可以使用,因为纯虚函数在基类(base class)只有声明而没有定义。
纯虚函数的定义:=0必须在virtual中
adb2
定义,告诉编译器这只是个接口,作用还不确定。
<span style="background-color: rgb(243, 255, 236);">class pp
{
public:
</span><span style="background-color: rgb(255, 0, 0);">virtual</span><span style="background-color: rgb(243, 255, 236);"> void test()=0;//纯虚函数的定义
void test1(int i);
};</span>
class pp { public: virtual void test();// }; void pp::test() { cout<<"test"<<endl; } class aa :public pp { public: void test(){cout<<"tt"<<endl;} };主函数:
int main() { pp p3; aa p4; pp *p1=&p3; aa *p2=&p4; p1->test(); p2->test(); p1=&p4;//把定义为派生类的对象赋值给基类的指针,虚函数才有作用 p1->test();
<span style="white-space:pre"> </span>return 0; }结果是:test tt tt
2.关键字:static(静态成员):
静态成员如果有n个同类的对象,那么每一个对象都分别有自己的数据成员,不同对象的数据成员各自有值,互不相干。但是有时人们希望有某一个或几个数据成员为所有对象所共有。这样可以实现数据共享。
如果想在同类的多个对象之间实现数据共享,也不要用全局对象,可以用静态的数据成员。
如果只声明了类而未定义对象,则类的一般数据成员是不占内存空间的,只有在定义对象时,才为对象的数据成员分配空间。
但是静态数据成员不属于某一个对象,在为对象所分配的空间中不包括静态数据成员所占的空间。静态数据成员是在所有对象之外单独开辟空间。只要在类中定义了静态数据成员,即使不定义对象,也为静态数据成员分配空间,它可以被引用。在一个类中可以有一个或多个静态数据成员,所有的对象共享这些静态数据成员,都可以引用它。
静态数据成员是在程序编译时被分配空间的,到程序结束时才释放空间。
静态数据成员既可以通过对象名引用,也可以通过类名来引用。这就验证了所有对象的静态数据成员实际上是同一个数据成员。同时也说明静态数据成员并不是属于对象的,而是属于类的,但类的对象可以引用它。
3.final关键字的作用:
1). 一个类或结构体不希望被继承。 class Base final { }; // 错误,Derive不能从Base派生。 class Derive : public Base { }; 2). 一个虚函数不希望被override(覆盖)。 class Base { public: virtual void Fun() final {} }; class Derive : public Base { public: // 错误,不能覆盖基类的函数。 virtual void Fun() override { } };
4.override关键字:这个关键字作用在派生类中,起到提醒程序员是否有想要覆盖基类的虚函数却用错了参数。如下:
class pp { public: virtual void test();// }; void pp::test() { cout<<"test"<<endl; } class aa :public pp { public: void pp::test() { cout<<"test"<<endl; } }; class aa :public pp { public: void test(int a) override { cout<<"tt"<<endl;//错误,因为基类没有这个类型的成员函数 } void test() override { cout<<"tt"<<endl;//正确,因为基类的成员函数类型相同 } };5.关键字const
const对象只能调用const成员函数。
const对象的值不能被修改,在const成员函数中修改const对象数据成员的值是语法错误
在const函数中调用非const成员函数是语法错误
任何不会修改数据成员的函数都应该声明为const类型。如果在编写const成员函数时,不慎修改了数据成员,或者调用了其它非const成员函数,编译器将指出错误,这无疑会提高程序的健壮性。
以下程序中,类stack的成员函数GetCount仅用于计数,从逻辑上讲GetCount应当为const函数。编译器将指出GetCount函数中的错误。
classStack { public: void Push(intelem); int Pop(void); int GetCount(void)const; //const成员函数 private: int m_num; int m_data[100]; }; intStack::GetCount(void)const { ++m_num; //编译错误,企图修改数据成员m_num Pop(); //编译错误,企图调用非const函数 returnm_num; }
6.pure virtual (纯虚函数):含有纯虚函数的类称为抽象类。在基类中,只告诉一个接口,而不需要告诉具体做什么,这样就变成了纯虚函数,一个纯虚函数只是提供一个接口,不去具体实现它,而通过子类去实现,这样就实现了数据隐藏和多态。
1)实现了纯虚函数的子类,该纯虚函数在子类中就变成了虚函数,子类的子类即孙子类可以覆盖
该虚函数,由多态方式调用的时候动态绑定。
2)纯虚函数必须在子类(sub class)中实现该函数才可以使用,因为纯虚函数在基类(base class)只有声明而没有定义。
纯虚函数的定义:=0必须在virtual中
adb2
定义,告诉编译器这只是个接口,作用还不确定。
<span style="background-color: rgb(243, 255, 236);">class pp
{
public:
</span><span style="background-color: rgb(255, 0, 0);">virtual</span><span style="background-color: rgb(243, 255, 236);"> void test()=0;//纯虚函数的定义
void test1(int i);
};</span>
相关文章推荐
- C语言容易混淆的问题
- 排成一圈数3退出最后一人位置问题--C语言谭浩强版练习8.5
- c++书籍阅读清单
- 自制无线共享工具C++源代码
- C++字符串切割的两种方法
- C++字符串切割的两种方法
- C++ 中关于i++和++i的解析
- C语言实现在屏幕上输出杨辉三角
- C语言assert()函数用法总结
- c++显示转换static_cast, dynamic_cast, const_cast
- C语言字符数组和字符串注意
- 操作系统FCFS,SJF进程调度(C++)
- C++笔试面试总结
- X86-64寄存器和栈帧
- C语言基础
- X86-64寄存器和栈帧
- c/c++和java达到swap不同功能
- C语言在程序中内存
- C++11简介
- C++中数字与字符串之间的转换