1:多态性是面向对象程序设计的一个重要特征,利用多态性可以设计和实现一个易于扩展的系统.在C++语言中,多态是指具有不同功能的函数可以用同一个函数名,这样就可以用一个函数名调用不同内容的函数,发出同样的消息被不同类型的对象接受时,将导致完全不同的行为.这里所说的消息主要是指类的成员函数的调用,而不同的行为是指不同的实现. 多态通过联编实现.联编是指一个计算机程序自身彼此关联的过程.按照联编说进行的阶段不同,可分为两种不同的联编方法:静态联编和动态联编.C++中,根据两边的时刻不同,有两种类型的多…
1:代码如下: // 2.1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" void main() { float eps = 0.0000001;//定义0的精度 float fvar = 0.00001; if (fvar >= -eps && fvar <= eps) printf("等于零!\n",fvar); else printf(); } 运行结果如下:…
1:函数模板不是一个实在的函数,因此编译器不能为其生成可执行的代码.定义函数模板只是一个对函数功能框架的描述,在具体执行时,将根据传递的实际参数决定其功能. 2:函数模板定义的一般形式如下: template <类型形式参数> 返回类型 函数名(形式参数表) { ...//函数实现 } 其中template为关键字,表示定义一个模板,尖括号“<>”中为模板参数,模板参数主要有两种,一种是模板类型参数,另一种是模板非类型参数.上述代码中定义的模板使用的是模板类型参数,模板类型参数使用…
1:曾经介绍过string类型的数据,它是C++标准模版库提供的一个类.string类支持使用加号“+”连接两个string对象.但是使用两个string对象相减确实非法的,其中的原理就是C++所提供类中重载运算符的功能.在string类中定义了运算符“+”和“+=”两个符号的使用方法,这种使用方法的实质是一种成员函数. 关键字operator是专门实现类运算符重载的关键字.在类成员中,定义一个这样形式的函数: 返回值类型 operator 重载运算符(参数列表) 以box类为例,我们可以将加号…
1:对于类的非静态成员,每个对象都有自己的一份拷贝,即每个对象都有自己的数据成员,不过成员函数却是每个对象共享的.那么调用共享的成员函数如何找到自己的数据成员呢?答案是通过类中隐藏的this指针. 2:示例代码: // 7.6.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using namespace std; class CBook //定义一个CBook类 { public: int m…
1:在创建对象时,程序自动调用构造函数.同一个类中可以有多个构造函数,通过这样的形式创建一个CPerson对象,例如: CPerson p1(0,"jack",22,7000); CPerson p2=Cperson(1,"tony",25,8000); CPerson p; 2:利用构造函数初始化成员变量的代码如下: (1)person.h中 #include <string>//本题目的目的是利用构造函数初始化成员变量 using std::stri…
1:代码如下: // 6.13.cpp : 定义控制台应用程序的入口点. // #include"stdafx.h" #include<iostream> using namespace std; void main() { ][]; ];//指向int数组的指针,也可以用int *b; ]; //储存指针的数组,最多只能储存4个指针 int *p; p = a[]; //a[0]是int型指针,同样a[1] a[2] a[3]都是int型指针 b = a; //获得a[0…
1:以a[4][3]为例 a代表二维数组的地址,通过指针运算符可以获取数组中的元素 (1)a+n代表第n行的首地址 (2)&a[0][0]既可以看作第0行0列的首地址,同样也可以被看作是二维数组的首地址.&a[m][n]就是第m行n列元素的地址 (3)&a[0]是第0行的首地址,当然&a[n]就是第n行的首地址 (4)a[0]+(n-1)表示第0行第n个元素 (5)*(*(a+n)+m)表示第n行第m列 (6)*(a[n]+m)表示第n行第m列元素 2:代码如下: // 6…
1:通过指针引用数组,需要先声明一个数组,再声明一个指针. int a[10]; int *p; 然后通过&运算符获取数组中元素的地址,再将地址值赋给指针变量. p=&a[0]; 代码实例如下: // 6.9.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using namespace std; void main() { ]; int *p; //利用循环,分别为10个元素赋…
1:代码如下: // 6.1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using namespace std; void main() { ]; //利用循环,分别为10个元素赋值 ;i<;i++) a[i]=i; //将数组中的10个元素输出到显示设备 ;i<;i++) cout << a[i] << endl; } 运行结果:…
1:运行代码: // 5.9.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using std::cout; using std::endl; int plus(int b) { ; } int main() { void* pV = NULL; ; pV = plus; cout<<"执行pV指向的函数:"<<endl; result=((); c…
1:函数指针式指向函数内存的指针,一个函数在编译时被分配给一个入口地址,这个函数的入口地址就称为函数指针.可以用一个指针变量指向函数,然后通过该指针变量调用此函数. 一个函数可以返回一个整数型值.字符值.实型值等,也可以返回指针型的数据,即地址,返回值的类型是指针类型.返回指针值得函数简称指针函数. 定义指针函数的一般形式为: 类型名 *函数名(参数列表) 例如,定义一个具有两个参数和一个返回值的函数的指针及一个具有同样返回值参数列表的函数的代码如下: int sum(int x,inty);…
1:默认模板参数是指类模板中由默认的数据类型作为参数的参数,在模板定义时,还可以为默认的数据类型声明,变量,并为变量赋值.代码如下: // 9.5.cpp : 定义控制台应用程序的入口点. #include "stdafx.h" #include <iostream> using namespace std; template< > class MyTemplate { T1 t1; T2 t2; public: MyTemplate(T1 tt1,T2 tt2…
1:默认模板参数就是在类模板定义时设置类型形式参数表中的一个类型参数的默认值,该默认值是一个数据类型.有了默认的数据类型参数后,在定义模板的新类型时就可以不进行指定.代码如下: // 9.4.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using namespace std; template <class T1,class T2 = int> class MyTemplate…
1:使用template关键字不但可以定义函数模板,而且可以定义类模板.类模板代表一族类,它是用来描述通用数据类型或处理方法的机制,它使类中的一些数据成员和成员函数的参数或返回值可以取任意数据类型.类模板可以说是用类生成类,减少了类的定义和数量. 2:类模板的一般定义形式如下: template <类型形式参数表> class 类模板名 { ...//类模板体 } 类模板成员函数的定义形式如下: template <类型形式参数表> 返回类型 类模板名 <类型名表>::…
1:整形数和实型数编译器可以直接进行比较,所以使用函数模板后也可以直接进行比较,但如果是字符指针指向的字符串该如何处理呢?这时可以通过重载函数模板来实现.通常字符串需要库函数来进行比较,通过重载函数模板实现字符串的比较. 2:代码如下: // 9.2.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream > #include <string > using namespace std; te…
1:抽象类通常作为其他类的父类,如果从抽象类派生的子类是抽象类,则子类必须实现父类中的所有纯虚函数.代码如下: // 8.10.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using namespace std; class CEmployee //定义CEmployee类 { public: int m_ID; //定义数据成员 ]; //定义数据成员 ]; //定义数据成员 ; //定义…
1:包含有纯虚函数的类称为抽象类,一个抽象类至少具有一个纯虚函数.抽象类只能作为基类派生出的新的子类,而不能在程序中被实例化(即不能说明抽象类的对象),但是可以使用指向抽象类的指针.在程序开发过程中并不是所有代码都是由软件构造师自己写的,有时候需要调用库函数,有时候分给别人写.一名软件构造师可以通过纯虚函数建立接口,然后让程序员填写代码实现接口,而自己主要负责建立抽象类. 2:纯虚函数 纯虚函数是指被标明为不具体实现的虚成员函数,它不具备函数的功能.许多情况下,在基类中不能给虚函数一个有意义的定…
1:以前讲到从CBird类和CFish类派生子类CWaterBird时,在CWaterBird类中将存在两个CAnimal类的复制.那么如何在派生CWaterBird类时使其只存在一个CAnimal基类呢?C++语言提供的虚继承机制能够解决这个问题. 代码如下: // 8.8.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using namespace std; class CAnimal /…
1:单一继承是先调用基类的构造函数,然后调用派生类的构造函数,但多重继承将如何调用构造函数呢?多重继承中的基类构造函数被调用的顺序以派生表中声明的顺序为准.派生表就是多重继承定义中继承方式后面的内容,调用顺序就是按照基类名标识符的前后顺序进行的. 2:代码如下: // 8.6.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using namespace std; class CBicycle…
1:C++允许子类从多个父类继承公有的和受保护的成员,这称为多重继承. 2:多重继承的定义.多重继承有多个基类名称标识符,其声明形式如下: class 派生类名标识符:[继承方式] 基类名标识符1,...,访问控制修饰符 基类名标识符n { [访问控制修饰符:] [成员声明列表] } 声明形式中有“:”运算符,基类名标识符之间用“,”运算符分开. 3:代码如下: // 8.5.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include &l…
1:当父类含有带参数的构造函数时,创建子类的时候会调用它吗?答案是通过显示方式才可以调用. 无论创建子类对象时调用的是那种子类构造函数,都会自动调用父类默认构造函数.若想使用父类带参数的构造函数,则需要显式的方式. 2:代码如下: // 8.3.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using namespace std; class CEmployee //定义CEmployee类…
1:父类和子类中都有构造函数和析构函数,那么子类对象在创建时是父类先进行构造还是子类先进行构造?同样,在子类对象释放时,是父类先进行释放,还是子类先进行释放?这都是有先后顺序的.答案是当从父类派生一个子类并声明一个子类的对象时,它将先调用父类的构造函数,然后调用当前类的构造函数来创建对象:在释放之类对象时,先调用的是当前类的析构函数,然后是父类的析构函数. 2:实例代码如下: // 8.2.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #inc…
1:继承是面向对象的主要特征(此外还有封装和多态)之一,它使得一个类可以从现有类中派生,而不必重新定义一个新类.继承的实质就是用已有的数据类型创建新的数据类型,并保留已有数据类型的特点,以旧类为基础创建新类,新类包含了旧类的数据成员和成员函数,并且可以在新类中添加新的数据成员和成员函数.旧类被称为基类或父类,新类被称为派生类或子类. 2:类的继承形式如下: class 派生类名称标识符:[继承方式] 基类名称标识符 { [访问控制修饰符:] [ 成员声明列表] } 继承方式有3中派生类型,分别为…
1:在数组内容中我们了解到,数组是通过指针分配到的一段额定大小的内容.同样,数组也可以包含对象.声明对象数组的形式如下: box boxArray[5]; box boxArray2[2]={box(1,1,1),box(2,2,2)}; box boxArray3[3]={3,styleBox}; 值得注意的是,第一种申请对象数组的方法必须保证类中含有默认的够好函数,否则编译器将会报错.同样,可以通过对象指针申请动态数组.例如: box* box; pbox=new box[n];//n为整数…
1:当建立一个对象之后,如果不希望它的任何数据发生改变,可以将其直接声明为const对象,例如: const 类名 对象名 const对象必须初始化.我们可以调用它的数据和函数,但是不可以对他们进行修改.除此之外,const对象的this指针也还是常量.我们知道,成员函数在自己的函数体内自动为成员变量加上this指针.如何使这些内存指针就转化为const呢?仍然需要const关键字,函数声明形式如下: 返回类型 函数名(参数列表) const: 即在函数头结尾加上const.只能对类中的函数做如…
1:当函数以相应的类作为形参列表时,对象可以作为函数的参数传入.在学习函数时,我们曾提过,值传递先复制实参产生副本.那么对象的副本是怎样的呢? 复制构造函数是指类的对象被复制时所调用的函数.下面两种情况中对象都会调用复制构造函数. (1)将一个对象赋值给另外一个对象时.例如: 对象1=对象2: 对象1(对象2): 上面的程序中对象2的复制构造函数会被调用. (2)作为值传递的实参.例如: function(对象1): 在function函数体内,使用的是对象1的副本.所以之前会调用对象1的复制构…
1:指向相应对象的指针就是对象的指针,它的生明方法与其他类型一样,如下: 类名 *p; 类的指针可以调用它所指向对象的成员.形式如下: p->类成员; 2:代码如下: (1)cat.h #include <string> using std::string; class cat { public : string m_name; void sound(); cat();//构造函数 cat(string name);//构造函数 }; (2)cat.cpp #include "…
1:静态数据在程序开始时即获得空间,直到程序结束后才被收回.静态数据可以声明在函数体内,也可以声明在函数体外. 类中的静态成员与非静态成员有很大区别.从使用上来将,调用静态成员不需要实例化对象,而是以如下形式调用: 类名::静态成员 从类的设计思想来看,静态成员应该是类共用的.若想在静态函数中使用某些成员变量,可以在形参列表中实例化本类的对象,这样就可以在函数中使用该对象的成员. 2:实例代码如下: (1)human.h #include <string> using std::string;…
1:析构函数的名称标识符就是在类名标识符前面加“~”.例如: ~CPerson(); 2:实例代码: (1)title.h #include <string>//title是一个类,此为构造了一个类 #include <iostream> using std::string; class title{ public: title(string str);//这是一个构造函数 title();//这是一个无参构造函数 ~title();//这就是一个析构函数,执行的是收尾工作. st…