# c/c++学习笔记
# c
# c++
## 命名空间
我们在写c++程序的时候,开始的时候都写这句话`using namespace std;`,这个话的意思就是把标准库里面的东西展开。
还有,我们在给变量或者是函数起名的时候,如果出现了重名的情况,编译器是不能分辨出来的,如果把它们放在不同的命名空间内就不会出现这种情况了。
这样对空间进行命名:`namespace + 名字`,使用的时候`名字::成员名`
```cpp
namespace ML
{
int a = 10;
}
int main()
{
int a = 1;
cout << a << endl;
cout << ML::a;
return 0;
}
```
如果嫌麻烦就直接用`using`展开命名空间,或者展开常用的成员
命名空间也可以嵌套。
## 缺省参数
所谓的缺省参数就是在函数声明或者定义的时候,给参数一个值,(注意:声明和定义不能同时缺省参数)
```cpp
void f(int a, int b);
//void f(int a = 10, int b = 20)错误
//void f(int a, int b = 20)错误
//void f(int a , int b = 20)错误
void f(int a = 10, int b = 20)
{
printf("a=%d,b=%d", a, b);
}
```
缺省参数分为:全缺省,半缺省,不缺省。
对于半缺省:
从右往左进行缺省。不能从左往右,不能跳跃缺省。
对于缺省参数传参时,从左往右进行传参。
## 函数重载
函数重载:同一作用域下的同名函数。函数名相同,函数参数的类型不同,对函数返回值没有要求。
```cpp
int f(int a, int b)
{
cout << a <<' ' << b << endl;
return 0;
}
int f(int a, char b)
{
cout << a <<' ' << b << endl;
return 0;
}
void f(char a, int b)
{
cout << a << ' ' << b << endl;
}
int main()
{
f(1, 1);
f(1, 'a');
f('a', 1);
return 0;
}
```
![image-20220710104224127](https://img-blog.csdnimg.cn/img_convert/54d708192ec23386ca696bd20a2deceb.png)
为什么c++支持函数重载,而c不支持函数重载呢?
这是因为c++有函数名的修饰,函数修饰的规则为`_Z+函数长度+函数名+参数类型的首字母` ,而 c 语言没有这种修饰规则。
### extren “C”
当c++中想用C语言,该怎么使用呢?
那么我们只需要把使用c语言的部分用`extern “C”`包围住就行。
## 引用
引用就是取别名。在语法意义上就是同一块空间。
引用的使用:`类型+&+新名字`
```cpp
int a = 10;
int& b = a;
cout << b << endl;
cout << a << endl;
```
![image-20220710105335463](https://img-blog.csdnimg.cn/img_convert/b72434ef3bcea7e65947a894357bc21e.png)
引用做返回值时,要注意不能返回局部变量,否则会造成越界访问。
```cpp
int& f(int a)
{
a = 20;
return a;
}
int main()
{
int& ret=f(10);
cout << ret << endl;
cout << ret << endl;
return 0;
}
```
![image-20220710110437855](https://img-blog.csdnimg.cn/img_convert/204a0b7d96a701881d3d0151994fb9cd.png)
![image-20220710110506089](https://img-blog.csdnimg.cn/img_convert/6e3b0328c76738524bbda823c2f5ea9b.png)
那里的a为局部变量,当函数调用完成的时候,局部变量被销毁,对此时的空间在进行访问就是非法的。
### 常引用
```cpp
int a = 10;
const int& pa = a;
double& pa1 = a;
const double& pa2 = a;
```
对于上面的a来说,它是整型,有读和写的性质。pa只具有读的性质,可以把a给pa。
pa1为double型的,a为整型,需要整型提升。在整型提升的时候,a本身是不变化的,此时会创建一个临时空间。而这个空间的别名就是pa1,但是这个空间里面的数据为常量,是不能被改变的,所以要有const进行修饰才可以,让它只具有读的功能。
```cpp
int a = 10;
const int& pa = a;
const double& pa2 = a;
printf("&a=%p\n", &a);
printf("&pa=%p\n", &pa);
printf("&pa2=%p\n", &pa2);
```
![image-20220710181111210](https://img-blog.csdnimg.cn/img_convert/b3f7decebd82be2e75950c751d248d9c.png)
从上面的运行结果可以看出,pa2的并本身并不是a处的空间了。
==可以进一步看看汇编:==
引用与指针:
1.引用需要初始化,指针不需要
2.引用一个实体之后就不能再引用其他的实体,指针可以指向相同类型的不同实体。
3.有空指针,没有空引用
4.引用比指针较为安全。
## 内联函数
在函数前加上`inline`,不进行函数的调用,在编译的时候就被展开了。这是一种空间换时间的做法,减少了压栈及销栈的开销。
并不是加上这个关键字之后都会被展开,如果在函数体里面有大量的循环,递归,或者展开之后代码量比较多,都会不进行展开。
不建议声明和定义分离,因为可能会出现链接错误的情况。
## 空指针
我们在学习c语言的时候空指针为`NULL`,c++中空指针为`nullptr`。
为什么没有延用c语言中的NULL呢?
看下面这个代码:
```cpp
void f(int)
{
cout << "int" << endl;
}
void f(void*)
{
cout << "void*" << endl;
}
int main()
{
f(0);
f(NULL);
f(nullptr);
return 0;
}
```
运行的结果为:
![image-20220719121150062](https://s2.loli.net/2022/07/19/QYCuhTStaVbDsNB.png)
为了避免出现这种情况,c++加入了nullptr这种空指针。因为NULL的值为0。
## auto
在C++11中,赋予了auto的新用法。可以自动判断变量的类型,必须对auto声明的变量进行初始化。
```cpp
int main()
{
auto a = 10;
auto b = 1.1;
auto p = 'a';
cout << typeid(a).name() << endl;
cout << typeid(b).name() << endl;
cout << typeid(p).name() << endl;
//auto e 这样没有初始化就是错误的
return 0;
}
```
![image-20220727214602368](https://s2.loli.net/2022/07/27/rUSLOvT8oWfsbDB.png)
auto声明指针的时候,auto和auto*都一样
auto声明引用的时候必须加上&。
```cpp
int a = 1;
auto b = &a;
auto* c = &a;
auto& d = a;
cout << *b << endl;
cout << *c << endl;
cout << d << endl;
```
![image-20220727221218432](https://s2.loli.net/2022/07/27/tyNUJlk3CmEiD61.png)
在一行中定义多个变量的时候,要为同一个类型,否则就会报错。
```cpp
auto a = 1, b = 2;
auto c = 1, d = 1.1;
```
![image-20220727215335546](https://s2.loli.net/2022/07/27/t9PKIAp57YJBeL8.png)
**auto不能自动推导的情况**
+ 作为函数的参数
+ 不能用来直接声明数组
没有合适的资源?快使用搜索试试~ 我知道了~
记录C-C++学习的过程.zip
共44个文件
cpp:10个
tlog:6个
h:5个
需积分: 9 0 下载量 31 浏览量
2022-10-18
09:13:42
上传
评论 2
收藏 1.98MB ZIP 举报
温馨提示
记录C_C++学习的过程.zip记录C_C++学习的过程.zip记录C_C++学习的过程.zip记录C_C++学习的过程.zip记录C_C++学习的过程.zip
资源详情
资源评论
资源推荐
收起资源包目录
记录C_C++学习的过程.zip (44个子文件)
C-CPP-master
模板
模板
test.cpp 1KB
test.cpp 1KB
动态内存分配
动态内存分配
test.cpp 8KB
通讯录
.vs
通讯录
v17
Browse.VC.db 1.71MB
.suo 34KB
ipch
AutoPCH
8b66a0de36b0d311
CONTACTS.ipch 3.13MB
1a9d975110c55a8c
TEST.ipch 3.13MB
通讯录
contacts.h 907B
test.c 1KB
通讯录.vcxproj 7KB
通讯录.vcxproj.filters 1KB
x64
Debug
test.obj 22KB
vc143.pdb 84KB
通讯录.ilk 681KB
通讯录.exe.recipe 277B
通讯录.tlog
通讯录.lastbuildstate 148B
CL.write.1.tlog 888B
CL.read.1.tlog 7KB
CL.command.1.tlog 1KB
link.write.1.tlog 378B
link.command.1.tlog 1KB
link.read.2.tlog 3KB
contacts.obj 38KB
vc143.idb 59KB
通讯录.log 84B
contacts.c 4KB
通讯录.vcxproj.user 165B
通讯录.txt 272B
通讯录.sln 1KB
x64
Debug
通讯录.exe 69KB
通讯录.pdb 1.17MB
日期类
日期类
test.cpp 496B
Date.h 2KB
Date.cpp 3KB
LICENSE 34KB
类和对象
类和对象
test.cpp 3KB
vector
vector
test.cpp 1KB
vector.h 884B
测试.cpp 1KB
string
string
test.cpp 7KB
string.h 6KB
类和对象下
类和对象下
test.cpp 6KB
README.md 6KB
测试.h 61B
共 44 条
- 1
不安分的小女孩
- 粉丝: 9211
- 资源: 1990
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0