面试中常见的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++的静态成员则可以在多个对象实例间进行通信,传递信息。


相关文章
|
1月前
|
安全 编译器 C语言
C++入门1——从C语言到C++的过渡
C++入门1——从C语言到C++的过渡
49 2
|
1月前
|
网络协议 编译器 Linux
【C语言】结构体内存对齐:热门面试话题
【C语言】结构体内存对齐:热门面试话题
|
15天前
|
存储 安全 编译器
在 C++中,引用和指针的区别
在C++中,引用和指针都是用于间接访问对象的工具,但它们有显著区别。引用是对象的别名,必须在定义时初始化且不可重新绑定;指针是一个变量,可以指向不同对象,也可为空。引用更安全,指针更灵活。
|
1月前
|
C语言 C++
C 语言的关键字 static 和 C++ 的关键字 static 有什么区别
在C语言中,`static`关键字主要用于变量声明,使得该变量的作用域被限制在其被声明的函数内部,且在整个程序运行期间保留其值。而在C++中,除了继承了C的特性外,`static`还可以用于类成员,使该成员被所有类实例共享,同时在类外进行初始化。这使得C++中的`static`具有更广泛的应用场景,不仅限于控制变量的作用域和生存期。
46 10
|
2月前
|
算法 机器人 C语言
ROS仿真支持C++和C语言
ROS仿真支持C++和C语言
61 1
|
1月前
|
C语言 C++
实现两个变量值的互换[C语言和C++的区别]
实现两个变量值的互换[C语言和C++的区别]
17 0
|
1月前
|
Serverless 编译器 C语言
【C语言】指针篇- 深度解析Sizeof和Strlen:热门面试题探究(5/5)
【C语言】指针篇- 深度解析Sizeof和Strlen:热门面试题探究(5/5)
|
22天前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
21 4
|
22天前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
19 4
|
22天前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
17 1