C和C++的区别是什么,C++优势在哪里,缺陷呢?
- C语言是面向过程编程,C++是面向对象编程,所以C和C++的区别也就是面向过程编程和面向对象编程的区别。
- 面向过程编程就是分析出解决问题的步骤,然后把这些步骤一步一步的实现,使用的时候一个一个的依次调用就可以了。
- 面向对象编程就是把问题分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物在整个解决问题的步骤中的行为。
- 编程的最终目的就是为了解耦和复用。
- 面向过程编程的性能比面向对象高,因为类调用的时候需要实例化,开销比较大,比较消耗资源。但是面向过程却没有面向对象易维护,易复用,易扩展。由于面向对象编程有封装,继承,多态等性质,可以设计出低耦合的系统。
如果我想修改一个const的变量怎么办呢?
- 在C++中用const修饰的变量属于常量,会被编译器优化到寄存器中,每次取值都是从寄存器中取值。如果我们想要改变一个 const 修饰的变量的话可以利用指针修改变量在内存中的值,但是我们要用这个变量的时候必须去内存中取值,所有又要用到 volatile 保证内存可见性。
C++中,一个静态成员函数(static修饰)和非静态成员函数有什么区别(从调用上、底层(this指针)两方面答)?
- 静态成员函数是没有this指针的,所以调用的时候可以直接用类名和作用域运算符调用类的成员函数,也可以用一个类对象调用静态成员函数,因为静态成员函数是属于类的。(因为静态成员是属于类的,所以不占对象的内存)非静态成员函数在调用的时候必须用类对象调用,因为要传 this 指针。
堆跟栈的区别,栈为什么向下生长。堆和自由存储区有什么区别
- 堆和栈的主要区别就是:栈是由内核维护的,而堆是由程序员自己维护的。
- 每一个C程序,从低地址和高地址一次是 text、data、bss、堆、栈、环境变量参数。让堆从低地址向高地址增长,栈从高地址向低地址增长,可以使得空间利用最大化,因为有的程序可能用栈空间比较多,有的用堆空间比较多,相向增长的话,可以以最大程度的共用这部分空间。
- 自由存储是C++中通过new与delete动态分配和释放对象的抽象概念,堆是操作系统维护的一块动态内存。new所申请的内存区域在C++中称为自由存储区,而自由存储区就在堆上。
空类对象(无成员变量的类)的大小是多少?为什么?
- 空类对象的大小是1。因为语言本身的类型中最小的就是 char,因此其他类型大小最小也不会比 char 小,所以空类型最小就是1字节。
C语言中为什么没有重载呢?
- 因为语言本身就不支持重载,所以没有重载。再者由于C函数调用约定决定,C编译器只是将函数名编译为符号而已,所以也不支持重载。
拷贝构造函数的参数为什么只能采用同类型对象的引用?
- 如果不是引用的话,则会引发无穷递归。因为如果不使用引用的话,在传参的时候也会调用拷贝构造,这时就会引发递归。
输入和输出操作符为什么必须定义为类的友元函数?
- 事实上如果不是类的友元函数的话,也是完全没有问题的,只不过输入输出的形式与我们平时用的是相反的,因为是对象去调成员函数。但是如果声明为友元函数的话,就可以把对象当做参数传给输入输出流,符合我们平时的习惯。
如何设计一个不能被继承的类?
- 可以使用虚继承的方式。首先声明一个辅助类A,并把A的构造声明为私有的,在把B声明为A的友元类,然后再让B虚继承与A,这样的话B类就不能被继承了。因为B是A的友元类,所以B可以调用A的构造函数,而B又虚继承A,所以当有其他类继承B的时候,就必须直接调用A的构造函数,而A的构造又是私有的。
虚函数可以是模板的吗
- "模板类"中可以使用虚函数,模板是不影响类的多态的。“模板成员函数”(就是类里面的成员函数是模板)不可以是虚函数,因为如果有虚函数的话,在实例化类的时候需要创建虚表,但是在模板类实例化之前不能确定虚函数模板会被实例化多少个,所以也就无法创建虚表。
如何用C语言实现多态
- 可以使用宏定义和函数指针