IE盒子

搜索
查看: 114|回复: 0

C/C++(面试问答)

[复制链接]

2

主题

5

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2023-3-26 13:18:16 | 显示全部楼层 |阅读模式
1. 面向对象与面向过程的区别
面向对象编程(Object-oriented programming,OOP)和面向过程编程(Procedural programming)是两种不同的编程范式。
面向对象编程强调将问题看作是由各种不同类型的对象组成的,而且每个对象都有自己的行为和状态,这些对象之间可以相互交互、协作,从而实现特定的功能。面向对象编程语言的特点包括封装、继承和多态。
封装指的是将数据和操作数据的方法封装在一起,只对外部暴露必要的接口。这样可以隐藏内部实现细节,提高了代码的安全性和可靠性。
继承是指子类可以继承父类的属性和方法,并且可以通过对这些属性和方法的修改和扩展来实现自己的特殊需求。继承可以提高代码的可重用性和可维护性。
多态是指同一个方法或者同一个类在不同的对象上可以有不同的实现方式。这样可以提高代码的灵活性和可扩展性。
面向过程编程则强调问题的解决过程,将问题分解成一系列的步骤,通过调用各种子程序来实现。面向过程的代码通常由一些函数或者方法组成,每个函数都是一个执行特定任务的过程,函数之间通过参数传递数据和结果。
面向对象编程更加强调模块化和可重用性,适用于需要处理复杂数据结构和大量对象的场景;而面向过程编程更加直接,适用于简单、线性的问题。

2. 说说C语言和C++的区别
1.  C语言是C++的子集,C++可以很好兼容C语言。但是C++又有很多新特性,如引用、智能指针、auto变量等。
2. C++是面对对象的编程语言;C语言是面对过程的编程语言。
3. C语言有一些不安全的语言特性,如指针使用的潜在危险、强制转换的不确定性、内存泄露等。而C++对此增加了不少新特性来改善安全性,如const常量、引用、cast转换、智能指针、try—catch等等;
4. C++可复用性高,C++引入了模板的概念,后面在此基础上,实现了方便开发的标准模板库STL。C++的STL库相对于C语言的函数库更灵活、更通用

3.  跨平台性
跨平台性指的是软件或应用程序能够在多个操作系统或硬件平台上运行,而不需要进行修改或重新编译。这种能力可以使开发人员在不同平台上开发软件,同时也能使用户在不同的平台上使用软件,极大地提高了软件的灵活性和可移植性。
4. const的用法
  const 是 C++ 中用来修饰对象或函数的关键字,表示该对象或函数在程序执行期间不可修改。在 SQL 中,const 通常用于查询语句的 WHERE 子句中,表示某个条件是不可变的,可以通过预编译或优化器在查询执行前进行计算或替换,从而提高查询效率。
下面是 const 的用法示例:

用法示例
对象 constconst int
  MAX_NUM = 100;
指针指向的对象 constconst char*
  p_str = "Hello, world!";
const 成员函数class Student
  {public: int getAge() const;};
const 引用参数void
  print(const std::string& str);
const 限定符SELECT * FROM
  student WHERE id = const_id;
5. C语言里面main函数有什么参数?分别有什么作用?
在C语言中,main函数可以有两个参数:argcargv
argc是一个整数类型的变量,表示命令行参数的数量,包括程序名称本身。
argv是一个字符指针数组,用来存储命令行参数的值。每个参数都是一个字符串,存储在argv数组中的一个元素中。argv[0]存储程序的名称,argv[1]存储第一个参数,以此类推。

6. 引用和指针的区别、联系
引用和指针是C++中两种重要的变量类型,它们有一些区别和联系:

1. 定义方式:引用是一个别名,指针是一个变量,需要使用*来定义。
2. 内存占用:引用不占用内存,指针占用内存。
3. 对空指针的处理:引用必须初始化,不允许为空,指针可以不初始化,可以为空。
4. 引用不能改变引用对象的地址,而指针可以改变指针变量的指向。
5. 引用作为函数参数传递时可以简化代码,指针作为函数参数传递时可以实现传递数组、动态内存分配等操作。
6. 引用可以用于返回值,指针也可以用于返回值,但是需要注意内存管理问题。

总之,引用和指针都是用来操作内存中的变量的,它们在某些情况下可以互相替代,但是在一些特定的情况下,它们之间还是有明显的区别。

7. 传值和引用的区别
传引用更快,可以修改
8. 不借助第三个数,实现两个数的交换
*a = *a + *b; *b = *a - *b; *a = *a - *b
9. C++中的值传递和引用传递的区别,在汇编语言上是相同的吗?
C++中的值传递和引用传递的区别是,值传递是将实参的值拷贝一份传递给形参,在函数内部修改形参的值不会影响到实参的值;引用传递是将实参的地址传递给形参,在函数内部修改形参的值会影响到实参的值。
在汇编语言上,值传递和引用传递的实现方式是不同的。值传递的实现方式是将实参的值压入栈中,然后调用函数,函数内部将栈中的值拷贝到一个新的栈空间中,进行操作。引用传递的实现方式是将实参的地址压入栈中,然后调用函数,函数内部通过地址访问实参的值进行操作。因此,值传递和引用传递在汇编语言上是不同的。

10. c++多态有什么优点
1. 提高代码的重用性:多态可以实现基类指针指向子类对象的情况,从而可以在不改变基类代码的情况下实现对子类的调用,大大提高了代码的重用性。
2. 简化代码:多态可以通过虚函数机制简化代码,使得代码更加简洁易懂。
3. 扩展性好:由于多态支持动态绑定,可以方便地添加新的派生类,并且在不修改原有代码的情况下进行扩展。
4. 更好的代码结构:通过多态,可以将相关的类组织成更好的代码结构,使得代码更加清晰

11.动态多态的三个条件是什么?
继承,虚函数,动态绑定
12.Struct和class
1.  struct 一般用于描述一个数据结构集合,而 class 是对一个对象数据的封装;


  • struct 中默认的访问控制权限是 public 的,而 class 中默认的访问控制权限是 private 的,
  • 在继承关系中,struct 默认是公有继承,而 class 是私有继承;
  • class 关键字可以用于定义模板参数,就像 typename,而 struct 不能用于定义模板参数。
13.我写的十行代码只有1k,为啥编译之后目标文件有几百k
写代码时,实际上只是在编写源代码,即文本文件。这些源文件需要经过编译器的处理,将其转换为计算机可以理解和执行的二进制代码。在这个过程中,编译器会将源代码转换为汇编代码,然后将其转换为目标代码,并将其链接到其他库文件或目标文件中,最终生成可执行文件或库文件。因此,即使您的源代码很小,但生成的目标文件可能会包含大量的二进制代码和符号表信息,这就是为什么目标文件的大小会比源代码大得多的原因。
14.内存泄漏和内存溢出是什么?
  内存泄漏指的是在程序运行时,申请的内存没有被及时释放,导致这些内存一直被占用,最终导致程序占用过多的内存而崩溃。内存泄漏的原因可能是程序中存在没有释放内存的代码、程序逻辑错误等。
内存溢出指的是程序在申请内存时,需要的内存空间大于操作系统所能提供的可用内存空间。这种情况通常发生在程序需要大量的内存空间时,但是操作系统没有足够的内存供应,导致程序崩溃。内存溢出的原因可能是程序设计问题、内存申请方式不当、数据结构设计错误等。

15.局部变量和全局变量
  局部变量是在函数内部定义的变量,只能在函数内部使用,函数执行完毕后,局部变量会被销毁,其内存会被释放。局部变量的作用域只限于函数内部,因此,在其他函数或主函数中不能使用同名的局部变量。
全局变量是在函数外部定义的变量,它的作用域是整个程序,因此,在任何函数或主函数中都可以使用。全局变量在程序开始执行时被创建,在程序结束时被销毁,其内存空间始终保持不变,直到程序执行结束。

16.虚函数有什么用
虚函数是C++中实现多态性的机制,它允许子类重写(覆盖)父类的同名函数,使得父类的指针或引用在运行时可以动态地指向子类的实例,从而实现多态性。具体来说,当父类的指针或引用调用虚函数时,会根据实际指向的子类的类型来决定调用哪个版本的虚函数。这个机制使得代码更加灵活,可扩展性更强,提高了代码的重用性和可维护性。
17..h与.cpp的区别
  .h文件和.cpp文件是C++程序中两种不同的文件类型,它们的主要区别如下:

1. .h文件是头文件,通常用来声明变量、函数和类等内容的接口,而.cpp文件是源文件,通常用来实现.h文件中声明的接口。
2. .h文件通常被包含在.cpp文件中使用,用于声明接口,因此.h文件中通常只包含函数、类等内容的声明而不包含实现;而.cpp文件则用于实现.h文件中声明的接口,通常包含函数、类等内容的实现。
3. .h文件中通常定义常量、全局变量、函数、类、结构体等内容的接口,而.cpp文件中通常定义常量、全局变量、函数、类、结构体等内容的实现。
4. 头文件通常需要使用预处理指令 #ifndef、#define和#endif来防止头文件被重复包含。

18.说说内联函数和函数的区别,内联函数的作用
1. 内联函数比普通函数多了关键字inline
2. 内联函数避免了函数调用的开销;普通函数有调用的开销
3. 普通函数在被调用的时候,需要寻址(函数入口地址);内联函数不需要寻址。
4. 内联函数有一定的限制,内联函数体要求代码简单,不能包含复杂的结构控制语句;普通函数没有这个要求。
19.多态和重载的区别
  多态和重载是两个不同的概念,它们的区别如下:

1. 多态(polymorphism)是指一个类实例在不同的情况下表现出不同的行为。多态可以分为编译时多态和运行时多态。编译时多态主要是指函数重载和模板,而运行时多态则是通过虚函数实现的。多态可以提高代码的可读性和可维护性,让代码更具有灵活性和扩展性。
2. 重载(overloading)是指在同一个作用域内定义了多个具有相同名称但参数列表不同的函数。在调用函数时,编译器会根据传入的参数类型和个数来决定具体调用哪个函数。重载可以方便地实现一组功能类似但参数不同的函数,并且可以提高代码的可读性和可维护性。

因此,多态和重载是两个不同的概念,它们分别解决了不同的问题。多态解决了在运行时根据对象的实际类型决定调用哪个函数的问题,而重载则解决了在同一个作用域内定义多个具有相同名称但参数列表不同的函数的问题。

20.[C++]头文件和命名空间
  头文件和命名空间都是 C++ 中用于组织和管理代码的工具。
头文件是 C++ 程序中的一个文件,用于包含声明、宏定义、类型定义和函数原型等信息,以供其他源文件使用。头文件通常包含在代码文件的开头,使用 #include 预处理指令来引入其他文件中的头文件。
命名空间是 C++ 中用于避免命名冲突的机制。通过将一组标识符放在命名空间中,可以避免不同模块中的标识符冲突。命名空间通过 namespace 关键字定义,可以嵌套定义多个命名空间,也可以使用 using 指令在代码中简化命名空间的使用。
需要注意的是,头文件和命名空间不是语言本身的一部分,而是 C++ 标准库中提供的工具。因此,程序员可以根据需要自定义头文件和命名空间,以便更好地组织代码。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表