inline:修饰的函数为内联函数/内嵌函数
空间(内存)与时间(编译时间和运行时间)问题:
以时间换空间:消耗了更多编译/运行时间,换取占用更少的内存
以空间换时间:占用更多的内存空间,换取运行时间
以时间换空间举例:宏函数
#define MAX(a,b) a>b?a:b
int max(int a,int b)
{
return a+b;
}
int max_i MAX(6,5);
宏函数的处理阶段:预处理阶段
宏函数的处理过程:傻瓜式替换(没有空间分配过程) 不做语法检查!! 导致不安全
自定函数的处理阶段:编译时检查语法、运行时函数进行栈进栈出
自定函数的处理过程:铜鼓哦函数名找到函数的入口地址;给形参分配空间;传值:执行函数体里的语句;函数返回;释放空间。
以空间换时间举例:inline(内敛函数)
int add(int a, int b)
{
return a+b;
}
//改变了函数调用的处理过程!!(将函数体里的语句内嵌到函数的调用地方!!)
inline int add(int a, int b)
{
return a+b;
}
inline在C++中的升级:
inline是由编译决定,使用inline关键字只是申请编译器;(编译器决定是否内敛处理)
限制:
1 内联函数中不可含有循环;
2 内联函数中不可能含有静态变量;
3 内联函数不可为递归函数;
4 内联函数中不可含有错误处理
注意事项:内联函数的定义必须出现在内联函数第一次调用之前;
默认参数:C++中可以在函数声明时为参数提供一个默认值,
当函数调用时没有指定这个参数的值,编译器会自动用默认值代替
注意事项:如果一个参数为默认参数,那么它右边的所有参数必须为默认参数
函数的参数占位符:预留函数接口
函数重载:解决函数命名的可读性问题!!
概念:用同一个函数名定义不同的函数
当函数名和不同的参数搭配时函数的含义不同
函数重载至少满足下面的一个条件:
-
参数个数不同
-
参数类型不同
-
参数顺序不同
(函数返回值不能作为重载条件)
注意事项:默认参数可能会影响函数重载,编译器不知道如何选择,从而产生二义性问题。
struct的加强
升级一:不需要加struct,直接用结构体名来定义变量
c中:
struct Student
{
char name[20];
int age;
}
struct Student stu = {"wang",10};
c++中:
struct Student
{
char name[20];
int age;
}
Student stu = {"wang",10};
升级二:可以保留变量和函数
升级三:用class(类)替换struct(结构体)
升级四:引入了访问权限修饰符 :
public(可以在结构体或类外访问)
protected(只允许结构体或类内访问)
private(只允许结构体或类内访问)
在struct定义类时,所有成员默认属性为public
在用class定义类时,所有成员的默认属性为private
在类里:变量 被称为成员变量 或 属性
函数 被称为成员函数 或 成员方法
类就是一个结构体
对象:结构体定义的一个变量
class VS struct
区别一:命名不同(对象、变量)(方法、函数)(属性、变量)
区别二:默认访问权限不同(struct默认访问权限是公有的,而class默认访问权限是私有的)
#pragma once 防止头文件重复包含
string类的各种函数
迭代器生成两个指针:头指针在第一个字符,尾指针在最后一个有效字符的后一位
s1[i]与s1.at(i)的区别
当使用s1[i]时,当s1=“hello world”,打印s1[100]时产生了越界错误,但是编译器不报错不警告;
当使用s1.at(i)时,编译器不会报错,at更加安全
rbegin:指向最后一个地址
rend:指向第一个地址,与begin和end相反(逆序遍历)
vector类用于替换数组,需要包含头文件#include