您的位置:首页 > 编程语言 > C语言/C++

c++primer——面向对象编程关键字

2015-10-15 17:27 267 查看
1.虚函数:virtual关键字来定义,主要是基类的派生类,作用是为了派生类可以在相同函数名的时候,可以有自己的功能,而不用执行基类的行为。

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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: