一些c++基础相关笔记

本文详细介绍了C/C++编程中的const关键字,包括其在变量、指针和函数参数中的应用,以及如何通过指针绕过const限制。同时,讨论了引用的概念和特性,如作为函数参数的优势。还涵盖了内存管理,如new和delete的使用,以及数组的动态分配。最后,提到了内联函数、函数重载和默认参数等编程技巧,强调了它们在优化效率方面的作用。
摘要由CSDN通过智能技术生成

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;
}
通过函数名找到函数入口,形参分配空间,传参,执行函数体语句,返回,释放----占用运行时间
编译阶段直接把函数体语句嵌套在函数调用处的下一行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洋芋辰丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值