const
C:
将变量修饰为只读变量
const int a = 1;
int *p = &a;
*p = 2;
cout << a << endl;
输出结果2
const修饰变量虽然不能直接用变量名修改,但是可以通过指针等方法修改地址来操作。
传递函数形参(保护函数实参不在函数执行过程中被修改)函数接口的安全性
传值(只使用不修改实参)
传地址(既使用也修改实参)
C++:
const修饰的变量就是常量
指针或者引用类型,一定是const对const
const int a = 1;
const int * p = &a;
const char ptr * = “hello world”;(修饰后面常量字符串使用常指针)
引用
定义:给变量起别名(可以做函数形参和返回值)
int num = 5;
int &r_num = num;
num别名为r_num
定义必须初始化
绑定某个变量之后不能再次绑定其它变量
作用:解决传地址与传值的选择性问题
void swap(int &a,int &b){
int temp;
temp = a;
a = b;
b = temp;
}
不用再定义指针并操作指针
定义函数时,一定要考虑函数的实参安全性(是否要加const)
常引用也必须const对const,引用常量
int & func(){
int a = 1;
return a;
}
func() = 2;
引用后函数返回值可以作为左值,一般引用函数返回值是为了可对返回值接着修改使用。
C++11:左值引用 右值引用
左值:可以赋值,可以取地址
右值:不可以赋值
左值引用只能绑定左值,右值引用只能绑定右值(对象移动)
int count = 5;
int &lr_count = count;(一个&绑定左值count)
int &&rr_count = 5; (两个&绑定右值’5’)
左值转化成右值
std::move(count)
引用 VS 指针
引用只能绑定一次,指针可以绑定任意的变量
引用(系统级,用户无法操作)和指针(用户可以操作)都占用内存空间
效率,安全性:推荐使用引用
constexpr
constexpr int max2(int a,int b){
return a > b ? a : b;
}
修饰函数,编译阶段就已确定结果,省去了运行时函数的传参执行释放等过程,提高了运行效率。替换宏函数(返回的一定是一个常量)
NEW和DELETE
C中: char * ptr = (char *)malloc(sizeof(char)*100);
C++中: char * ptr = new char[100];
new运算符—调用malloc
delete运算符—调用feee
delete [] ptr;释放数组
deletr ptr;释放变量
malloc是函数,new是运算符
malloc是以字节为单位,new是以数据类型为单位
malloc不能初始化,new可以初始化
new char(‘A’);
#include
using namespace std;
void fuc1(char * ptr){
}
void fuc2(char *str[100]){
}
void fuc3(char (*ktr)[2][100]){
}
void fuc4(**wtr){
}
int main()
{
char ptr[100] = {“hello1”};//一维数组名:保存数组首元素的地址 &ptr整个一维数组的地址 步长:数组的长度
char str[2][100] = {“hello2”,“hello3”};//二维数组名:保存首个一维数组的地址
char ktr[2][2][100] = {{“hello3”,“hello4”},{“hello5”,“hello6”}};//三位数组名:保存首个二维数组的地址
char *wtr[3] = {“hello7”,“hello8”,“hello9”};//实际是一维数组
fuc1(ptr);
fuc2(str);
fuc3(ktr);
fuc4(wtr);
return 0;
}
二维数组
char **str = new char *[2];
for(int i = 0;i < 2;i++)
{
str[i] = new char[100];//稍微变化,可以形成不等长多维数组
}
三维数组
char ***ktr = new char **[2];
for(int i = 0;i < 2;i++)
{
ktr[i] = new char *[2];
for(int j = 0;j < 2;j++)
{
ktr[i][j] = new char[100];
}
}
nullptr
char *ptr = NULL;
char *str = nullptr;//空指针
函数重载/函数默认参数
int add(int a, int b)
{
return a + b;
}
double add(double a, double b)
{
return a + b;
}
实现原理:函数重命名
规则:参数个数不同,参数类型不同,参数的顺序不同(前提条件:类型不同 int a,doubleb/double a,int b)
函数返回值不同不构成重载条件
函数指针也可以重载
函数默认参数
int sub(int a,int b = 10){
return a+b;
}
规则:当前参数的右边参数全部为默认参数
默认参数会影响重载条件!!!
内嵌函数inline
时间(编译时间,运行时间)、空间(内存空间)
用时间(编译时间)换空间:宏函数 VS 自定义函数
用空间换时间(运行时间):inline函数
使用时机:频繁调用且功能短小简单的函数
注意事项:内联函数中不可有循环,不可为递归函数,不能有静态变量,不可含有错误处理
申请编译器
inline int max(int a,int b)
{
return a > b ? a : b;
}
通过函数名找到函数入口,形参分配空间,传参,执行函数体语句,返回,释放----占用运行时间
编译阶段直接把函数体语句嵌套在函数调用处的下一行