引用 VS 指针
1.指针是变量, 引用是别名,引用解决函数传参传地址选择问题;
2.指针占用内存空间,引用实际上也占用内存空间 (编译阶段确定,并且隐藏 )
3.指针有多级指引,引用有左值和右值引用;
4.指针不安全 ,容易造成内存泄露;引用不会;
左指引用只能绑定左值;右值引用只能绑定右值;
左值能够修改,能够取地址;右值不能;
动态内存分配(new、delete) :
malloc VS new free VS delete
1.malloc/free函数 ,new/delete运算符 ;
1.malloc/free按字节为单位分配 ,new/delete按类型为单位 ;
3.malloc/free不能初始化分配空间 ,new/delete可以初始化 ;
内联函数 :
inline是由编译决定 ,使用inline关键字只是申请编译器;
内联编译的限制 :
1.不能存在任何形式的循环语句 ;
2.不能存在过多的条件判断语句 ;
3.函数体不能过于庞大;
4.不能对函数进行取值操作;
5.函数内联声明必须在调用语句之前 。
默认参数:C++中可以在函数声明时为参数提供一个默认值,
当函数调用时没有指定这个参数的值,编译器会自动用默认值代替
#include <stdio.h>
// 声明时指定默认参数值
int mul(int a = 10);
int main()
{
printf ("%d\n", mul(2));
printf ("%d\n", mul(-3));
printf ("%d\n", mul()); // 没有写参数,则默认参数
return 0;
}
// 定义时不再指定
int mul(int a)
{
return a * a;
}
默认参数规则 :
1.默认参数的定义顺序自右向左 ,如果一个形参设置了默认参数, 那么它的右边所有参数都必须有默认参数 ;
2.调用函数时 ,遵循参数调用顺序 ,如果有参数传入,会优先从左向右依次匹配;
3.默认参数的值必须是确定的 ,可以是全局变量 、常量、函数 。
函数重载:用同一个函数名定义不同的函数当函数名和不同的参数搭配时函数的含义不同 。
- 函数重载的条件:函数名相同,函数形参个数 ,类型或顺序不同,默认参数会影响函数存在的条件,函数的返回值不能作为函数重载的条件。
目的:提高可读性; - 注意事项 :默认参数会影响重载规则 。
函数重载的判断标准:
- 参数个数不同
- 参数类型不同
- 参数顺序不同
- 函数返回值不是函数重载的判断标准
函数重载与函数指针:
当使用重载函数名对函数指针进行赋值时:
根据重载规则挑选与函数指针参数列表一致的候选者
严格匹配候选者的函数类型与函数指针的函数类型
#include <stdio.h>
#include <string.h>
int func(int x) // int(int a)
{
return x;
}
int func(int a, int b)
{
return a + b;
}
int func(const char* s)
{
return strlen(s);
}
typedef int(*PFUNC)(int a); // int(int a)
using Pfunc = int(*)(int a);
int main()
{
int c = 0;
PFUNC p = func;
c = p(1);
printf("c = %d\n", c);
return 0;
}
struct结构体升级:
-
升级1.定义变量
student stu;省去了 struct; -
升级2.可以保存变量和函数 ;
-
升级 3.用class替换struct ;
-
升级4.引入了访问权限修饰符 :
public(可以在结构体或者类外访问 )
protected(只允许结构体/类内访问 )
private(只允许结构体或者类内访问 ); -
升级5.实现继承,多态;
string类:
string类的使用需要包含头文件 #include,string类位于std命名空间中 ,使用前说明如下语句 :
using std::string;或 using namespace std;
每一种类型的容器都都会提供begin()和end()来获取一个迭代器 ,迭代器有点类似指针。
(1)begin()函数获取的是一个指向容器第一个元素的迭代器;
(2)end()函数获取的是一个指向容器中最后一个元素的迭代器 。
vector类:替换数组的使用;