面试中常见的C语言与C++区别的问题(二)

简介: 面试中常见的C语言与C++区别的问题


结构体在C语言和C++的区别


分析问题:在C中,结构体是一种简单的复合型数据,由若干个基本类型数据或复合类型数据组合而成。而在C++结构体中,还可以声明函数。如下所示:


#include <iostream.h>
struct A
{
public:
  int a;
  int gata()
  {
      return a;
  }
};
int  main(void)
{
 m.a=50;
 cout<<m.gata()<<endl;
 return 0;
}

输出结果:50


但是这种用法看起来有点不伦不类,这是C到C++过渡的遗留问题


答案


C语言的结构体是不能有函数成员的,而C++的类可以有。


C语言结构体中数据成员是没有private、public和protected访问限定的。而C++的类的成员有这些访问限定(在C++中结构体的成员也是有访问权限设定的,但是类成员的默认访问属性是private,而结构体的默认访问属性是public)。


C语言的结构体是没有继承关系的,而C++的类却有丰富的继承关系。


说明:虽然C的结构体和C++的类有很大的相似度,但是类是实现面向对象的基础。而结构体只可以简单地理解为类的前身。


C中malloc和C++的new区别


分析问题:malloc、free与new、delete都是用来动态申请内存和释放内存的。不同点如下:


malloc、free是标准库函数,new、delete则是运算符。malloc、free在C、C++中都可使用,而new、delete只属于C++。


malloc要指定申请内存的大小,其申请的只是一段内存空间。而new不必指定申请内存的大小,建立的是一个对象。


new、delete在申请非内部数据类型的对象时,对象在创建的同时会自动执行构造函数,在消亡时会自动执行析构函数,这不在编译器的控制之内,所以malloc、free无法实现。


new返回的是某种数据类型的指针,而malloc返回的是void型指针。


由于new、delete是运算符,可以重载,不需要头文件的支持,而malloc、free是库函数,可以覆盖,并且要包含相应的头文件。


答案


new、delete是操作符,可以重载,只能在C++中使用。


malloc、free是函数,可以覆盖,C、C++中都可以使用。


new可以调用对象的构造函数,对应的delete调用相应的析构函数。


malloc仅仅分配内存,free仅仅回收内存,并不执行构造和析构函数。


new、delete返回的是某种数据类型指针,malloc、free返回的是void指针。


注意:malloc申请的内存空间要用free释放,而new申请的内存空间要用delete释放,不能混用。因为两者实现的机理不同。


C++引用和C的指针有何区别


分析问题:引用就是变量或对象的别名,它不是值,不占据存储空间,其只有声明没有定义。在C++中引用主要用于函数的形参和函数返回值。


1、作为函数的参数


当函数的返回值多于一个时,可以使用指针实现。如下所示:


void swap(int *a, int *b)
{
  int temp;
  temp = *a;
    *a = *b;
  *b = temp;
}
int  main(void)
{
  int a=10,b=5;
  cout<<"Before change:"<< a<<""<<b<<endl;
  swap(&a,&b);
  cout<<"After change:"<< a<<""<<b<<endl;
  return 0;
}

输出结果:


Before change: 10 55

After change: 55 10


虽然上述代码实现了多个返回值的功能,但是函数的语法相对传值方式比较麻烦。在函数中使用指针所指对象的数值时,必须在指针前加上*,如上例中的的swap函数频繁使用了“*a”、“*b”,如此不仅书写麻烦,还不利于阅读,并且容易产生错误。在函数调用时也容易产生误解,如上述代码main函数中swap(&a, &b),看起来好像是交换了两个变量的地址似的。而用引用实现swap函数,如下所示:


void swap(int &a, int &b)
{
  int temp;
  temp = a;
        a = b;
  b = temp;
}
int  main(void)
{
  int a=10,b=5;
  cout<<"Before change:"<< a<<""<<b<<endl;
  swap(a,b);
  cout<<"After change:"<< a<<""<<b<<endl;
  return 0;
}

可以看出用引用实现swap函数比指针实现要简洁,调用也显得更加合乎情理。


2、引用作为函数的返回值


在大多数情况下可以被指针替代,但是遇到构造函数和操作符重载函数的“形式自然”的问题时,是不能被指针替代的。指针和引用功能相似,但是在操作时却有很多不同的地方,如指针的操作符是“*”和“->”,而引用常用的操作符是“.”。在使用时还要注意以下几点:


指针可不初始化且初始化的时候,可以指向一个地址,也可以为空。引用必须初始化且只能初始化为另一个变量,如下:


int a=1024;

int *p=&a;

int &b=a;

引用之间的赋值和指针之间的赋值不同。指针赋值如下:


int a=1,b=2;

int *p1=&a, *p2=&b;

这时执行p1=p2;后,p1原来指向的对象v1的值并没有改变,而p1被赋值为p2所指向的对象,如下图:

image.png



指针间赋值


引用赋值如下:


int a=1,b=2;

int &v1=a, &v2=b;

这时执行r1= r2;改变的是v1,将r 2指向的对象的值赋值给v1,而不是引用r1本身。赋值之后,两个引用还是指向各自的原来对象,如图下图。


image.png


引用间赋值


指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变。如下所示:


int a=1;
int b=2;
int &v1=a;      //v1引用a
string *pi = &a; //pi指向a
v1=b;             //v1仍旧引用a,但是a现在的值是2;
pi=&b;             //pi指向b,a没有改变

答案


指针和引用主要有以下区别:


引用必须被初始化,但是不分配存储空间。指针不声明时初始化,在初始化的时候需要分配存储空间。


引用初始化以后不能被改变,指针可以改变所指的对象。


不存在指向空值的引用,但是存在指向空值的指针。


注意:引用作为函数参数时,会引发一定的问题,因为让引用作为参数,目的就是想改变这个引用所指向地址的内容,而函数调用时传入的是实参,看不出函数的参数是正常变量,还是引用,因此可能会引发错误。所以使用时一定要小心谨慎。


关于c语言与c++面试笔试题,最近文章《为各位学弟学妹整理的C语言/C++相关笔试面试题》,也整理了一份30多页的PDF:

c语言与c++笔试面试PDF,点击获取


相关文章
|
2月前
|
程序员 C语言 开发者
pymalloc 和系统的 malloc 有什么区别
pymalloc 和系统的 malloc 有什么区别
|
2月前
|
Java 程序员
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
90 14
|
1月前
|
Java 关系型数据库 数据库
京东面试:聊聊Spring事务?Spring事务的10种失效场景?加入型传播和嵌套型传播有什么区别?
45岁老架构师尼恩分享了Spring事务的核心知识点,包括事务的两种管理方式(编程式和声明式)、@Transactional注解的五大属性(transactionManager、propagation、isolation、timeout、readOnly、rollbackFor)、事务的七种传播行为、事务隔离级别及其与数据库隔离级别的关系,以及Spring事务的10种失效场景。尼恩还强调了面试中如何给出高质量答案,推荐阅读《尼恩Java面试宝典PDF》以提升面试表现。更多技术资料可在公众号【技术自由圈】获取。
|
2月前
|
程序员 C语言 开发者
pymalloc 和系统的 malloc 有什么区别?
pymalloc 和系统的 malloc 有什么区别?
|
1月前
|
算法 编译器 C语言
【C语言】C++ 和 C 的优缺点是什么?
C 和 C++ 是两种强大的编程语言,各有其优缺点。C 语言以其高效性、底层控制和简洁性广泛应用于系统编程和嵌入式系统。C++ 在 C 语言的基础上引入了面向对象编程、模板编程和丰富的标准库,使其适合开发大型、复杂的软件系统。 在选择使用 C 还是 C++ 时,开发者需要根据项目的需求、语言的特性以及团队的技术栈来做出决策。无论是 C 语言还是 C++,了解其优缺点和适用场景能够帮助开发者在实际开发中做出更明智的选择,从而更好地应对挑战,实现项目目标。
69 0
|
2月前
|
存储 缓存 网络协议
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点,GET、POST的区别,Cookie与Session
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点、状态码、报文格式,GET、POST的区别,DNS的解析过程、数字证书、Cookie与Session,对称加密和非对称加密
|
3月前
|
存储 安全 编译器
在 C++中,引用和指针的区别
在C++中,引用和指针都是用于间接访问对象的工具,但它们有显著区别。引用是对象的别名,必须在定义时初始化且不可重新绑定;指针是一个变量,可以指向不同对象,也可为空。引用更安全,指针更灵活。
|
3月前
|
存储 C语言
C语言:普通局部变量、普通全局变量、静态局部变量、静态全局变量的区别
C语言中,普通局部变量在函数内部定义,作用域仅限于该函数;普通全局变量在所有函数外部定义,作用域为整个文件;静态局部变量在函数内部定义但生命周期为整个程序运行期;静态全局变量在所有函数外部定义,但仅在定义它的文件内可见。
162 10
|
3月前
|
存储 C语言
C语言:结构体与共用体的区别
C语言中,结构体(struct)和共用体(union)都用于组合不同类型的数据,但使用方式不同。结构体为每个成员分配独立的内存空间,而共用体的所有成员共享同一段内存,节省空间但需谨慎使用。
|
3月前
|
存储 编译器 C语言
C语言函数的定义与函数的声明的区别
C语言中,函数的定义包含函数的实现,即具体执行的代码块;而函数的声明仅描述函数的名称、返回类型和参数列表,用于告知编译器函数的存在,但不包含实现细节。声明通常放在头文件中,定义则在源文件中。