1.Define 和 const区别
无数据类型 有数据类型
字符替换无安全检查 有安全检查
Define 的生命周期止于编译器
2.堆和栈区别
程序员MALLOC NEW手动分配的
定义的变量
3.指针和引用区别
可修改:指针可以被重新赋值 引用必须初始化不能修改
合法性:测试防止为空 不需要测试合法性
4.strlen和sizeof
5.const * p 内容不变
* const p 地址不变
就近原则
6.Malloc 和New区别
Malloc内存的动态存储区中分配一个长度为 size 的连续空间,成功Malloc返回void *类型,否则返回NULL。(两次 malloc 分配的内存的内存块不一定是相邻的)
1.malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符
2.用new分配的对象会调用对象的构造函数,delete则会调用对象的析构函数, 对内存进行更加详细的工作。
而malloc和free从不调用构造和析构函数,他们只是简单的分配内存。
基本类型的对象没有析构函数,所以回收基本类型组成的数组空间用
delete 和 delete[] 都是应该可以的;但是对于类对象数组,只能用
delete[]。对于 new 的单个对象,只能用
delete 不能用 delete[] 回收空间。Delete只能单个对象。
7.
函数模板
Temolate<typename T>
T fun(T x,T y)
{
T x;
}
8.结构体和类区别
C中 结构体不能定义函数
C++中 基本是一样的 默认的权限不同,struct默认public
9.抽象类 和 接口(虚基类)区别
只要一个成员函数为纯虚函数 接口所有成员函数都是纯虚函数
抽象类能够定义字段 接口不能出现字段
10.C++面向对象,开发效率高。兼容了C语言更接近底层,操作内存。
C++四种类型转换,C语言不易于查找,可以任意转换。C++要求严格。
Static_cast 常用类型转换f=static_cast<float>(i);
Const_cast 把const类型指针变为非const类型指针 *ptr =const_cast<int *>(fun(2,3))
Dynamic_cast 动态类型转换 子类和父类之间,上行,下行,类型检查virtual, Derived* d1 =Dynamic_cast<Dericed *>(b1);
Reinterpret_cast 重新解释 不同类型的指针类型转换
11.volatile 屏蔽系统对变量可能的优化;volatitle 这个关键字表述的问题一般都比较底层。表示每次都是从地址中读数据,而不是缓冲catch中。
1) 存储器映射硬件寄存器
2) 一个中断服务子程序中会访问到的非自动变量
3) 多线程应用中被几个任务共享的变量
12.Strcpy问题
可能出现的问题 溢出,导致后一个Buff被赋值,无论后面内存中的是什么,都将被覆盖,strcpy_s(dest,2,src)增加个大小。
13.inline作用
频繁调用,代码量小的函数。放在函数定义前。
与函数区别:函数调用时类似中断,转移到函数地址,执行,返回。
代码直接替换进程序。
14.explicit关键字
用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换(只能显示调用构造函数,不能隐式调用 “=”)
15.STATIC
静态全局变量 限制变量作用域,本文件有效
静态局部变量 只初始化一次
静态类成员 被所有实例共享
静态函数 不能被其他文件所用,其他文件可以定义相同名字的函数,不冲突
static全局变量只初使化一次,防止在其他文件单元中被引用;
static局部变量只被初始化一次,下一次依据上一次结果值;
static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
16.VIRTUAL
vitual构造函数,虚拟指针和虚拟链表,静态联编
virtual析构函数,正确析构,析构函数一般都应该定义为virtual的,主要不是防止内存泄露,而是为了正确的析构。
多态情况下能够正确释放子类。
18.STL容器
19.拷贝构造函数,=重载
A b(a)(显示); A b=a(隐式); //拷贝构造函数调用 ,深拷贝
A a; A b; b =a; //赋值运算符调用 ,浅拷贝
A(const A& a)
{
N = new int[1] ;
Memcpy(n,a.n,10);
}
A& operator = (const A& a)
{
If(this = &a)
Return *this
If(n!=NULL)
{
Delete n;
N=NULL;
}
N = new int[1];
Memcpy(n,n.a,10);
Return *this;
}
String构造函数
String(const char *str)
{
If(str == NULL)
{
M_data = new char[1];
*m_data = ‘\0’;
}else
{
Int len = strlen(str);
M_data = new char[lenth +1];
Strcpy(m_data,str);
}
}
~string()
{
Delete[] m_data;
}
String(const String& other)
{
Int len = strlen(other.m_data);
M_data = new char[len+1];
Strcpy(m_data,other.m_data);
}