`

C++ 纯虚函数 和 函数参数

    博客分类:
  • C++
阅读更多

纯虚函数

 

纯虚函数是在声明虚函数时被“初始化”为0的函数:
        一般形式:virtual 函数类型 函数名(参数列表)=0;

纯虚函数与抽象类

    在定义一个表达抽象概念的基类时,有时可能会无法给出某些成员函数的具体实现。这时,就可以将这些函数声明为纯虚函数。

    纯需函数的声明格式如下:

    virtual 类型 函数名(参数表)=0;

    声明了纯虚函数的基类只是用于继承,仅作为一个接口,具体功能在其派生类中实现。
    声明了纯虚函数的类,称为抽象类。抽象类只能用作基类来派生新类,而不能用来创建对象。

 

纯虚函数没有函数体;最后的“ =0” 并不代表函数返回值为 0 ,它只起形式上的作用,告诉编译器“这是纯虚函数”;这个一个声明语句,最后有分号。

声明纯虚函数是告诉编译器,“在这里声明了一个虚函数,留待派生类中定义”。在派生类中对此函数提供了定义后,它才能具备函数的功能,可以被调用。

纯虚函数的作用是在基类中为其派生类保留了一个函数的名字,以便派生类根据需要对它进行定义。如果在一个类中声明了纯虚函数,而在其派生类中没有对该函数定义,则该函数在派生类中仍为纯虚函数。

 

 

 

 

 

函数参数

 

函数参数的求值顺序  

当一个函数带有多个参数时,C++语言没有规定在函数调用时实参的求值顺序。而编译
器根据对代码进行优化的需要自行规定对实参的求值顺序。有的编译器规定自左至右,
有的编译器规定自右至左,这种对求值顺序的不同规定,对一般参数来讲没有影响。但
是,如果实参表达式中带有副作用的运算符时,就有可能产生由于求值顺序不同而造成
了二义性。例如:int z = add_int(++x, x+y);,这样,在不同的编译器就有可能生产
不同的结果。 

设置参数的默认值 

在C++语言中,允许在函数的说明或定义时给一个或多个参数指定默认值。但是,要求在
一个指定了默认值的参数的右边,不能出现没有指定默认值的参数。例如: 

int add_int(int x, int 10); 

在上述对函数add_int()的说明中,对该函数的最右边的一个参数指定了默认值。 

在函数调用时,编译器按从左至右的顺序将实参与形参结合,当实参的数目不足时,编译
器将按同样的顺序用说明中或定义中的默认值来补足所缺少的实参。例如,如有下列的函
数调用表达式: 

add_int(15) 

它将与下列调用表达式: 

add_int(15, 10) 

是等价的。 

在给某个参数指定默认值是,不仅可以是一个数值,而且还可以是任意复杂的表达式。 

使用数组作函数参数 

数组作函数参数可以分为如下三种情况:(这三种情况的结果相同,只是所采用的调用
机制不同) 

1. 形参和实参都用数组 

调用函数的实参用数组名,被调用函数的形参用数组,这种调用的机制是形参和实参共
用内存中的同一个数组。因此,在被调用函数中改变了数组中某个无素的值,对调用函
数该数组的该元素值也被改变,因为它们是共用同一个数组。 

2. 形参和实参都用对应数组的指针 

在C++中,数组名被规定为是一个指针,该指针便是指向该数组的首元素的指针,国为
它的值是该数组首元素的地址值,因此,数组名是一个常量指针。 

实际中,形参和实参一个用指针,另一个用数组也是可以的。在使用指针时可以用数组
名,也可以用另外定义的指向数组的指针。 

3. 实参用数组名形参用引用 

如何对数组类型使用引用方式,这里先做如下说明:先用类型定义语句定义一个int型的
数组类型,如下所示: 

typedef int array[8]; 

然后,使用array来定义数组和引用。 

示例: 

#include <iostream.h> 
typedef int array[8]; 
int a[8] = {1, 3, 5, 7, 9, 11, 13}; 
void fun(array &b, int n) 
{ 
for(int i=0; i<n-1; i++) 
b[7]+=b[i]; 
} 

void main() 
{ 
int m=8; 
fun(a, m); 
cout<<a[7]<<endl; 
} 
 


该程序中,在fun()函数中,使用了引用作形参,调用时所对应的实参应该是一个数组
名,这里的引用是给数组起个别名。在fun()函数中对数组b的操作,就相当于b所引用
数组a的操作。在C++中,常用这种调用方式。

分享到:
评论

相关推荐

    深入解析C++编程中的纯虚函数和抽象类

    C++纯虚函数详解 有时在基类中将某一成员函数定为虚函数,并不是基类本身的要求,而是考虑到派生类的需要,在基类中预留了一个函数名,具体功能留给派生类根据需要去定义。 纯虚函数是在声明虚函数时被“初始化”为0...

    C++学习篇?纯虚函数和抽象类

    纯虚函数是一种特殊的虚函数,它的一般格式如下:  class &lt;类名&gt;  {  virtual &lt;类型&gt;&lt;函数名&gt;(&lt;参数表&gt;)=0;  …  };  在许多情况下,在基类中不能对虚函数给出有意义有实现,而把它说明为...

    题目:显示宠物信息(Dev C++运行可通过但是会警告)(纯虚函数、父类指针、动态多态性、继承)

    纯虚函数void Speak (); 纯虚函数void GetInfo; (2) 在Pet类的基础上派生出猫类Cat: 数据成员(protected): int id; // 猫的编号; 函数成员(public): 构造函数 (提示: 自已定义其形式,注意基类的构造...

    C++中虚函数和纯虚函数定义

     一个成员函数被声明为虚函数后,在同一类族中的类不能再定义一个非virtual的但与该虚函数具有相同的参数(包括个数和类型)和函数返回值类型的同名函数。  根据什么考虑是否把一个成员函数声明为虚函数?  ①...

    虚函数与纯虚函数(C++与Java虚函数的区别)的深入分析

    c++虚函数1.定义:在某基类中声明为 virtual 并在一个或多个派生类中被重新定 义的成员函数 [1]2.语法:virtual 函数返回类型 函数名(参数表) { 函数体 }3.用途:实现多态性,通过指向派生类的基类指针,访问派生...

    C++编写计算三角形、正方形和圆形面积程序

    编写一个程序,计算三角形、正方形和圆形这3种图形的面积,并用相关数据进行测试。...掌握虚函数和纯虚函数的概念。 理解静态多态性和动态多态性,学习使用虚函数的继承实现动态多态性。 了解抽象类的概念。

    C++入门指南-v2.4.pdf

    5.3 纯虚函数和抽象类 95 六、C++运算符重载 97 6.1 运算符重载语法介绍 97 6.2 可重载运算符与不可重载运算符 98 6.3 一元运算符重载 99 6.4 二元运算符重载 102 6.5 关系运算符重载 104 6.6 输入/输出运算符重载(&gt;...

    Visual C++开发经验技巧宝典(第1章)

    0079 C++与C++.NET中纯虚函数的区别 33 0080 C++.NET中数据类型转换的方法 33 0081 在C++.NET中如何定义具有输出参数的函数 33 0082 C++.NET中如何实现方法的默认参数 33 0083 在C++.NET中如何获取系统信息...

    鸡啄米:C++编程入门系列

    鸡啄米的资料,大家可以上官网看。... 鸡啄米:C++编程入门系列之四十九(多态性:纯虚函数和抽象类) 第九部分:异常处理 鸡啄米:C++编程入门系列之五十(异常处理) 鸡啄米:C++编程入门系列之目录和总结

    C++的概念/解释,可打印,华南师范大学C++考过。

    61. 试说明虚函数和纯虚函数有什么区别 13 62. 基类指针可以指向派生类的对象, 为什么派生类的指针不能指向基类对象? 13 63. 如果一个派生类新增加的数据成员中有一个对象成员,试描述派生类的构造过程 13 64. 为...

    传智播客_C++基础课程讲义_v1.0.7

    4 默认参数和占位参数 6 5 函数重载(Overroad) 6 8附录 6 附录1:C++语言对C语言扩充和增强的几点具体体现 6 附录2:C语言register关键字—最快的关键字 6 一、皇帝身边的小太监----寄存器 6 2、类和对象 6 1前言 ...

    -C++参考大全(第四版) (2010 年度畅销榜

    6.9 传统的与现代的函数参数声明 第7章 结构、联合、枚举和用户定义的类型 7.1 结构 7.2 结构数组 7.3 向函数传递结构 7.4 结构指针 7.5 结构中的数组和结构 7.6 位域 7.7 联合 7.8 枚举 7.9 用sizeof来保证可移植...

    C++编程思想习题

    7.3函数参数和返回值 7.3.1传递const值 7.3.2返回const值 7.3.3传递和返回地址 7.4类 7.4.1类里的const和enum 7.4.2编译期间类里的常量 7.4.3const对象和成员函数 7.4.4只读存储能力 7.5可变的(volatile) 7.6小结 ...

    Absolute C++中文版(原书第2版)-完美的C++教程,文档中还包含英文版

    15.1.3 抽象类和纯虚函数 448 15.2 指针和虚函数 451 15.2.1 虚函数和扩展类型兼容性 451 15.2.2 向下转换和向上转换 456 15.2.3 C++如何实现虚函数 457 第16章 模板 461 16.1 函数模板 461 16.2 类模板 ...

    基于施耐德算法的曲线拟合_使用C ++11 和 OpenSceneGraph 编写(可视化)

    这意味着,您必须对其进行子类化,并为纯虚函数和某些运算符(例如,点积、叉积等)提供自己的实现。以下小节描述了函数列表及其预期行为。 构造函数 构造函数不需要任何实现,但它需要为使用的模板提供参数列表。...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    4.3 函数参数和函数的值 4.3.1 形式参数和实际参数 4.3.2 函数的返回值 4.4 函数的调用 4.4.1 函数调用的一般形式 4.4.2 函数调用的方式 4.4.3 对被调用函数的声明和函数原型 *4.5 内置函数 *4.6 函数的重载 *4.7 ...

    C++ Primer第四版【中文高清扫描版】.pdf

    15.6 纯虚函数 502 15.7 容器与继承 503 15.8 句柄类与继承 504 15.8.1 指针型句柄 505 15.8.2 复制未知类型 507 15.8.3 句柄的使用 508 15.9 再谈文本查询示例 511 15.9.1 面向对象的解决方案 513 15.9.2 值型句柄 ...

    About Exceptions and Exception Handling

    当遇到下列情况时,程序会出现异常: ...类的纯虚函数被调用; 申请内存失败(内存空间不足); 一个非法的参数被传递给C++函数; C运行时库检测到一个错误并且需要程序终止执行。

    VC学习文档 当对两个值做比较的时候,将常量放在前面,如果逻辑错误的话,编译时就会出错,例如:

    当父类中定义了纯虚函数,子类中必须将其功能化才能进行实例化,,否则子类于是抽象类。 再程序入口函数定义的变量或对象都会再编译的时候进入入口函数WinMain()之前分配内存空间。代码再入口函数之前执行。

Global site tag (gtag.js) - Google Analytics