目录
一、函数重载
YA :cd_call H:int N:doubleI
调用点看不见返回类型 会产生二义性
函数符号生成规则
int Sum(int a,int b) _Sum ?Sum@@YAHHH@Z
{ Return a+b; }
double Sum(double a,double b) _Sum ?Sum@@YANNN@Z
{ Return a+b; }
double Sum(int a,int b) ?Sum@@YANHH@Z
{ Return a+b; }
C 函数名
C++ 函数原型
- 返回值 x
- 函数名 v
- 参数形参 v
- 参数个数
- 参数类型
- 参数顺序
重载的三要素
- 同名
- 不同参
- 同作用域
-
Bool Compare(int a,int b) { Return a>b; } Bool Compare(double a,double b) { Return a>b; } Bool Compare(char* pa,char* pb) { Return strcmp(pa>pb)>0?true:false; } Int main() { Bool Compare(int,int); Bool Compare(10,20); Compare(10,20.1); Comppare(hello,world): }
下面的三个 会直接调用main()中的Compare(int,int) 即使产生错误 重载必须同作用域
内置类型都有强制转换 int可以转double double不可转Int
二、New maloc
Int *p=malloc(1)
Malloc 返回为void* 需要强制转换
Malloc 开辟一个字节 而指针指向4个字节 指针指向三个越界字节
New和malloc的区别:
- new 关键字 malloc函数
- new 自由存储区 malloc 堆上开辟
- new malloc
- Operator new 开辟内存
- Construct 初始化
- Malloc 只开辟内存
- new可以进行函数重载 malloc 不可以 (mallloc是c中的)
- New可以调用malloc mallloc不可调用new
- 内存开辟 new 抛异常 malloc 返回null
- new可以开辟常量 malloc 不行 new int(20)
Int* p=new int[10];
Delete p; 数组开辟 单个内存释放 V
Delete 、delete[] ?
多一个int 保存 对象的格式即调用析构的次数
(1) 为基本数据类型分配和回收空间;
(2) 为自定义类型分配和回收空间。
基本类型的对象没有析构函数,所以回收基本类型组成的数组空间用 delete 和 delete[] 都是应该可以的;
但是对于类对象数组,只能用 delete[]。对于 new 的单个对象,只能用 delete 不能用 delete[] 回收空间。
所以一个简单的使用原则就是:new 和 delete、new[] 和 delete[] 对应使用。
参考:https://www.cnblogs.com/tp-16b/p/8684298.html
class T {
public:
T() { cout << "constructor" << endl; }
~T() { cout << "destructor" << endl; }
};
int main()
{
const int NUM = 3;
T* p1 = new T[NUM];
cout << hex << p1 << endl; //输出P1的地址
// delete[] p1;
delete p1;
return 0;
}
delete p1 在回收空间的过程中,只有 p1[0] 这个对象调用了析构函数,其它对象如 p1[1]、p1[2] 等都没有调用自身的析构函数。如果用 delete[],则在回收空间之前所有对象都会首先调用自己的析构函数。
参考:https://www.cnblogs.com/chucks123/p/7764449.html
三、Const
c、c++中const的区别
C 常变量
编译阶段 常变量有没有做左值 其他的处理和变量一样(指针指向 引用修改)
C++ 常量
编译阶段 把常量使用的地方 替换常量初始化的值
- 一定要初始化
- 不允许左值
- 不允许间接访问来修改常量内存 杜绝间接访问的风险
C
Const 修饰的全局变量 local->global
C++ Const 修饰的全局变量 local extern
Int main()
{
Const int a;
Int *p=&a;
*p=20;
Prinf(“%d\n”,a);
Return 0; C V
}
Int main()
{
Const int a=10;
Int* p=(int*)&a;
*p=20;
Std::cout<<a<<std::endl;
}
参考:https://blog.csdn.net/fighting123678/article/details/79487479
常函数 void fun() const {}
构造函数和析构函数不可以是常函数
特点:①可以使用数据成员,不能进行修改,对函数的功能有更明确的限定;
②常对象只能调用常函数,不能调用普通函数;
③常函数的this指针是const CStu*.
常函数不能修改数据成员
特点:
1)可以输出,可以运算,但不能进行修改
2)这种不可修改只针对于类的数据成员,对于函数自身的参数可以进行修改
3)常函数的this指针变成了const 类名*
好处:
对函数功能有更明确的限定,例如只能输出,但不能进行修改
常对象
1)常对象格式:const 类名 对象名
2)常对象只能调用常函数,不能调用普通函数
class Cperson
{
public:
void show1()
{
cout << "I am ordinary" << endl;
}
void show() const
{
cout << "I am const" << endl;
}
};
int main()
{
const Cperson op;
op.show(); //正确
op.show1(); //错误
system("pause");
return 0;
}
四、引用
别名 (内存单元)
引用底层以指针做支持 不能引用常量 常量无地址 在寄存器中
- 一定要有初始化
- 不能 引用 不能取地址数据
- 引用不能改变
- 引用变量只能使用 引用变量所引用的数据
五、内联 inline
编译阶段 代码调用点直接代码展开(内联不生成符号) 本文件可见
Inline函数和static修饰的函数的区别
(static修饰 global->local)
- inline函数 无开栈清栈开销 static 有
- Inline 在调用点直接代码展开 static 函数符号属性 local
Inline函数和宏的区别
- lnline编译 类型检查 和 安全检查 宏 预编译 无
- Inline是一个更安全的宏
注意事项:
- 实现在头文件中
- 只在release版本生效
- 给编译器的一个建议 (递归 循环 switch 不可处理为内联)
- 基于实现,不是基于声明 iniine写在定义点
Inline缺点
以代码膨胀为代价 空间换时间
建议
- 开栈的开销>执行的开销 建议设为inline
- 开栈的开销<执行的开销 不建议设为inline
否则目标代码太过庞大 指令太复杂
六、函数的默认值
- 自右向左,依次赋予 (实参和形参的匹配 自左向右)
- 不能重复赋予
- 一般将默认值赋在声明上
七、C、C++的相互调用
Extern “C” C++独有的
- C++调用C
C++源文件中加extern c
- c调用c++
- C++源文件可修改 c++源文件中加extern c
- C++源文件不可修改 加中间层 .cpp
- 不明确编译器
- #ifdef _cplusplus c++
八、Namespace
Using namespace std; using 指示符 所有符号暴露
Using std::cout; using声明 std::cout下的符号暴露
同名的空间作用域合并
void Reverse_Print(int arr[],int len)
{
if(len==0)
return ;
std::cout<<arr[len-1]<<" ";
Reverse_Print(arr,len-1);
}
C++基础及进阶
一.类和对象
c语言无空的结构体 0 C++ 1
C++:空结构体和空类所占内存大小为1,C:空类和空结构体占用的大小是0
C++ struct和class区别
1、默认的继承权限
struct默认是公有继承(public),class默认是私有继承(private)
2、关于默认访问权限
class中默认的成员访问权限是private的,而struct中则是public的。
三大特征
封装 继承 多态 成员变量对类是独有的 成员方法对类是公享的
变量 内存
对象 内存+资源