面试常见问题之C语言与C++的区别问题

目录
  • C和C++的区别
  • 关键字static在C和C++区别
    • 1. 定义局部静态变量
    • 2.限定访问区域
  • 答案
  • 结构体在C语言和C++的区别
  • C中malloc和C++的new区别
  • C++引用和C的指针有何区别
    • 1、作为函数的参数
    • 2、引用作为函数的返回值

C和C++的区别

  • C语言是一种结构化语言,其偏重于数据结构和算法,属于过程性语言
  • C++是面向对象的编程语言,其偏重于构造对象模型,并让这个模型能够契合与之对应的问题。其本质区别是解决问题的思想方法不同
  • 虽然在语法上C++完全兼容C语言,但是两者还是有很多不同之处。下面将详细讲解C和C++不同之处的常见考题

关键字static在C和C++区别

C和C++中都有关键字static关键字,那么static关键字在C和C++中的使用有什么区别?请简述之。

分析问题:在C中,用static修饰的变量或函数,主要用来说明这个变量或函数只能在本文件代码块中访问,而文件外部的代码无权访问。并且static修饰的变量存放在段存储区。主要有以下两种用途。

1. 定义局部静态变量

  • 局部静态变量存储在静态存储区,在程序运行期间都不会释放,只在声明时进行初始化,而且只能初始化一次,如果没有初始化,其自动初始化为0或空字符。具有局部变量的“记忆性”和生存周期“全局性”特点。
  • 局部变量的“记忆性”是指在两次函数调用时,第二次调用开始时,变量能够保持上一次调用结束数的值。如下例:
#include <stdio.h>

//20210520 公众号:C语言与CPP编程
void staticShow()
{
	static int a=10;
	printf("a=%d\n",a);
	a += 10;
}

int  main()
{
	for(int i=0;i<4;i++)
	{
	  staticShow();

	}
	return 0;

}

运行结果

利用生存周期的“全局性”,可以改善函数返回指针的问题,局部变量的问题在于当函数退出时其生存周期结束。而利用static修饰的局部变量却可以延长其生存期。如下所示:

#include <stdio.h>
#include <string.h>

//202105205  公众号:C语言与CPP编程
char *p = NULL;
char *helloToStr(char *b)
{
	static char a[50];
	a[0]='H';
	a[1]='E';
	a[2]='L';
	a[3]='L';
	a[4]='O';
	strcpy(a+5,b);
	p=a;
	return a;
};
int main(void)
{
	printf("%s\n",helloToStr("yang"));

	strcpy(p+5,"song");
	printf("%s\n",p);

	strcpy(p+5,"zhang");
	printf("%s\n",p);

	strcpy(p+5,"wang");
	printf("%s\n",p);

	return 0;
}

运行结果

2.限定访问区域

被static修饰的变量、函数只能被同一文件内的代码段访问。在此static不再表示存储方式,而是限定作用范围。如下所示:

//Test1.cpp
static int a;
int b;
extern void fun1()
{
	......
}

static void fun1()
{
	......
}

//Test2.cpp
extern int a;        //错误,a是static类型,无法在Test2.cpp文件中使用
extern int b;       //使用Test1.cpp中定义的全局变量
extern void fun1();    //使用Test1.cpp中定义的函数
extern void fun2();    //错误,无法使用Test1.cpp文件中static函数

在C++中除了上述的两种常用方法外还有另外一种使用方法:定义静态成员变量和静态成员函数。静态成员变量或静态成员函数表示其不属于任何一个类实例,是类的所有类实例所共有的。如下所示:

#include <iostream.h>
#include <string.h>
class A
{
public:
	static int a;
	static int geta();
	int b;
	int getb();
};
int A::a=100;
int A::geta()
{
	return a;
}
int A::getb()
{
	return b;
}

int  main(void)
{
	A m,n;
	m.b=90;

	cout<<m.geta()<<endl;
	cout<<m.getb()<<endl;
	cout<<m.a<<endl;

	n.a=33;
	n.b=44;

	cout<<m.geta()<<endl;
	cout<<m.getb()<<endl;
	cout<<m.a<<endl;
	return 0;

}

运行结果

答案

在C中static用来修饰局部静态变量和外部静态变量、函数。而C++中除了上述功能外,还用来定义类的成员变量和函数,即静态成员和静态成员函数。

注意:编程时static的记忆性和全局性的特点可以使在不同时期调用的函数进行通信,传递信息,而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是库函数,可以覆盖,并且要包含相应的头文件。

答案

  1. new、delete是操作符,可以重载,只能在C++中使用。
  2. malloc、free是函数,可以覆盖,C、C++中都可以使用。
  3. new可以调用对象的构造函数,对应的delete调用相应的析构函数。
  4. malloc仅仅分配内存,free仅仅回收内存,并不执行构造和析构函数。
  5. 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所指向的对象,如下图:

指针间赋值

引用赋值如下:

int a=1,b=2;
int &v1=a, &v2=b;

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

引用间赋值

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

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,点击获取

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

以上就是面试常见问题之C语言与C++的区别问题的详细内容,更多关于C语言与C++区别的资料请关注我们其它相关文章!

(0)

相关推荐

  • C语言中const和C++中的const 区别详解

    C语言中const和C++中的const 区别详解 C++的const和C语言的#define都可以用来定义常量,二者是有区别的,const是有数据类型的常量,而宏常量没有,编译器可以对前者进行静态类型安全检查,对后者仅是字符替换,没有类型安全检查. 而C语言中的const与C++也有很大的不同,在C语言中用const修饰的变量仍是一个变量,表示这个变量是只读的,不可显示地更改,而在C++中用const修饰过后,就变成常量了.例如下面的代码: const int n=10; int a[n];

  • 详解C++中的const关键字及与C语言中const的区别

    const对象默认为文件的局部变量,与其他变量不同,除非特别说明,在全局作用域的const变量时定义该对象的文件局部变量.此变量只存在于那个文件中中,不能别其他文件访问.要是const变量能在其他文件中访问,必须显示的指定extern(c中也是)   当你只在定义该const常量的文件中使用该常量时,c++不给你的const常量分配空间--这也是c++的一种优化措施,没有必要浪费内存空间来存储一个常量,此时const int c = 0:相当于#define c 0:    当在当前文件之外使用

  • C语言和C++的6点区别

    C语言和C++的区别 (1)面向过程语言和面向对象语言 C语言是面向过程语言,即先分析出解决问题的步骤然后再将这些步骤一一实现 C++是面向对象语言,即把问题分成若干个对象,目的是为了描述某个事物在解决整个问题的步骤中的行为 (2)关键字不同 C语言中有32个关键字,而C++有63个关键字.另外在C语言中struct关键字定义的变量不能有函数,而在C++中可以有函数 (3)文件后缀名不同 C语言中源文件的后缀名是.c,C++源文件后缀名是.cpp (4)函数返回值不同 C语言中如果一个函数没有指

  • C++、C语言和JAVA开发的区别

    1.面向对象没有java彻底. 由于C++要兼容C的内容,而C是面向过程的,所以C++不可避免地出现过程影子,并不算是完全的面向对象的程序设计语言.例如总得要有main或winmain之类的过程吧. 2.C++的移植能力没有java好. 由于C++的事实标准的存在,即各个编译器总存在差异,所以或多或少存 在不兼容.而且各个软件平台的C++启动代码和硬件指令不同,编译后的C++程序一般是不能跨平台的.而java从娘胎里出来就是为了跨平台执行的,不采 用二进制机器码作为最终代码,所以在移植方面较好.

  • 面试常见问题之C语言与C++的区别问题

    目录 C和C++的区别 关键字static在C和C++区别 1. 定义局部静态变量 2.限定访问区域 答案 结构体在C语言和C++的区别 C中malloc和C++的new区别 C++引用和C的指针有何区别 1.作为函数的参数 2.引用作为函数的返回值 C和C++的区别 C语言是一种结构化语言,其偏重于数据结构和算法,属于过程性语言 C++是面向对象的编程语言,其偏重于构造对象模型,并让这个模型能够契合与之对应的问题.其本质区别是解决问题的思想方法不同 虽然在语法上C++完全兼容C语言,但是两者还

  • C++面试常见问题整理汇总

    本文总结讲述了C++面试常见问题.分享给大家供大家参考,具体如下: 1. 继承方式 public     父类的访问级别不变 protected    父类的public成员在派生类编程protected,其余的不变 private        父类的所有成员变成private #include <iostream> using namespace std; class base { public: void printa() { cout <<"base"&

  • C语言 strcpy和memcpy区别详细介绍

    C语言 strcpy和memcpy区别详细介绍 PS:初学算法,开始刷leetcode,Rotate array的预备知识(写的代码Time Limit Exceed难过)于是百度高效算法,本篇作为预备知识. 1.strcpy和strncpy函数 这个不陌生,大一学C语言讲过,其一般形式为strcpy(字符数组1,字符串2)作用是将字符串2复制到字符数组1中去. EX: char str1[10]='',str2[]={"China"}; strcpy(str1,str2); strn

  • 从go语言中找&和*区别详解

    *和&的区别 :& 是取地址符号 , 即取得某个变量的地址 , 如 ; &a*是指针运算符 , 可以表示一个变量是指针类型 , 也可以表示一个指针变量所指向的存储单元 , 也就是这个地址所存储的值 . 从代码中验证 : 先构建一个Rect类型 : 1. &是取地址符号, 取到Rect类型对象的地址 2. *可以表示一个变量是指针类型(r是一个指针变量): 3.*也可以表示指针类型变量所指向的存储单元 ,也就是这个地址所指向的值 4.查看这个指针变量的地址 , 基本数据类型直

  • GO语言中=和:=的区别说明

    错误的做法 //声明变量a var a int //声明变量a并给变量a赋值 a := 1 //错误提示 no new variables on left side of := //说明 重复声明变量a 声明不赋值的初始化值 整型和浮点型变量的默认值为 0,如var a int,默认a=0 字符串变量的默认值为空字符串 布尔型变量默认为 bool 切片.函数.指针变量的默认为 nil 使用编译器推导类型 var a=10 //默认a为整型 特殊例子 正确 var conn net.Conn va

  • C语言中 & 和 &&的区别详解

    这是c语言的基本语法,但是在学习的过程中也总是搞混.所以记录一下,也和大家分享一下. &:按照位与操作,例如:0010&1101,结果为0000 &是java中的位逻辑运算:       eg: 2&3=2: 分析如下: 2的二进制为10 :3的二进制为11 : 逻辑&之后为10 &&:短路与,表示如果两个条件都成立则执行之后的逻辑: 例如:if(a==0&&b==0),意思就是if a为0并且b为0的时候,进行下一步操作. || 短

  • 关于C语言 const 和 define 区别

    目录 一.const 使用 1.const 修饰变量 2.const 修饰指针 3.const 修饰在函数名前面当 4.const 修饰在函数名后面 5.const 修饰函数参数 二.define 使用 1.define 定义常量 2.define 定义函数 3.define 定义多行函数 4.define 防止头文件重复包含 三.const 和 define 区别 四.const 优点 一.const 使用 const 是 constant 的缩写,"恒定不变"的意思.被 const

  • web面试之JS预解析与变量提升区别

    目录 什么是预解析? 变量和函数预解析的区别 重复声明var变量 变量提升和函数提升优先级 函数优先级大于变量优先级的深入探究 预解析流程 搜寻预解析关键字 执行预解析 几个需要注意的细节 什么是预解析? 概念: JS代码在在代码从上往下执行前,浏览器会先把所有变量声明解析一遍, 这个阶段叫预解析. 详讲 寻找作用域中的var 和function声明(匿名函数没有function声明,所以不会提升),然后对其进行事先声明, 并把赋值操作留在原地,再从上到下执行代码.这就是一个预解析的过程. 变量

  • 关于C语言strlen与sizeof区别详情

    目录 一.sizeof详解 1.sizeof()作用 2.sizeof 3.sizeof () 4.sizeof()与数组名的关系 5.sizeof()返回类型造成的坑 二.strlen详解 三.strlen与sizeof的区别 strlen 是一个函数,它用来计算指定字符串 str 的长度,但不包括结束字符(即 null 字符).strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'

  • 深入浅析C语言与C++的区别与联系

    目录 一.C语言是面向过程语言,而C++是面向对象语言 1.面向过程和面向对象的区别 2.面向过程和面向对象的优缺点 面向过程语言 面向对象语言 二.具体语言上的区别 1.关键字的不同 2.后缀名不同 3.返回值 4.参数列表 5.缺省参数 半缺省参数 全缺省参数 6.函数重载 7.const 总结 8.引用 9.malloc,free && new,delete 10.作用域 C语言虽说经常和C++在一起被大家提起,但可千万不要以为它们是一种编程语言.我们来介绍C语言和C++中的区别和联

随机推荐