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

简介: 面试中常见的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;
}



运行结果

image.png


利用生存周期的“全局性”,可以改善函数返回指针的问题,局部变量的问题在于当函数退出时其生存周期结束。而利用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;
}


运行结果

image.png

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;
}


运行结果

image.png


答案


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


注意:编程时static的记忆性和全局性的特点可以使在不同时期调用的函数进行通信,传递信息,而C++的静态成员则可以在多个对象实例间进行通信,传递信息。


相关文章
|
7天前
|
存储 调度 C++
【操作系统】进程与线程的区别及总结(非常非常重要,面试必考题,其它文章可以不看,但这篇文章最后的总结你必须要看,满满的全是干货......)
【操作系统】进程与线程的区别及总结(非常非常重要,面试必考题,其它文章可以不看,但这篇文章最后的总结你必须要看,满满的全是干货......)
35 1
|
7天前
|
存储 Linux C语言
c++进阶篇——初窥多线程(二) 基于C语言实现的多线程编写
本文介绍了C++中使用C语言的pthread库实现多线程编程。`pthread_create`用于创建新线程,`pthread_self`返回当前线程ID。示例展示了如何创建线程并打印线程ID,强调了线程同步的重要性,如使用`sleep`防止主线程提前结束导致子线程未执行完。`pthread_exit`用于线程退出,`pthread_join`用来等待并回收子线程,`pthread_detach`则分离线程。文中还提到了线程取消功能,通过`pthread_cancel`实现。这些基本操作是理解和使用C/C++多线程的关键。
|
4天前
|
C语言 图形学 C++
|
12天前
|
存储 网络协议 编译器
【干货总结】Linux C/C++面试知识点
Linux C/C++基础与进阶知识点,不仅用于面试,平时开发也用得上!
429 8
|
16天前
|
存储 安全 编译器
C语言面试题11至20题
在C语言中,可以使用以下方式实现循环: for循环:用于确定次数的循环。 for (int i = 0; i < 10; i++) { // 循环体 } while循环:用于条件控制的循环。 while (condition) { // 循环体 } do-while循环:至少执行一次的条件循环。 do { // 循环体 } while (condition); 通过深入理解这些面试题,可以更好地准备编程面试,展示对编程原理和技术细节的深刻掌握。
16 3
|
16天前
|
存储 缓存 C语言
C语言面试题30至39题
. 用变量a给出下面的定义 由于题目未明确定义,这里给出几个常见定义: 整数变量:int a; 字符变量:char a; 浮点变量:float a; 双精度浮点变量:double a; 指针变量:int *a; 通过理解和掌握这些面试题,可以更好地准备编程面试,展示对编程原理和技术细节的深刻掌握。
17 2
|
15天前
|
C语言 C++ 编译器
【C++语言】冲突-C语言:输入输出、缺省参数、引用、内联函数
【C++语言】冲突-C语言:输入输出、缺省参数、引用、内联函数
【C++语言】冲突-C语言:输入输出、缺省参数、引用、内联函数
|
1天前
|
自然语言处理 C语言 C++
程序与技术分享:C++写一个简单的解析器(分析C语言)
程序与技术分享:C++写一个简单的解析器(分析C语言)
|
7天前
|
C语言
C语言--指针数组和数组指针的区别
C语言--指针数组和数组指针的区别
|
15天前
|
C语言 C++
【C++语言】冲突-C语言:命名空间
【C++语言】冲突-C语言:命名空间