Feed on
Posts
Comments

Tag Archive 'C/C++ 备忘'

重载、覆盖、隐藏

这里讲重载(overload)、覆盖(override)、隐藏是基于OOP的继承、多态来阐述。 三者有一点是完全相同的,那就是讨论的函数都是同名的。
1、重载比较好理解,是指与许存在多个同名函数,而这些函数的参数表不同(或者参数个数不同、或者参数类型不同、或者两者皆不同)。注意:仅仅是函数的返回值不同的重载,编译器是会嗷嗷叫的!
类成员函数被重载的特征:

相同的范围(在同一个类中);
函数名字相同;
参数不同(或者参数个数不同、或者参数类型不同、或者两者皆不同);
virtual 关键字可有可无。

这里要偏离下主题,备案一个刚刚获知的知识点。一直以来,我以为复制构造函数有以下两种重载原型:
Myclass(Myclass &);
Myclass(const Myclass &);
今天又学一手,还有第三种复制构造函数原型:
Myclass(volatile Myclass &);
2、言归正传,而覆盖是指派生类函数覆盖基类函数,它总是和继承、多态扯上千丝万缕的关系,可谓你中有我,我中有你!它的特征如下:

不同的范围(分别位于派生类与基类);
函数名字相同;
参数相同(vs2005里两个函数的返回值也要一样,否则报error);
基类函数必须有virtual 关键字。

也就是说分别处于互为继承关系的类中,两个完全相同的一模一样的虚函数才有覆盖的概念!
看如下代码:
#include <iostream>
using namespace std;
class base{public:    void f(int x) { cout<< “base::f(int)” << endl; }    void f(float y) { cout << “base::f(float)” << endl;}    virtual void g(void) { cout << “base::g(void)” << endl; }};
class derived:public base{public:
    //这里的virtual可要可不要,因为基类函数有virtual,继承类同名同参数函数自动加上virtual    virtual void g(void) { cout << “derived::g(void)” << endl;}};
int [...]

Read Full Post »

#pragma预处理指令

在所有编译预处理指令中,#pragma指令是最复杂的,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。它的格式一般为:#pragma para  其中para为参数。下面罗列一些我见到过的参数。
1.message 参数
使用方法:#pragma message(“文本消息”)
作用:当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。注意:这里的编译输出窗口不是指打印程序输出结果的那个黑黑控制台窗口,而是指IDE下面输出编译信息,例如:给你报编译错误的那个窗口。
2. warning 参数
例如:#pragma warning(diable:4507;once:4385;error:164)
           #pragma  warning(disable:4507  34)    //  不显示4507和34号警告信息             #pragma  warning(once:4385)                //  4385号警告信息仅报告一次             #pragma  warning(error:164)                //  把164号警告信息作为一个错误。 
同时这个pragma  warning  也支持如下格式:             #pragma  warning(  push  [  ,n  ]  )             #pragma  warning(  pop  )  这里n代表一个警告等级(1~4)。             #pragma  warning(  push  )保存所有警告信息的现有的警告状态。             #pragma  warning(  push,  n)保存所有警告信息的现有的警告状态,并且把全局警告  等级设定为n。               #pragma  warning(  [...]

Read Full Post »