大一·cpp期中复习

第五章 模板

  • 数组的函数调用

    template <typename T>
    void Input(T a[]){
    }

 模板好难写啊 aaaa 特别是有重构还要我写模板。。。。服了

  • 模板中退出

用  exit(1) //不用return

第一章  对象和类

  • 构造函数(这样简便一点)

 不能被显式调用

class lin{
	private:
		int a;
		int b;
	public:
		lin():a(0),b(0){
		}
		lin(int x,int y) : a(x),b(y){
		}
		lin(const lin & x) : a(x.a),b(x.b){
		}//拷贝构造函数
};
  • 成员函数的实现

用 #include "point.h"(保存的文件名是point.h)

  • 指针状态下

    lin temp(1,2);
	lin *a;
	a = &temp;
	a->input();
	(*a).input();//显式调用
  • 析构函数

据我所看 是析构指针的 

class lin{
	private:
		int a;
		int b;
		int *c;
	public:
		lin():a(0),b(0){
		}
		lin(int x,int y) : a(x),b(y){
		}
		lin(const lin & x) : a(x.a),b(x.b){
		}
		void input(); 
		~lin(){
			delete[] c;
		};
};
  • 是char数组和string类时

    class ccchhh{
    	private:
    		char *name;
    	public:
    		ccchhh(const char *n){
    			name = new char[101];
    			strcpy(name,n);
    		}
    };

    要新建空间并且用strcpy拷贝

  • 常成员函数

 只读函数不能修改数据成员的值,也不能调用该类中非常成员函数

  •  浅拷贝和深拷贝

就是要先开一个new空间来存储后再拷贝 指针类型的一定要用深拷贝 

第二章 继承与派生

派生类继承和吸收了基类的全部数据成员和 除了构造函数、析构函数之外 的全
部成员函数。( 私有继承相当于中止了基类功能的继续派生!
多重继承就
class up : public B1,public B2{
}
  • 派生类构造函数

Circle(inta, intb, intc):Point(a,b) (需要负责调用基类的构造函数对基类成员进行初始化;派生类新增成员在自身的构造函数中进行初始化

int main()
{
Circle c(10);//基类 
Cylinder cy(5,10);//继承类 
cout<<"圆的面积为:"<<c.area()<<"\n";
cout<<"圆柱体的底面积为:"<<cy.Circle::area()<<"\n";//调用同名覆盖前的 
cout<<"圆柱体的表面积为:"<<cy.area()<<endl;
return 0;
}
  • 虚基类(virtual)

虚基类 :以此类的多个派生类为直接基类,通过多重继承产生的派生类只
继承一份该基类的成员,这样就避免了在派生类中访问这些成员时产生二
义性
#include <iostream>
using namespace std;
class B
{
protected:
int b;
public:
B(int bval)
{
cout<<"执行类B的构造函数\n";
b = bval;
}
};

class D1 : virtual public B
 {
 protected: 
 int d1;
 public:
 D1(int bval, int dval) : B(bval)
 { d1 = dval;
 cout<<"执行类D1的构造函数\n";
 }
 };
 class D2 : virtual public B
 {
 protected:
 int d2;
 public:
 D2(int bval, int dval) : B(bval)
 { d2 = dval;
 cout<<"执行类D2的构造函数\n";
 }
 };
class D3 : public D2, public D1
 {
 protected:
 int d3;
 public:
 D3(int bval, int dval1, int dval2, int dval3): D1(bval, dval1), D2(bval, dval2), B(bval)
 {
 d3 = dval3;
 cout<<"执行类Derive的构造函数\n";
 }
}
虚基类的构造函数只被调用 1
  把建立对象时所用的类称为 最终派生类 虚基类的构造函数是由 最终派生类的
构造函数 调用的
构造函数的调用顺序:
所有虚基类的构造函数(按定义顺序)
所有直接基类的构造函数(按定义时的顺序执行)
所有对象成员的构造函数(按定义时的顺序执行)
派生类自己的构造函数
析构函数的调用执行顺序与构造函数相反

第三章 虚函数与多态性

  • 抽象类和纯虚函数

好像就是可以分别调用覆盖的纯虚函数,可以直接调用不同层的(构建了一个抽象类的函数)

amazing。。。。。。。。。。。。

类体内声明了纯虚函数的类,称为 抽象类
抽象类的主要作用 :以此类为基类建立的一个类族具有一组公共的接口(即公
有成员函数),将它们定义为纯虚函数,使它们能够更有效地发挥多态特性。
抽象类声明了一族派生类的共同接口,而接口的完整实现,即纯虚函数的函数
体,要由派生类自己定义。
抽象类只能用作基类来派生出新类 不能声明抽象类的对象 ,但可以声明指向抽象类的指针
变量或引用变量。
/*纯虚函数和抽象类*/
class N{	//抽象类 
	public:
		virtual double area() = 0;//纯虚函数 
		virtual void tell() = 0;
		
};

class Point : public N{
	private:
		double x;
		double y;
	public:
		Point (double a,double b);
		double area();
		void tall();
		double getx(){
			return x;
		}
		double gety(){
			return y;
		}
};
Point::Point (double x,double y){
	this->x=x;
	this->y=y;
}
double Point::area()
{
	return 0;
}

void Point::tell(){
	cout << x << " " << y;
}

 
class cir : public Point{
	private:
		double r;
	public:
		cir(double x,double y,double r);
		double area();
		void tall();
};

cir::cir(double x,double y,double r):Point(x,y){
	this->r=r;
}

double cir::area(){
	return 3.14*r*r;
}

void cir::tall(){
	cout << getx() << " " << gety() << r;
}
void fun (N &rs){
	cout << rs.area();
	rs.tell();
}
int main(){
	N *s;
	Point p(10,20);
	cir c(5,6,10);
	
	fun(p);//用的是派生类 Point的 
	fun(c);//用的是派生类 cir的 
	s = &p;
	cout << s->area() << endl;//用的是Point的 
	s->tell();//用的是Point的
	
	
	s = &c;
	cout << s->area() << endl;//用的是cir的 
	s->tell();//用的是cir的
	
	
	
	return 0;
}
  • 虚成员函数

基类指针(或引用)仅能访问派生类中的基类部分,因此不能实现真正的
多态,需要引入 虚函数 的概念。
只有类的 普通成员函数或析构函数才能声明为虚函数
基类中的虚函数可以在派生类中被重新定义,但重新定义时必须与基类中的函
数原型 完全相同(同名覆盖) ,且无论是否用 virtual 修饰,系统都将其视为虚函数
(建议加上 virtual
当一个类的公有成员函数声明为虚函数,且在其公有派生类中被同名覆盖时:
  当用基类指针(或引用)指向这个派生类对象,并用该指针调用该函数时,系统自动用派生类中
的同名函数。
  即:当用基类指针(或引用)指向派生类对象,并用该指针调用该函数时,系统会在程序运行中
根据所指向对象的不同,自动选择执行当前指向对象所属类的成员函数,从而实现了运行时的多
态性
构造函数不能是虚函数。
析构函数可以是虚函数,且 往往被声明为虚函数
--以上引用来来至课件,非原创,禁止转载--
#include <bits/stdc++.h>
using namespace std;
class Person{
	protected:
		string name;
	public:
		virtual void input();
		virtual void display();
		virtual ~Person();
};
class Student : public Person{
	private:
		string number;
	public:
		void input();
		void display();
		~Student();
};
void Person::input(){
	string a;
	cin >> a;
	name = a;
}
void Person::display(){
	cout << name << "yes"<< endl;
}
Person::~Person(){
	
}
void Student::input(){
	string a1,a2;
	cin >> a1 >> a2;
	name = a1;
	number = a2;
}
void Student::display(){
	cout << name << " " << number << endl;
}
Student::~Student(){
	
}
int main()
{
	Person *p;
	p = new Person;
	p->input();//调用的是基类的 
	p->display();
	delete p;
	p = new Student;
	p->input();//调用的是派生类的 
	p->display();
	delete p;
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值