c/c++: 面试总结+查漏补缺(二)

1.c和c++中的struct有什么不同?

答: c和c++中struct的主要区别是c中的struct不可以含有成员函数,而c++中的struct可以。c++中struct和class的主要区别在于默认的存取权限不同,struct默认为public,而class默认为private;其次,c++中的类具有成员保护功能,并且具有继承,多态这类oo特点,而struct没有.

2.const的理解

const char*, char const*, char*const的区别问题几乎是C++面试中每次 都会有的题目。 事实上这个概念谁都有只是三种声明方式非常相似很容易记混。 Bjarne在他的The C++ Programming Language里面给出过一个助记的方法: 把一个声明从右向左读。

char * const cp; ( * 读成 pointer to )

cp is a const pointer to char

const char * p;

p is a pointer to const char;

char const * p;

同上因为C++里面没有const*的运算符,所以const只能属于前面的类型

 

3.c指针

int *p[n];-----指针数组,每个元素均为指向整型数据的指针。

int (*p)[n];------p为指向一维数组的指针,这个一维数组有n个整型数据。

int *p();----------函数带回指针,指针指向返回的值。

int (*p)();------p为指向函数的指针。

 

4.C++:memset ,memcpy 和strcpy 的根本区别?

答:#include "memory.h"

memset用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为' '或'';例:char a[100];memset(a, '', sizeof(a));

memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;例:char a[100],b[50]; memcpy(b, a, sizeof(b));注意如用sizeof(a),会造成b的内存地址溢出。

strcpy就只能拷贝字符串了,它遇到'\0'就结束拷贝;例:char a[100],b[50];strcpy(a,b);如用strcpy(b,a),要注意a中的字符串长度(第一个'\0'之前)是否超过50位,如超过,则会造成b的内存地址溢出。

strcpy

原型:extern char *strcpy(char *dest,char *src);

     {

        ASSERT((dest!=NULL)&&(src!=NULL));

        Char *address = dest;

        While((*dest++=*src++)!=’\0’)

           Continue;

        Return dest;

     }

用法:#include <string.h>

功能:把src所指由NULL结束的字符串复制到dest所指的数组中。

说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。

返回指向dest的指针。

memcpy

原型:extern void *memcpy(void *dest, void *src, unsigned int count);

     {

      ASSERT((dest!=NULL)&&(src!=NULL));

      ASSERT((dest>src+count)||(src>dest+count));//防止内存重叠,也可以用restrict修饰指针

      Byte* bdest = (Byte*)dest;

      Byte* bsrc = (Byte*) src;

      While(count-->0)

        *bdest++ = **bsrc++;

      Return dest;

     }

用法:#include <memory.h>

功能:由src所指内存区域复制count个字节到dest所指内存区域。

说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。

Memset

原型:extern void *memset(void *buffer, char c, int count);

用法:#include

功能:把buffer所指内存区域的前count个字节设置成字符c。

说明:返回指向buffer的指针。

5.new、delete、malloc、free关系

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

6.【cpp】创建类的时候用new与不用new 的区别

C++在创建对象的时候可以采用两种方式:(例如类名为Test) Test test  或者 Test* pTest = new Test()。

        这两种方法都可以实例化一个对象,但是这两种方法有很大的区别,区别在于对象内容所在的内存空间不同,众所周知(或专题一,关于内存分配),内存的分配方式有三种      

(1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。       

(2)  在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束后在将这些局部变量的内存空间回收。在栈上分配内存空间效率很高,但是分配的内存容量有限。  

(3) 从堆上分配的。程序在运行的时候用 malloc 或 new 申请任意多少的内存,程序员自己负责在何时用 free 或 delete 释放内存。

不使用new创建对象时,对象的内存空间是在栈中的,其作用范围只是在函数内部,函数执行完成后就会调用析构函数,删除该对象。

使用new创建对象是创建在堆中的,必须要程序员手动的去管理该对象的内存空间

 

7.多态,虚函数,纯虚函数

多态:是对于不同对象接收相同消息时产生不同的动作。

C++的多态性具体体现在运行和编译两个方面:

           在程序编译时多态性体现在函数和运算符的重载上;

           在程序运行时的多态性通过继承和虚函数来体现;                                      

虚函数:在基类中冠以关键字 virtual 的成员函数。 它提供了一种接口界面。允许在派生类中对基类的虚函数重新定义。

纯虚函数的作用:在基类中为其派生类保留一个函数的名字,以便派生类根据需要对它进行定义。作为接口而存在 纯虚函数不具   备函数的功能,一般不能直接被调用。

从基类继承来的纯虚函数,在派生类中仍是虚函数。如果一个类中至少有一个纯虚函数,那么这个类被称为抽象类(abstract class)。

抽象类中不仅包括纯虚函数,也可包括虚函数。抽象类必须用作派生其他类的基类,而不能用于直接创建对象实例。但仍可使用指向抽象类的指针支持运行时多态性。

8、四种强制类型转换

static_cast( expression )


用于数值类型之间的转换,也可以用于指针之间的转换,编译时已经确定好,效率高,但需要保证其安全性。
a)    指针要先转换成void才能继续往下转换。
b)    在基类和派生类之间进行转换(必须有继承关系的两个类)
子类对象可以转为基类对象(安全),基类对象不能转为子类对象(可以转换,但不安全,dynamic_cast可以实现安全的向下转换)。
static_cast不能转换掉expression的const、volatile、或者__unaligned属性


dynamic_cast < type-id> ( expression )


只能用于对象的指针和引用之间的转换,需要虚函数。
dynamic_cast会检查转换是否会返回一个被请求的有效的完整对象,否则返回NULL;
Type-id必须是类的指针、类的引用或者void *,用于将基类的指针或引用安全地转换成派生类的指针或引用。


const_cast < type-id> ( expression )


这个转换类型操纵传递对象的const属性,或者是设置或者是移除。

reinterpret_cast < type-id> ( expression )


用在任意指针类型之间的转换;以及指针与足够大的整数类型之间的转换,从整数到指针,无视大小。
 

9.怎么处理父类中的同名函数)

正常基于多继承,子类会隐藏父类中的同名函数;也可以强行调用 类名::成员函数();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值