您的位置:首页 > 财经 > 产业 > 品牌网站制作简创网络_智能客服人工客服_百度收录提交网址_怎么推广自己的公司

品牌网站制作简创网络_智能客服人工客服_百度收录提交网址_怎么推广自己的公司

2024/12/25 1:56:18 来源:https://blog.csdn.net/weixin_73225182/article/details/144214605  浏览:    关键词:品牌网站制作简创网络_智能客服人工客服_百度收录提交网址_怎么推广自己的公司
品牌网站制作简创网络_智能客服人工客服_百度收录提交网址_怎么推广自己的公司

1.C++特点

1. C++在C语言基础上引入了面对对象的机制,同时也兼容C语言。

2. C++有三大特性(1)封装。(2)继承。(3)多态

3. C++语言编写出的程序结构清晰、易于扩充,程序可读性好。

4. C++生成的代码质量高,效率高

5. C++更加安全,增加了const常量、引用、四类cast转换(static_cast、dynamic_cast、const_cast、reinterpret_cast)、智能指针、try—catch等等;

6. C++可复用性高,C++引入了模板的概念,标准模板库STL。

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.C++中 struct 和 class 的区别

1. struct 一般用于描述一个数据结构集合,而 class 是对一个对象数据的封装

2. struct 中默认的访问控制权限是 public 的,
    class 中默认的访问控制权限是 private 的。
3. 在继承关系中,struct 默认是公有继承,而 class 是私有继承;

4. class 关键字可以用于定义模板参数,就像 typename,而 struct 不能用于定义模板参数 

4.include头文件的顺序以及双引号""和尖括号<>的区别

区别:

  • 尖括号<>的头文件是系统文件,双引号""的头文件是自定义文件
  • 编译器预处理阶段查找头文件的路径不一样。

查找路径:

  • 使用尖括号<>时,编译器会按照以下顺序查找头文件:
    编译器设置的头文件路径 --> 系统变量
  • 使用双引号""时,查找路径的顺序如下:
    当前头文件目录 --> 编译器设置的头文件路径 --> 系统变量

5.C++结构体和C结构体的区别

特性CC++
成员函数不可以可以
静态成员不可以可以
访问权限默认 public,不能修改public/private/protected
继承关系不可以继承可从类或其他结构体继承
初始化不能直接初始化数据成员可以直接初始化数据成员,也可使用构造函数

6.导入C函数的关键字,C++编译时和C有何不同

关键字:在C++中,导入C函数的关键字是extern “C”,主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言进行编译。

编译区别:由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般只包括函数名。 

7.C++从代码到可执行二进制文件的过程 

  1. 预处理
            头文件展开,去注释,条件编译,宏替换,形成 .i文件(还是C语言)
    目的:通过处理这些预编译指令,生成一个没有宏定义、条件编译指令和注释的中间文件,为后续的编译阶段做准备。
  2. 编译
            将C语言翻译为汇编语言,形成 .s 文件(此时是汇编代码)
    目的:将预编译后的源代码转换为汇编代码,这个过程涉及到对源代码的语法、语义分析和优化,最终生成机器相关的汇编代码。
  3. 汇编
           将汇编代码变成可重定位二进制文件,形成.o文件
  4. 链接
           .o文件 +系统库 形成可执行程序
    目的:将多个目标文件和库文件链接在一起,生成一个完整的可执行文件或库文件。

链接分为静态链接动态链接
静态链接在链接阶段,将程序所需要的库函数的代码直接复制到可执行文件中。当编译器生成目标文件后,链接器会把程序所依赖的静态库中的代码提取出来,与目标文件合并成一个完整的可执行文件。

优点:可执行文件独立运行,不依赖其他文件,部署方便。

缺点:可执行文件较大,因为包含了所有用到的库代码;如果库有更新,需要重新编译整个程序。
生成的静态链接库,Windows下以.lib为后缀,Linux下以.a为后缀。

动态链接:在程序运行时才去加载所需要的库函数。在链接阶段,链接器不会把库函数的代码复制到可执行文件中,而是在可执行文件中记录对库函数的引用信息。当程序运行时,操作系统的动态链接器会根据这些引用信息去查找并加载相应的动态库。

优点:可执行文件较小,多个程序可以共享同一个动态链接库,节省内存;库更新时,只需更新库文件,无需重新编译所有程序。

缺点:运行时需要依赖动态链接库,如果库文件不存在或版本不匹配,可能导致程序无法运行。
生成的动态链接库,Windows下以.dll为后缀,Linux下以.so为后缀。

8.static关键字的作用 

修饰局部变量

  • static修饰局部变量时,该变量的存储方式发生改变。通常局部变量存储在栈区,函数调用结束后,栈上的局部变量就会被销毁。但是被static修饰的局部变量存储在静态存储区,它的生命周期贯穿整个程序的运行期。

 修饰全局变量和函数

  • static修饰全局变量时,这个全局变量的作用域被限制在定义它的源文件内,其他源文件不能访问这个变量。这有助于实现信息隐藏,避免不同源文件之间的命名冲突。

修饰类的成员变量和成员函数

  • 修饰成员变量
    • static修饰类的成员变量时,该成员变量被所有类的对象所共享。它不属于某个特定的对象,而是属于类本身。
  • 修饰成员函数
    • static修饰的类成员函数可以通过类名直接调用,而不需要创建类的对象。并且在静态成员函数中,只能访问类的静态成员变量和其他静态成员函数,不能访问非静态成员变量和非静态成员函数
      原因:当调用一个对象的非静态成员函数时,系统会把该对象的起始地址赋给成员函数的this指针。而静态成员函数不属于任何一个对象,因此C++规定静态成员函数没有this指针。既然它没有指向某一对象,也就无法对一个对象中的非静态成员进行访问。

9.静态变量何时初始化

C语言的全局和静态变量初始化发生在任何代码执行之前,属于编译期初始化
C++标准规定:全局或静态对象当且仅当对象首次用到时才进行构造
“按需初始化”好处:

  1. 提高效率:只有在实际需要使用对象时才进行构造,避免了不必要的初始化操作,特别是对于那些在程序中可能不会被使用的对象。
  2. 减少依赖:延迟初始化可以减少对象之间的依赖关系,降低了对象之间的紧密耦合,只需要在使用时获取其值。
  3. 支持动态初始化:对于一些需要在运行时确定初始化值的情况,延迟初始化提供了更好的支持。

10.静态全局/局部变量,全局/局部变量特点,及使用场景

作用域

  • 全局变量具有全局作用域,可以在程序的任何地方访问。通过 extern 关键字,可以在其他非定义的源文件中使用。当需要在多个函数之间共享数据,或者需要在程序的不同部分访问同一个变量时,可以使用全局变量。
  • 静态全局变量具有全局作用域,但加上文件作用域的限制,使其只能在定义它的文件中使用。当需要在一个文件内共享数据,但不希望其他文件访问该变量时,可以使用静态全局变量。
  • 局部变量具有局部作用域,通常是在函数内部或代码块内定义,只能在该范围内访问。局部变量在函数执行完毕后会被销毁。当需要在函数内部临时存储数据,并且该数据只在函数内部使用时,可以使用局部变量。
  • 静态局部变量具有局部作用域,但它在函数调用之间保持其值,只初始化一次。当需要在函数内部保存一个值,并且该值在函数的多次调用之间需要保持不变时,可以使用静态局部变量。

所在空间

  • 局部变量通常存储在栈上,随着函数的调用和返回而分配和释放内存。
  • 其他变量(全局变量、静态全局变量、静态局部变量)存储在静态存储区,它们在程序的整个运行期间都存在。

11.数组和指针

数组:数组是用于储存多个相同类型数据的集合。 数组名是首元素的地址

指针:指针相当于一个变量,它存放的是其它变量在内存中的地址。 指针名指向了内存的首地址
 

区别:

  • 赋值同类型指针变量可以相互赋值;数组只能一个一个元素的赋值或拷贝
  • 存储方式
    • 数组:数组在内存中是连续存放的,在静态区(全局数组)或栈上(局部数组)。
    • 指针:指针很灵活,它可以指向任意类型的数据。指针的类型说明了它所指向地址空间的内存。
  • sizeof求法
    数组所占存储空间的内存大小:sizeof(数组名)/sizeof(数据类型)
    在32位平台下,无论指针的类型是什么,sizeof(指针名)都是4
    在64位平台下,无论指针的类型是什么,sizeof(指针名)都是8。

11.函数指针及使用场景

函数指针就是指向函数的指针变量。每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。

定义:

返回类型 (*指针变量名)(参数列表) = 函数名;

使用场景:

回调函数:函数指针变量可以作为某个函数的参数来使用的,回调函数就是一个通过函数指针调用的函数。

12.nullptr可以调用成员函数吗?

从对象和成员函数的关系来理解
成员函数实际上是通过一个隐式的this指针来访问对象的成员。当通过对象(或者对象指针)调用成员函数时,编译器会将对象的地址作为this指针传递给成员函数。

当指针是nullptr时,就没有一个有效的对象来提供这个this指针所需要的有效地址。通过nullptr调用成员函数会导致程序出现未定义行为。

特殊情况:成员函数是static的,它不依赖于对象实例(没有this指针),那么可以通过类名或者nullptr(从语法上)来调用。

13.野指针 

概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
产生原因:释放内存后指针不及时置空(野指针),依然指向了该内存,那么可能出现非法访问的错误。这些我们都要注意避免。

避免办法

(1)初始化置NULL

(2)申请内存后判空

(3)指针释放后置NULL

(4)使用智能指针

14.C++的传值方式 

值传递:

  • 值传递是指在函数调用时,将实际参数的值拷贝一份传递给函数的形式参数。在函数内部,对形式参数的修改不会影响到实际参数的值。

引用传递:

  • 引用传递是指在函数调用时,将实际参数的引用传递给函数的形式参数。在函数内部,对形式参数的修改会直接影响到实际参数的值。

指针传递:

  • 指针传递是指在函数调用时,将实际参数的地址传递给函数的形式参数。在函数内部,可以通过解引用指针来访问和修改实际参数的值。

值传递用于对象时,整个对象会拷贝一个副本,这样效率低;而引用传递用于对象时,不发生拷贝行为,只是绑定对象,更高效;指针传递同理,但不如引用传递安全。

15.new/delete和malloc/free

  • new/delete是C++关键字,需要编译器支持。malloc/free是库函数,需要头文件支持。
  • new自动计算要分配的空间大小,malloc则需程序员指定。
  • malloc和free返回的是void*指针(必须进行类型转换),new和delete返回的是具体类型指针。
  • new内存分配失败时,会抛出bad_alloc异常。malloc分配内存失败时返回NULL
  • new会先调用operator new函数,申请足够的内存(通常底层使用malloc实现)。然后调用类型的构造函数,初始化成员变量,最后返回自定义类型指针。delete先调用析构函数,然后调用operator delete函数释放内存(通常底层使用free实现)。
  • malloc仅仅分配内存空间,free仅仅回收空间,不具备调用构造函数和析构函数功能,用malloc分配空间存储类的对象存在风险;new和delete除了分配回收功能外,还会调用构造函数和析构函数。

16.const和define

  • define生效于预处理阶段;
    const生效于编译的阶段。
  • define 只是简单的文本替换,不会对类型安全进行检査;
    const 会进行类型检查。
  • define定义的常量,运行时是直接的操作数,并不会存放在内存中;
    const定义的常量,在C语言中是存储在内存中、需要额外的内存空间的。

17.const int *a, int const *a, const int a, int *const a, const int *const a分别是什么 

const int a; //指的是a是一个常量,不允许修改。
const int *a; //指向常量的指针,意味着通过这个指针不能修改其所指向内存中的值,但指针本身可以重新指向其他同类型(const int 类型)的内存地址。
int const *a; //同const int *a;
int *const a; //通过a指针可以修改它所指向内存中的值,但a指针不能指向其他的内存地址
const int *const a; //都不变,即(*a)不变,a也不变

18.指针与引用

指针:指针是一个变量,其值为另一个变量的地址。

引用:引用是一个别名,它在定义时必须被初始化,并且之后不能再绑定到其他对象。

指针可以有多级,引用只有一级
当把指针作为参数进行传递时,也是将实参的一个拷贝传递给形参,两者指向的地址相同,但不是同一个变量,在函数中改变这个变量的指向不影响实参,而引用却可以。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com