c++复习总结


c++面向对象复习

c++考试主要是选择题和判断题考基本概念,然后是上机编程,所以我总结了做过的选择判断题的一些概念和一些基本代码。

此篇博客主要涉及类与对象,继承,友元,运算符重载,多态等知识点

<1>常考基本概念

1.       类是创建对象的样板

2.       类是抽象数据类型的实现

3.       类是具有共同行为的若干对象的统一描述

4.       面向对象系统所包含的要素:继承,类,对象

5.       面向对象程序设计将数据与对数据的操作放在一起,作为相互依存、不可分割的整体来处理

6.       面向对象的封装性是一种信息隐藏技术,目的在于将于对象的使用者和设计者分开,使用者不必知道对象行为实现的细节,只需设计者提供的协议命令对象支做即可

7.       操作是对象的动态属性

8.       对象间的通信靠信息传递

9.       对象是属性和方法的分装体

10.   在面向对象中一个对象请求另一个对象为其服务的方式是发送消息

11.   类和对象的关系是一种数据类型与变量的关系

12.   类是对某一类对象的抽象

13.   对象是类的具体实例

14.   自身类的对象不能作为该类的成员

15.   在c++语言中,也可以使用struct(结构体)来定义一个类

16.   成员函数可以是静态的,成员函数可以设置参数的默认值,成员函数可以重载,但是,成员函数不一定是内联函数

17.   友元函数不是类的成员函数

18.   可以在类外引用对象的公有数据成员,而且还可以调用对象的公用成员函数,但必须指出对象名

19.   当所有类都是私有的,在一个类中至少有一个公有的成员函数,作为对外接口,否则就无法对对象进行任何操作

20.   如果为一个对象定义了一个引用变量,它们是共占同一段存储单元的,实际上它们是同一个对象不同的名字

21.   访问对象的三种方法:通过对象名和成员运算符访问对象中的成员,通过指向对象的指针访问对象中的成员,通过对象的引用变量访问对象中的成员

22.   公用成员函数时用户使用类的对外接口

23.   类中被操作的数据时私有的,实现的细节对用户是隐蔽的,这种实现称为私有实现

24.   类的作用是把数据和算法封装在用户的抽象数据类型中

25.   在类中如果不做特别说明,所有的成员函数均为公有类型

26.   类是一种用户自定义的类据类型

27.   只有类中的成员函数,才能存取类中的私有类型

28.   具有转换函数功能的构造函数是带有一个参数的构造函数

29.   构造函数不具备的特征是构造函数需要指定类型说明

30.   析构函数没有参数没有返回值,一个类中只能定义一个析构函数、

31.   最先被调用的构造函数,其对应的(同一对象中的)析构函数最后被调用,而最后被调用的构造函数,其对应的析构函数最先被调用

32.   如果定义的是局部自动对象(例如在函数中定义的对象),则在建立对象时调用其构造函数

33.   在全局范围中定义的对象(即在所以函数之外定义的对象),它的构造函数在文件中的所有函数(包括main函数)执行之前调用

34.   如果在函数中定义静态(static)局部对象,则只在程序第一次调用此函数建立对象时调用构造函数一次

35.   由对象组成的数组称为对象数组

36.   在建立数组时,要调用构造函数,如果有50个元素,就需要调用40次构造函数

37.   对象有地址,存放对象初始地址的指针变量就是指向对象的指针变量

38.   对象中的成员也有地址,存放对象成员地址的指针变量就是指向对象成员的指针变量

39.   对象空间的起始地址是对象指针

40.   一旦生成一个对象,该对象的this指针就指向该对象本身

41.   在类的非静态函数中this指针指向调用该函数的对象

42.   在建立对象时,编译系统会为每一个对象分配一定的存储空间,以存放其成员

43.   如果已经定义了一个常对象,只能调用其中的const成员函数,不能调用非const函数

44.   只能通过构造函数的参数初始化表对常数据成员进行初始化

45.   关于new运算符:使用它创建对象时要调用构造函数;它可以用来创建对象和对象数组;使用它创建的对象或者对象数组,可以使用运算符delete删除

46.   当对象时静态时,在程序运行过程中,对象所占的空间是不能随时释放的

47.   默认情况下,new和malloc基本是等同的

48.   复制构造函数也是构造函数,但它只有一个参数,这个参数是本类的对象

49.   在c++语言中,如果不自定义类的拷贝构造函数,则每个类都有默认的拷贝构造函数

50.   静态数据成员是所有对象所共有的

51.   友元本身并不是类的成员

52.   一个类的友元函数能够访问该类的所有成员

53.   C++不允许将构造函数和析构函数声明为友元函数

54.   友元的作用是提高程序的运行效率

55.   某类中的友元类的所有成员函数可以存取或者修改该类中的私有成员

56.   运算符重载不能够改变语法结构

57.   ?:和::不能够重载

58.   将运算符重载为类的成员函数时,其参数表中没有参数,说明该运算符是前缀一元运算符

59.   在成员函数中进行双目运算符重载时,其参数表中应该带有1个参数

60.   派生类是基类的具体化,而基类则是派生类的抽象

61.   构造函数和析构函数是不能从基类继承的

62.   在私有继承中,基类中所有成员对派生类的对象都是不可见的

63.   如果派生类没有实现基类的一个纯虚函数,则该派生类是一个抽象类

64.   对基类成员的初始化必须在派生类构造函数中的参数初始化表处进行

65.   派生类对象可以向基类对象赋值

66.   如果函数的参数是基类对象或基类对象的引用,相应的实参可以用子类对象

67.   C++支持两种多态性,分别是编译时和运行

<2>常考/基本代码

1.对象数组

对象数组:每一个数组元素都是对象的数组,也就是说,若一个类有若干对象,我们把这一系列的对象用一个数组来存放
定义一个一维数组的格式:
类名 数组名[下标表达式]
使用对象数组时只能访问单个数组元素,其一般格式:
 数组名[下标].成员名

例:

 int mian(){
	int i;
	float x;
	Circle A[2];
	x.A[1].area(2);
	cout<<"圆1的面积:"<<x<<endl;
	Circle A[2];
	x.A[1].area(2);
	cout<<"圆2的面积:"<<x<<endl;
}

  

 

2.拷贝构造函数

例:

类中:
private:
    int length,width,heigth;
public:
    Block(Block & p){
    length=p.length;
    width=p.width;
    height=p.height;
    cout<<"拷贝构造函数被调用"<<endl;
    }

类外:
Block ::Block(Block & p)
{ length
=p.length; width=p.width; height=p.height; cout<<"拷贝构造函数被调用"<<endl; }

 

3.new 和delete 的使用

new/delete 是c++中的运算符,类似于malloc/free,程序运行得开辟内存空间(堆)
new 可以为内置类型的变量开辟空间,数组变量,类的对象开辟空间。这是在堆上开辟内存,返回一个指向该内存空间的地址。

//类对象开辟内存
class Crectangle{
	...
		void setvalue(int a,int,b){
			...
	}
}
int main{
	...
	Crectangle *Ptr=new Crectangle();
	Ptr->setvalue(l,w);
	delete Ptr;
	return 0;
}

4.const的使用

//修饰函数
void Print() const{...}
//修饰成函数参数
void getx(const int x){...}
//修饰函数返回值
const int *a=malloca();
//修饰成员变量
const int a1=a2;
//修饰指针变量

//const修饰指针指向的内容,则内容为不可变量
const int *a=1;

//const修饰指针,则指针为不可变量
int a=8;
int * const p=&a;
*p=9;

//const修饰指针和指针指向的内容,则指针和指针指向的内容都是不可变量
int a=8;
const int* const p=&a;

 

5.数组的输入

//主函数定义数组与初始化
int a[5],i;
ArrayDate X;
cout<<"input data"<<endl;
for(i=0;i<5;i++){
    cin>>a[i];
}
X.setdata(a,5);

//类的成员函数
void setdata(int ar[],int m){
    int i;
    count=m;
    arr=new int[count];
    for(i=0;i<count;i++){
        arr[i]=ar[i];
    }
}

6.

 

7.动态分配内存,为数组字符串赋值的方法

private:
    char* msg;
public:
    Base(){
        msg=NULL;
    }
    void setvalue(char* str){
        msg=new char[strlen(str)];
        strcpy(msg,str);
        cout<<"Base:"<<msg<<endl;
    }
    ~Base(){
        if(msg!=NULL){
            delete[] msg;
        }
    }

 

8.多继承派生类构造函数的初始化;在派生类中通过基类的成员函数为基类的私有成员赋值

class A{
private:    int a;
    ...
}
class B{
private:    int b;
    ...
    void setB(int m){
        b=m;
    }
}
class C:public A,public B{
private:    int c;
public:
    C(int a,int b,int c1):A(a),B(b){
        c=c1;
    }
    void setC(int x,int y){
        c=x;
        setB(y);
    }
}

9.

(1)       如果是数组则用strcmp,如果是string,则直接用等于号

(2)       非成员函数需要用友元函数

Strcmp()如果两个数相等,则返回0,所以,if(非0),则不相等,返回false

例:设某个类中有name,id两个成员,比较如果两个对象的id,判断是否id相同

bool operator ==(people &a){
    if(strcmp(a.id,id))
        return false;
    else
        return true;
}
bool operator ==(people & a){
    if(a.id==id)
        return true;
    else
        return false;
}

10.单元运算符++的重载

class Point{
private:
    int x,y;
public:
    Point(){}
    Point(int a=0,int y=0){
        x=a;
        y=b;
    }
    Point& operator ++();//前缀形式
    Point operator ++(int);//后缀形式
};
Point& Point::operator ++(){
    ++x;
    ++y;
    return *this;
}
Point Point::operator ++(int c){
    Point temp=*this;
    ++x;
    ++y;
    return temp;
}

11.基类与派生类有同名函数时 ,如何在派生类中调用基类的同名函数

class A{
    ...
    void show(){
        cout<<"基类A="<<a<<endl;
    }
};
class C{
    ...
    void show(){
        cout<<"派生类C="<<c<<endl;
    }
    void showC(){
        A::show();
        cout<<"派生类C="<<c<<endl;
    }
};

12.基类定义一个指针*a,派生类定义一个对象b,基类定义&c是b的引用名,指针指向b的引用名,即&c,即可用指针调用派生类与基类的同名函数(这种调用方式的基类在定义同名函数时,必须加virtual)

Base *pb,*pa,ta(a);
Triangle tr(2,2,4);
Base &ya=tr;
pa=&tr;
pa->area();

13.

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM