小老弟研发之路面筋大汇总——关于C/C++(一)

目录

C++ 组合是什么?

 C++继承是什么?

说说C++组合与继承的优缺点(多益)

对C++的认识和看法,和C比较的优缺点(多益)

编译性语言需要经过的步骤?

什么是重载?为什么C++支持重载而C不支持?

stl(标准模板库)中map和hashmap区别?hashmap是否总是优于map(多益)

c 的const


  • C++ 组合是什么?

答:每当某个类包含另一个类的对象作为其成员变量之一时,就会出现类组合。也就是说,用一个类的对象作为另一个类的成员变量的时候,就是类的组合。组合是 Has a 的关系。


  •  C++继承是什么?

答:类继承可用于描述派生类的类型是基类的一种特殊情况的事实。因为派生类是基类的特例,所以对应与于派生类的对象集合将是对应于基类的对象集合的子集。继承是Is a 的关系。


  • 说说C++组合与继承的优缺点(多益)

组合优点:

  1. 当前对象只能通过所包含的那个对象去调用其方法,所以所包含的对象的内部细节对当前对象是不可见的。
  2. 当前对象与它所包含的对象是一个低耦合的关系,如果修改包含对象的类中代码不需要修改当前对象类的代码。
  3. 当前对象可以在运行时动态的绑定所包含的对象。可以通过set方法给所包含对象赋值。

组合缺点:

  1. 容易产生过多的对象
  2. 为了能组合多个对象,必须仔细对接口进行定义。

继承优点:

  1. 子类可以重写父类的方法来方便地实现对父类的扩展。
  2. 减少重复代码
  3. 继承是多态的前提

继承缺点:

  1. 继承打破了基类的封装,因为它将基类(父类)的受保护成员暴露给了派生类(子类)的方法。
  2. 子类从父类继承的方法在编译时就确定了,所以无法在运行期间改变从父类继承的方法的行为。
  3. 如果对父类的方法做了修改的话(比如增加了一个参数),则子类的方法可能要(必须)做出相应的修改。
  4. 如果继承下来的子类不适合解决新问题,父类必须重写或替换,那么这种依赖关系就限制了灵活性,最终限制了复用性。

组合继承的对比:组合比继承更具有灵活性和稳定性,所以设计的时候优先使用组合。但是当满足某些条件时,会使用继承。


  • 对C++的认识和看法,和C比较的优缺点(多益)

对C++的认识

  1. 支持数据封装和数据隐藏。在C++中,类是支持数据封装的工具,对象则是数据封装的实现。
  2. 支持继承和重用。支持多态性。
  3. 由于继承性,这些对象共享许多相似的特征。由于多态性,一个对象可有独特的表现方式,而另一个对象有另一种表现方式。
  4. 工作原理。C++的程序因为要体现高性能,所以都是编译型。但其开发环境,为了方便测试,将调试环境做成解释型的。即开发过程中,以解释型的逐条语句执行方式来进行调试,以编译型的脱离开发环境而启动运行的方式来生成程序最终的执行代码。

C++三大特性:继承,多态,封装。

继承优点:

  1. 减少重复的代码
  2. 继承是多态的前提

继承缺点:

  1. 继承打破了基类的封装,因为它将基类(父类)的受保护成员暴露给了派生类(子类)的方法。
  2. 子类从父类继承的方法在编译时就确定了,所以无法在运行期间改变从父类继承的方法的行为。
  3. 如果对父类的方法做了修改的话(比如增加了一个参数),则子类的方法可能要(必须)做出相应的修改。
  4. 如果继承下来的子类不适合解决新问题,父类必须重写或替换,那么这种依赖关系就限制了灵活性,最终限制了复用性。

多态优点:

  1. 大大提高了代码的可复用性
  2. 提高了代码的可维护性,可扩充性

多态缺点:

  1. 易读性较差,调试较困难
  2. 模板只能定义在.h文件中,当工程打了以后,编译时间会比较长。

封装优点:

  1. 隔离变化
  2. 便于使用
  3. 提高可重用性
  4. 提高安全性

封装缺点:

  1. 如果封装太多,会影响效率
  2. 使用者不能知道代码具体的实现

C和C++比较

C语言体型小巧,简洁高效接近汇编语言,C++功能是在C的基础上增加面向对象的特点,代码可读性好,运行效率高。

C较C++的优点:

  1. C较C++代码量小
  2. C较C++运行速度快,因为C更接近底层语言。

C较C++的缺点:

  1. 危险性高,而C++从安全性上对C语言进行了升级。
  2. 开发周期长。因为C语言是面向过程的语言(C也是编译型语言),面向过程语言的一个特点是写大项目的时候容易“崩溃”,所以面对大项目的时候就要用另一种思想将整个程序的框架重新设计一下,即用面向对象的思想设计。
  3. C可移植性不高,而C++可移植性高。
  4. C++可重用性更高。

  • 编译性语言需要经过的步骤?

答:

  1. 预处理。条件编译,头文件展开,去注释,宏定义,生成一个.i文件
  2. 编译。检查语法生成汇编代码,生成一个.s文件。(编译器在对代码进行编译的过程中会将函数的函数名进行重命名)
  3. 汇编。将汇编代码转为机器代码,生产一个.o文件
  4. 链接。在链接过程中主要任务是根据函数名找到对应的函数定义。

  • 什么是重载?什么是覆盖?为什么C++支持重载而C不支持?

答:重载,就是函数的参数不同,函数的函数名相同,返回值可以相同也可以不同。

       覆盖,虚函数总是在派生类中被改写。

解释:由于编译器在对代码进行编译的过程中会将函数的函数名进行重命名。在C中,两个相同函数名在编译过程中得到的重命名是相同的,而C++在编译的过程中对两个相同函数的函数名进行重命名得到的是两个重命名。

举例:

//代码一
void swap(int a, int b)
{
    ...
}

//代码二
void swap(char a, char b)
{
    ...
}

C语言中会将代码一和代码二swap函数都重新命名为_swap,但是在C++中会将代码一函数名重新命名为_z8swapii,代码二函数名重新命名为_z2swapcc,其中_z代表的是函数命名前缀,8代表的是参数字节,swap是函数名称,i代表的是参数的类型,因此在C++中即使函数的名称相同,但是经过编译器的重新命名后,函数的名称就会由于形参的不同而变的不同,因此在编译器的眼里,它们两个函数是不同的,所以也就支持了重载。


  • stl(标准模板库)中map和hashmap区别?hashmap是否总是优于map(多益)

区别:STL的map底层是用红黑树实现的,查找时间复杂度是log(n),而hash_map底层是用hash表存储的,查询时间复杂度是O(1)。

hashmap是否总由于map:否。hash_map的hash函数以及解决地址冲突等都要耗时间,而且hash表时以空间换时间的,因而hash_map的内存消耗肯定大,一般情况下如果记录非常大,考虑hash_map,查找效率会高很多,如果要考虑内存消耗,则要谨慎使用hash_map。


  • c 的const

答:const关键字使变量的值在整个作用域中都保持固定,任何对const限制的变量进行修改都将引发错误。const变量称为常量。常量一旦被创建后其值就不能再改变,所以常量必须在定义的同时赋值(初始化)。

const和指针:

口诀:const(在*号)左边放,我是指针变量指向常量

           const ( 在*号 ) 右边放,我是指针常量指向变量

           const ( 在*号 )两边放,我是指针常量指向常量

举例:

  1. 常量指针(指向出常量的指针)——const(在*号)左边放
    const int *p1; 
    int const *p2;  

    指向常量的指针说明我们不能通过这个指针去修改这个常量,以上这样限制了通过指针修改变量的值。而p1,p2可以改指向的地址。

  2. 指针常量(指针是个常量)——const ( 在*号 ) 右边放
    int *const p3 = &a; 
    a[0] = 'x' //是可以的,因为我们并没有限制a为常量指针(指向常量的指针)

    因为指针常量是一个常量,在声明的时候一定要给它赋初始值。一旦赋值,以后这个指针常量再也不能指向别的地址。虽然指针常量的值不能变,可是它指向的对象是可变的,因为我们并没有限制它指向的对象是常量。
    而,a[0] = 'x'  这个是可以的,因为我们并没有限制a为常量指针(指向常量的指针)

  3. 指针和指针指向的值都是常量——const ( 在*号 )两边放
    const int * const p4 
    int const * const p5 

    这样指针不能更改指向的地址,指针指向的值也不能改变。

const和函数形参:

const通常用在函数形参中,如果形参是一个指针,为了防止在函数内部修改指针指向的数据,就可以用const来限制。

const和非const类型转换:

注意:当一个指针变量 str1 被 const 限制时,并且类似const char *str1这种形式,说明指针指向的数据不能被修改;如果将 str1 赋值给另外一个未被 const 修饰的指针变量 str2,就有可能发生危险。因为通过 str1 不能修改数据,而赋值后通过 str2 能够修改数据了,意义发生了转变,所以编译器不提倡这种行为,会给出错误或警告。也就是说,const char *char *是不同的类型,不能将const char *类型的数据赋值给char *类型的变量。但反过来是可以的,编译器允许将char *类型的数据赋值给const char *类型的变量。C语言标准库中很多函数的参数都被 const 限制了,但我们在以前的编码过程中并没有注意这个问题,经常将非 const 类型的数据传递给 const 类型的形参,这样做从未引发任何副作用,原因就是上面讲到的,将 const 类型转换为非 const 类型是允许的(降低权限不会影响,但提升数据的权限就不被允许)。

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值