C++基础简述题
变量的声明(statement)和定义(definition)有什么不同
- 定义给变量分配地址和存储空间
- 声明不分配地址
- 一个变量可以在多个地方被声明,只能在一个地方被定义
- 加入extern说明的变量是对变量的声明,表示此变量将在文件以外或者之后的地方被定义
写出 bool,int,float,指针变量与”零值”比较的if语句
- bool: if(flag) {A;} else {B;}
- int: if(0!=flag) {A;} else {B;}
- 指针变量:if(flag!=NULL) {A;} else{B;}
- float: if(flag<=NORM && flag>=NORM) {A;} else{B;}
sizeof和strlen的区别
- sizeof是操作符(operator)
- strlen是标准库函数(standard library function)
- sizeof返回的是给变量/数据类型分配的存储空间(所占内存的大小)
- strlen返回的是以’\0’结尾的字符串的实际长度
- 数组做sizeof的参数是不退化,作为strlen的参数时就退化为指针
- sizeof是在编译时就计算出的结果,strlen是在程序运行的时候才计算出结果
C语言的关键字static和C++的static关键字有什么区别
- C: static用来修饰局部静态变量和外部静态变量,函数
- C++:添加了静态成员变量和静态成员函数
C中的malloc和C++中的new有什么区别
- new,delete是操作符,可重载,只能在C++中使用
- malloc,free是函数,可覆盖,能在C,C++中使用
- new可以调用对象的构造函数,delete调用对象的析构函数
- malloc仅仅开辟内存,不调用构造函数;free仅仅释放内存,不调用析构函数
- new,delete返回的是某种数据类型的指针
- malloc,free返回的是void指针
写一个”标准”宏MIN
#define min(a, b) ((a)<=(b)?(a):(b))
简述C、C++程序编译的内存分配情况
C、C++中内存分配方式可以分为三种:
- 从静态存储区分配:例如全局变量、static变量等。在程序编译时内存就分配了,这块内存在整个程序运行中都存在。速度快、不容易出错,因为有一系统会善后。
- 在栈上分配:在执行函数的时候,函数内局部变量的存储单元都在栈上创建。函数结束时,这些单元被自动释放。栈内存分配运算内置于处理器的指令集中,效率很高。
- 从堆上分配(动态内存分配):程序在执行时用malloc或new申请任意大小的内存,程序员自己负责使用free或delete释放内存。动态内存的生存期由程序员自己决定,如果在堆上分配了空间,就有责任收回它,否则运行程序时就会出现内存泄露,另外频繁地分配和释放大小不同的堆空间将出现内存碎块。
- C,C++程序编译时分5大内存区:堆区、栈区、静态存储区、文字常量区、程序代码区。
简述strcpy、sprintf与memcpy的区别
- 操作数:strcpy两个对象都是字符串,sprintf的目的对象是字符串,memcpy的两个对象是任意可操作的内存地址
- 执行效率:memcpy效率最高,其次是strcpy,最慢的是sprintf
- 实现功能:memcpy是内存块间的拷贝,strcpy是字符串间的拷贝,sprintf是将其他数据类型转化为字符串数据类型
设置地址为0x67a9的整型变量的值为0xxa66
int *p;
p=(int*)0x67a9;
*p=0xxa66;
面向对象的三大特征
- 继承(inheritance):广义的继承有三种实现形式:实现继承(使用基类的属性和方法而无需额外编码的能力)、可视集成(子窗体使用父窗体的外观和实现代码)、接口继承(仅使用属性和方法,实现之后的子类实现)。
- 封装(encapsulation):将客观事物抽象成类,每个类对自身的数据和方法实行protection(private,protected,public)
- 多态(polymorphism):是将父类对象设置成为和一个或更多它的子对象相等的技术。用子类对象给父类对象复制之后,父类对象就可以根据当前赋值给它的子对象的特性以不同的当时运作。
C++的空类有哪些成员
- 缺省构造函数
- 缺省析构函数
- 缺省拷贝构造函数
- 缺省赋值运算符
- 缺省取地址运算符
- 缺省取地址运算符 const
谈谈你对拷贝构造函数和赋值运算符的认识
- 拷贝构造函数直接构造一个新的类对象,而赋值运算符不能
- 因为拷贝构造函数是直接构造一个新的类对象,所以在初始化这个对象之前不用考虑源对象和新建对象是否相同
- 赋值运算符需要考虑源对象和新建对象是否相等,如果相等,需要先把源对象的内存释放掉
- 如果类中含有指针变量,则需要重写拷贝构造函数和赋值运算符,不能使用默认的
简述类成员函数的重写、重载和隐藏的区别
- 拷贝构造函数直接构造一个新的类对象,而赋值运算符不能
- 因为拷贝构造函数是直接构造一个新的类对象,所以在初始化这个对象之前不用考虑源对象和新建对象是否相同
- 赋值运算符需要考虑源对象和新建对象是否相等,如果相等,需要先把源对象的内存释放掉
- 如果类中含有指针变量,则需要重写拷贝构造函数和赋值运算符,不能使用默认的