一. C++基础
文章参考:
1. 一个简单的案例
#include <iostream> //编译预处理命令
using namespace std; //使用命名空间
int add(int a, int b); //函数原型说明
int main() //主函数
{
int x, y;
cout << "Enter two numbers: " << endl;
cin >> x;
cin >> y;
int sum = add(x, y);
cout << "The sum is : " << sum << '\n';
return 0;
}
int add(int a, int b) //定义add()函数,函数值为整型
{
return a + b;
}
2. 输入输出
相较于C,C++提供了更加便利的输入(cin)输出(cout)方式,其特点如下:
- 输出自适应类型,无需像C一样规定输出的类型。
- 可连续输入输出。
- 依赖于
<iostream>
文件 - 默认情况下,运算符
>>
将忽略空白符,然后读入与后面变量类型相对应的值,也就是说,>>
运算符无法直接输入空格、回车符、制表符,但我们可以通过ASCII码转义来输入空格、回车符、制表符。
int x;
int y;
cin >> x >> y; // 输入
cout << x << "\n" << y <<endl; // 输出,endl是换行符
3. 内联函数
定义:在函数声明和定义语句之前加上inline
,该函数就可以被声明为内联函数。
作用:每当程序中调用内联函数时,C++编译器就会将函数的代码替换到调用该函数的地方,从而消除调用函数时的系统开销,以提高运行速度。
注意:
- 虽然是将代码替换过来,但对于形参的操作没有变化,除非使用指针或引用,否则依旧无法改变实参的值。
- 内联函数内一般不要有复杂控制语句,如for、switch、while。
- 内联函数实际上是空间换时间的操作,因此如果内联函数较长、较复杂、调用较为频繁,则不建议使用。
内联函数可以在一定程度上代替宏定义,从而消去宏定义的不安全性。
4. 带有默认值参数的函数
说明:C++中函数的参数域可以带有默认值,在进行函数调用时,如果传入的实参个数小于函数的形参个数,那么将从左到右,先将将传入的实参值给到形参,然后剩下的形参取默认值。
EG:
// 参数默认值
void defaultParam(int a, int b=10, int c=10);
void defaultParam(int a, int b, int c){
cout << "a==" << a << "\r"
<< "b==" << b << "\r"
<< "c==" << c << endl;
}
注意:
-
在函数原型中,所有有默认值的参数都必须位于没有默认值的参数的右边。
-
在函数调用时,若某个参数省略,则其后的参数皆应省略而采取默认值。不允许某个参数省略后,再给其后的参数指定参数值。
-
一个函数可以经过多次声明,但在给定的作用域内一个形参只能被赋予一次默认实参,也就是说,函数在后续声明中只能赋予没有默认值的形参以默认实参,且该形参的右侧所有形参必须都有默认值。同时也要注意函数定义时也是如此(但函数定义只能定义一次)。
int f(int a,int b,int c,int d); //第一次声明 int f(int a,int b,int c,int d=0); //第二次声明,添加默认实参d int f(int a,int b,int c=1,int d); //第三次声明,注意此处不能再次赋予形参d一个值 int f(int a=4,int b=3,int c,int d); //第四次声明,注意一旦形参a赋值后,其后所有值都必须有默认值,且不能重复赋值已有实值的形参 //函数定义,注意在定义时不能再次给已有默认值的形参赋值 int f(int a,int b,int c,int d){/**/}; //虽然函数可以多次声明,但是只能定义一次。 int ff(int m=0,int n=1,int p=2){/**/};
-
带默认值的函数和函数重载一起使用,可能会引发二义性。
void Drawcircle(int r = 0, int x = 0, int y = 0); void Drawcircle(int r); Drawcircle(20);
5. 函数重载
定义:在同一作用域内,只要函数的参数列表不同(包括参数种类不同,或参数个数不同,或二者兼有),那么这些函数就可以使用相同的函数名。
void ioFun();
void ioFun(int a);
// double ioFun(); 会报错,因为函数重载条件不包括返回值类型。
注意:
- 函数重载对函数返回值不敏感,对参数名也不敏感,因此无法通过它们实现函数重载。
- 函数重载与带默认值的函数一起使用,有可能引起二义性。
6. new和delete
说明:不同于C的malloc()
和free()
,C++提供了运算符new
和delete
来对堆区进行动态内存管理,且使用更加方便。
EG:
void assignMemory(){
// 为基础类型分配空间并初始化
int *a = new int(99); // 为a分配sizeof(int)的空间并将其初始化为99
cout << *a <<endl;
delete a; // 释放sizeof(int)的空间
// 数组分配空间并初始化
int *p = new int[10]; // 为p分配sizeof(int)*10的空间,未初始化
for (int i = 0; i < 10; i++)
{
p[i] = i;
}
delete []p; // 释放p指向的数组的空间
}
注意:
- 当内存分配失败时,
new
会返回空指针NULL
。 - 分配的内存一定要记得释放
7. 引用(reference)
说明:引用就是为变量起别名,当使用该别名时,操作的空间和原变量的空间地址一模一样,省略了使用指针操作时的解引用过程。
语法:
类型 &引用名 = 已定义的变量名
注意:
- 引用本身并不是一种数据类型,它的存在依赖于其它变量,因此引用
在声明时就必须初始化,不能先声明再初始化
。 - 不能建立起void类型的引用。
- 因为引用本身不是一种数据类型,必须依存于其它的是数据类型,因此不能建立起引用的引用,也不能有指向引用的指针。
- 可以用const对引用加以限定,不允许改变该引用的值,但是它不阻止引用所代表的变量的值。
- 和指针不同,指针本身就是一种基础数据类型,用于保存地址,大小固定为8个字节;而引用的大小则随着其相连变量的大小而变化,如应用int类型,那就是4个字节,引用long long int类型,就是8个字节。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!