面向对象程序设计(c++)面试常问——for考研复试面试

关于c++的一些面试常问问题(考研面试编程语言)

前言:

本人22考研党,已上岸,发一些复试准备整理的资料作为对考研准备的一个收尾。由于近几年基本都是线上复试,线上的话会更加注重概念的考察,本人在复试准备期间搜集了面试题,整理了很多资料。本文主要概括了c++在复试面试中可能会考察的一些问题,仅供大家参考,如果对大家有帮助,希望大家点赞哦~
本文目前仅针对的是考研复试环节,不涵盖c++全部的知识,祝大家复试顺利。与其他科目不同的是,c++的学习,更加需要读者自己亲手去写才能更好地掌握,本文仅作为一个了解。复试的时候多半会问到面向对象语言的知识,哪怕学校给的参考书目中没有这一科,在java和c++中可以选择一个进行了解学习即可。由于作者本人水平有限,若本文有任何不对欢迎大家留言指正!上岸不易,希望大家都能去到想去的地方,加油。

1. C和C++的区别

(1)C是面向过程的语言,是一个结构化的语言;而C++是面向对象的语言,主要特征是继承、封装、和多态。
(2)C和C++动态管理内存的方法不一样,C是使用malloc/free关键字, 而C++还有new / delete关键字
(3)C++中有引用的概念,但是C中没有。

2. 封装、继承、多态分别是什么意思

封装:把客观事物封装成抽象的类,将属性和行为作为一个整体,隐藏了实现细节,使得代码模块化;
继承:派生类可以继承父类的数据和方法,减少重复代码,实现了代码的重用;
多态:“一个接口,多种实现”,概括就是同样的消息被不同类型的对象接收导致完全不同的行为。

3. New的使用方法

New是c++的运算符,用来动态分配内存,New返回该数据类型的指针,具体使用如下:

Int *p = new int(10); //返回int型指针  
delete p; //释放
Int * arr = new int[10]; //数组  
delete[] arr; //释放
4. new/delete, malloc/free的关系

malloc和free是C/C++语言的标准库函数,new/delete是C++的运算符。对于非内部数据类的对象而言,光用malloc/fee无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器的控制权限之内,不能够把执行构造函数和析构函数的任务强加给malloc/free。因此C++需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理和释放内存工作的运算符delete(在析构把堆区内存释放干净)。

5. 什么是引用,引用和指针的区别

C++中的引用是给便两个起一个别名,即它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称来指向该变量。

例:

int i = 17;
double f = 1.0;

// 声明引用变量,&在这里不是取地址符号,而是引用符号
int& r = i;
double& s = f;

引用和指针的区别:
(1)指针是一个新的变量,存储另一个变量的地址,可以通过访问这个地址的方法来修改另一个变量。 引用只是一个别名,该别名仍然是代表变量本身,对引用的任何操作都代表着对变量本身的操作。
(2)引用必须在创建时被初始化,但指针可以在任何时候被初始化。
(3)引用一旦被初始化为一个对象,就不能指向别的对象;然而,指针可以在任何时候被修改为指向另一个对象。
(4)不存在空引用,引用必须连接到一块合法的内存;但是空指针是存在的。

6. 构造与析构函数

(1)构造函数(初始化) 作用在于创建对象时为对象的成员赋值
没返回值不需要写void
函数名与类名相同
可以有参数,可以重载
程序调用对象时自动调用构造函数,只调用一次
构造函数调用方法:括号法、显示法、隐式转换法。
(2)析构函数(清理) 对象销毁前系统自动调用,执行清理工作
没返回值不需要写void
函数名与类名相同,在名称前加符号~
不可以有参数,不可重载
程序在对象销毁前自动调用析构,只调用一次

7. 拷贝构造函数?

拷贝构造函数的格式为 类名(const 类名 &对象)

//拷贝构造韩式
Person(const Person &p)
{
	//将传入的对象p身上的所有属性,拷贝到自身上
	age = p.age;
}

拷贝构造函数调用时机:
1、使用一个已经创建完毕的对象来初始化一个新对象
2、值传递的方式给函数参数传值(传对象给函数,开辟空间拷贝数据)
3、值方式返回局部对象

8. 深拷贝、浅拷贝?

浅拷贝:简单的赋值拷贝操作 (浅拷贝问题:堆区的内存重复释放,可以利用深拷贝解决)
深拷贝:在堆区重新申请空间,进行拷贝操作

m_Height = p.m_Height; //编译器默认实现就是这行代码,浅拷贝
//深拷贝操作
m_Height = new int (*p.m_Height);
9. 全局区、堆和栈的区别?

全局区:存放全局变量和静态变量以及常量,程序结束后系统自动释放
堆区:存放在程序运行时动态分配的对象,比如 new 出来的对象,生存期由程序控制;若程序不释放则在程序结束时操作系统回收
栈区:用来保存定义在函数内的非静态对象,如局部变量、形参,仅在其定义的程序块运行时才存在,栈的对象由编译器自动创建和销毁。

10. 形参和实参的区别?

形参变量只有在被调用时才分配内存单元,在调用结束时, 即刻释放所分配的内存单元。因此,形参只有在函数内部有效。 函数调用结束返回主调函数后则不能再使用该形参变量。
实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。

11. 静态多态

静态多态包含了函数重载和运算符重载,进行地址早绑定
函数重载:函数名相同,根据参数类型选择不同的函数实现重载
运算符重载:对已有运算符赋予多重含义(类名 operator运算符(参数列表)),将指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参。

//通过成员函数重载运算符
Person operator+ (Person &p)
{
	Person temp;
	temp.m_A = this->m_A+p.m_A;
	temp.m_B = this->m_B+p.m_B;
	return temp;
}
//使用
Person p3 = p1.operator+(p2);
//简化为
Person p3 = p1 + p2;

//通过全局函数重载运算符
Person operator+ (Person &p1, Person &p2)
{
	Person temp;
	temp.m_A = p1.m_A + p2.m_A;
	temp.m_B = p1.m_B + p2.m_B;
	return temp;
}
//使用
Person p3 = operator+(p1,p2);
//简化为
Person p3 = p1 + p2;
12. 不能重载的运算符?(这个得知道)

. 成员访问运算符
.* 成员指针访问运算符
:: 作用域运算符
sizeof 长度运算符
?: 条件运算符

13. 必须通过成员函数重载的运算符?

= 赋值运算符
() 类型转化运算符
[] 下标访问运算符
-> 条件运算符

14. 虚函数

虚函数可以让成员函数操作一般化,用基类的指针指向不同的派生类的对象时,基类指针调用其虚成员函数,则会调用其真正指向对象的成员函数,而不是基类中定义的成员函数(只要派生类改写了该成员函数)。若不是虚函数,则不管基类指针指向的哪个派生类对象,调用时都会调用基类中定义的那个函数。虚函数是C++多态的一种表现,可以进行灵活的动态绑定。
纯虚函数:virtual 返回值类型 函数名(参数列表)= 0;

//纯虚函数
virtual void func() = 0;

纯虚函数只是一个接口,是个函数的声明而已,它要留到子类里去实现
有了纯虚函数,这个类称为抽象类,它无法实例化对象,抽象类的子类,必须要重写父类中的纯虚函数,否则也属于抽象类

15. 动态多态

派生类重写基类的虚函数,实现接口的重用,运行阶段确定函数的地址。

16. this指针是什么?

this指针指向被调用成员函数所属的对象,它隐含于每一个非静态成员函数中的特殊指针,不需要进行声明。
当对一个对象调用成员函数时,编译程序先将对象的地址赋给 this 指针,然后调用成员函数,每次成员函数存取数据成员时,都隐式使用 this 指针。
this 指针被隐含地声明为:

ClassName *const this;

不能给 this 指针赋值,即不能改变指针的指向; this 并不是一个常规变量,而是个右值,所以不能取得 this 的地址。
this指针的用途:
当形参和成员变量同名时,可用this指针来区分,解决名称冲突。
在类的非静态成员函数中如果返回对象本身,可使用return *this(链式编程思想)

Person& PersonAddAge(Person &p)
{
	this->age += p.age;
	return *this;
}
p2.PersonAddAge(p1).PersonAddAge(p1);//链式编程
17. Const与指针
Const int * p=&a; //指针常量,指针指向可改,指向的值不可改
int * Const p=&a;//常量指针,指向不可改,指向的值可改
Const int * Const p=&a; //指针指向不可改,指向的值也不可改
18. 常函数和常对象

常函数
成员函数后加const则称这个函数为常函数
常函数内不可修改成员属性
成员属性声明时加关键字mutable后在常函数中可以修改
常对象
声明对象前加const称该对象为常对象
常对象只能调用常函数

//常函数
void func() const{}
//常对象
const Person p;
19. 静态成员函数和静态成员变量?

(1)静态成员函数
所有的对象共享同一个函数
静态成员函数只能访问静态成员变量
静态成员函数也有访问权限,类外访问不到私有静态成员函数
访问方式:可通过对象访问,或者不创建对象通过类名访问。

(2)静态成员变量
所有对象共享同一份数据
在编译阶段分配内存
类内声明,类外初始化

20. 内存泄漏是什么

用动态分配的内存空间,在使用完毕后未释放,导致一直占据该内存单元,称这种情况为内存泄露, 简单说就是new出来的对象使用完没有delete。

21. C++中结构体和类的区别

与c不同的是,C++中的结构体引入了成员函数、访问控制权限等面向对象特性,他与类的不同就是结构体中的成员默认访问权限为public,而类中为private

  • 21
    点赞
  • 125
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值