C/C++中的高频考点二

一、什么函数不能被声明为虚函数

1、可以声明为虚函数的情况
①、只有类的成员函数才能声明为虚函数
②、析构函数可以为虚函数,而且通常声明为虚函数。特别是发生在子类继承父类时,父类中的析构函数要声明为虚函数,不然导致子类析构函数不被调用,造成内存泄漏。
2、不可声明为虚函数的情况:
①、静态成员函数不能为虚函数,因为调用静态成员函数不要实例,但调用虚函数需要从一个实例中指向虚函数表以得到函数的地址;
②、内联函数不能为虚函数
③、构造函数不能为虚函数,因为构造函数是在对象完全构造之前运行的,构造函数是初始化虚表指针,而虚函数是放在虚表里面的,因此就相互矛盾了。

二、多态的原理及种类

多态是C++面向对象的一大特性,它使用“一个接口,多个实现”,通过子类重写父类的虚函数,实现了接口的重用。C++中通过虚函数实现多态。虚函数的本质就是通过基类(父类)访问派生类(子类)定义的函数,每一个含有虚函数的类,其实例对象内部都有一个虚函数表指针
多态的种类:参数多态、引用多态、过载多态以及强制多态。
参数多态是指采用参数化模板,通过给的不同的类型参数,使得一个结构有很多类型、模板;
引用多态是指同样的操作可以用于一个类型及其子类型;
过载多态是指同一个名字在不同的上下文有不同的类型;
强制多态则是把操作对象的类型强加变换,一符合函数或操作符的要求。

三、不使用C/C++字符串库函数,重写strcpy()函数

strcpy的原型为:extern char *strcpy(char *dest, const char *src); 它包含在头文件string.h中,它的返回指向dest的指针,其功能是吧src所指由NUL结束的字符串赋值到dest所指的数组中;要注意,src和dest所指内存区域不可冲动,且dest必须有足够的空间来容纳src的字符串,src字符串为的字符串结束标识符‘\0’也会被复制过去。

char* MyStrcpy(char* dest, const char *src)
{
	if ((dest == NULL) || (src == NULL))
	{
		return NULL;   //安全检查,是否为空
	}
	//也可以使用assert((dest!=NULL) && (src!=NULL));但是必须包含头文件<assert.h>
	char* address = dest;
	while ((*dest++ = *src++) != '\0');
	return address;
}

四、在嵌入式编程中,什么是大端?什么是小端?

采用小段模式的CPU对操作数的存放是从低字节到高字节而采用大端模式的CPU对操作数的存放是从高字节到低字节。

五、C语言中struct和union的区别:

struct(结构体)与union(联合体)是C语言中两者不同的数据结构;
区别:
①、结构体与联合体都是由多个不同的数据类型成员组成,但是联合体所有成员共用一块地址空间;而结构体中所有成员占有的空间是累加的,其所有的成员都存在,不同成员会存放在不同的地址。结构体变量的总长度等于所有成员长度之和;联合体的长度等于其最长的成员的长度。
②、对联合体的不同成员赋值将会重写其他成员,原来成员的值就不存在了;而对结构体的不同成员赋值是互不影响的。

六、C/C++头文件中的ifndef/define/endif的作用是什么?

如果一个项目中存在两个以上的头文件,而这些头文件都include了同一个头文件,那么在编译时,这些C文件要一起编译成一个可执行文件,因此会造成大量的声明冲突。所以把头文件的内容都放在#ifndef和#endif中:格式为:

#ifndef <标识>`
#define <标识>
...
#endif 

防止重复编译,在嵌入式开发编写模块驱动时会经常使用

七、a是变量,执行(a++)+= a语句是否合法?

本题有两个知识点:①、左值和右值的区别,②、前置运算和后置运算的区别。
左值:可以出现在表达式左边的值(=号左边),可以被改变,是储存数据值的那块内存地址,也称为变量的地址;
右值:指存储在某内存地址中的数据,也称为变量的数据;
左值可以作为右值,但是右值不能作左值。
前置运算和后置运算的区别:后置的++运算符是先将其值返回,然后其值再+1;而前置的++运算,是先将值+1,再返回其值。a++不能当做左值,a++表示取a的地址,把它的值装入寄存器,然后对内存中的a执行加1操作;而++a可以做左值使用,++a表示取a的地址,对他的内容进行加1操作,然后把值放在寄存器中。

八、在C++中实现模板函数的外部调用

export是C++新增的关键字,作用是:实现模板函数的外部调用,类似于extern关键字。
为了访问其他代码文件中的变量或对象,对普通类型(基本数据类型、结构体、类)可以使用关键字extern来使用这些变量或对象;但是对于模板类型,则需要在头文件中声明模板类和模板函数,方式:在代码文件中使用关键字export来定义具体的模板类对象和模板函数,然后在其他用户代码文件中,包含声明头文件后,就可以使用对象和函数了。

extern int n;
extern struct Point p;
extern class A a;
export template<class T>class Stack<int> s;
export template<class T> void f(T&t){...}
  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kevin的学习站

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值