1.c++和c有什么不同?
语言本身:c是c++的一个子集,c++在c的基础上增加了 类 和 模板 类型
一方面:c++加强了c的过程化功能,引入了 重载和异常处理等
另一方面:扩展了面向对象设计的内容 如:类,友元,继承,虚函数,模板
编程角度:c是一中结构化编程语言 重点在于算法和数据结构
c++是面向对象的编程语言 重点在于如何设计对象模型
2.const和volatile的作用
const关键字作用于修饰普通变量和指针变量,
如果修饰变量名,则该变量变成常变量,不能被修改
如果修饰指针变量 const在c和c++中略有不同
在c中,c的编译器并不会把const修饰的变量当成常量,会为其分配内存空间,c编译器不知道它在编译器时的值(c++可以)
volatile关键字 含义:"易变的"
告诉编译器volatile变量随时可能发生变化的,与volatile变量有关的运算不要进行编译优化,每次使用它必须从volatile变量地址读取
何为编译优化?
int main()
{
volatile int a = 10;
int i = a;
/*
其他代码
*/
int j = a;
return 0;
}
如果没有volatile 编译器发现两次从a的地址读数据的代码之间没有对a进行过操作,它会自动将上次a的值放到中,
给出几个使用volatile关键字的示例
1)多线程中被几个任务共享的变量
2)中断服务子程序会访问到的非自动变量
c++的显示类型转换
1.静态转换(static_cast)
static_cast用于明确定义的转换,包括"安全"转换(int---long)和不安全转换(long---int会导致信息丢失)但知道定义的转换,使用void*强转转换和隐式类型转换
#include<iostream>
using namespace std;
int main()
{
int i=0x11223344;
long j;
double k;
//非强制安全转换 隐式转换
j=i;
k=i;
//也可以 突出转换行为
j=static_cast<long>(i);
k=static_cast<double>(i);
//非安全转换---导致信息丢失
// i=j //丢失数字
// i=k //丢失信息
i=static_cast<int>(j); //表示我知道 消除警报
i=static_cast<int>(k); //
//
void *vp=&i;
//旧时风格可能产生危险的转换
float* fp=(float*)vp;
//新方式
fp=static_cast<float*>(vp);
return 0;
}
2.常量转换(const_cast)
从const转换为非const或者从volatile转换为非volatile可以使用const_cast
3.重解释转换(reinterpret_cast)
4.动态转换(dynamic_cast)
用于类继承结构中实现类型安全的对象指针向下转换
内存管理
- 代码段:用来存放程序的可执行代码,(可共享和只读的)
- 数据段:包括未初始化区:存放未初始化(外部变量和静态局部变量)数据
- 静态数据区:已初始化的全局变量和静态局部变量和常量
- 堆空间:用于存放程序执行动态分配的内存段
- 栈空间:存放程序的临时局部变量和函数参数和返回地址
malloc/free和new/delete的不同?
malloc/free是c语言的标准库函数
new/delete是c++中运算符
new运算符会自动调用对象的构造函数 delete会自动调用对象的析构函数
在c++中支持malloc/free 为什莫还需要new/delete?
因为malloc/free不满足为对象动态分配内存空间的要求,
对象在创建是要自动调用构造函数 销毁时要自动执行析构函数
malloc/free是库函数不是运算符所以不在编译器的控制权限之内,不能把执行构造函数和析构函数交给malloc/free
对于内置类型malloc/free和new/delete是等价的,为什么不把malloc/free淘汰掉?
因为c++经常要调用c函数,而纯c只能用malloc/free管理内存
函数传递方式?
- 传值
- 传引用
- 传地址
函数采用引用传递的优点?
- 用引用传递函数的参数能保证参数传递不产生临时变量,提高传递效率,节省空间
- 引用参数定义为const 不能修改形参值,保证引用传递的安全性
当引用作为函数返回值时遵守以下规则?
不要返回局部变量, 局部变量返回时会被销毁,
不要返回malloc/new分配的内存引用, 函数返回的引用只是作为一个临时变量出现,没有被赋予一个实际变量,那么这个引用所指的空间就无法释放,造成内存泄露.