0%

C++ 之初体验

前言

C++与Objective-C都是在1980+年代诞生,所以语法糖上面都有很多相似地方,学起来并不难。至于我用的IDE,我直接用的是Xcode,很方便。

国际惯例,打印hello world

1
cout << "hello world" << endl;

这里介绍几个关键词:

cout 输出
cin 输入
endl 换行打印

cout 语法形式:

1
2
cout << x << endl;
cout << "x + y =" << x+y << endl;

cin 语法形式:

1
2
cin >> x;
cin >> x >> y;

这样的输入、输出方式有哪些便利?
1、不用关注占位符
2、不用关注数据类型
3、不易出现问题

C++命名空间(namespace)

在C++中,名称(name)可以是符号常量、变量、宏、函数、结构、枚举、类和对象等等。为了避免,在大规模程序的设计中,以及在程序员使用各种各样的C++库时,这些标识符的命名发生冲突,标准C++引入了关键字namespace(命名空间/名字空间/名称空间/名域),可以更好地控制标识符的作用域。

举个例子:同个年级有相同名字的同学,那样为了避免认错人,我们可以把他们分到不同班级里,这样就区分开来了。这里的班级就可以称为命名空间。

关于命名空间描述几点

1、使用namespace定义命名空间。
2、通过命名空间可以区分具有相同名字的变量。
3、通过命名空间可以区分具有相同名字的函数。

代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <stdlib.h>
using namespace std;
namespace myNum //填写命名空间的关键字
{
int x = 105;
}
int main()
{
// 使用bool类型定义isOdd,作为状态位
bool isFlag = false;

if(myNum::x % 2 == 0)
{
//改变状态位的值,使其为false
isFlag = false;
}
else
{
//改变状态位的值,使其为true
isFlag = true;
}
// 判断状态位的值
if(isFlag)
{
// 如果状态位的值为true,则打印变量x是奇数
cout << x是奇数 ;
}
else
{
// 如果状态位的值为false,则打印变量x是偶数
cout << x是偶数 ;
}
return 0;
}

C++ 引用

代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
int main(void)
{
int x = 3;
//定义引用,y是x的引用
int &y = x;
//打印x和y的值
cout << x << endl;
cout << y <<endl;
//修改y的值
y = 100;
//再次打印x和y的值
cout << x << endl;
cout << y <<endl;
return 0;
}

C++ const关键字

代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//const
#include <iostream>
using namespace std;
int main(void)
{
//定义常量count
const int count = 3;
const int *p = &count;
//打印count次字符串Hello C++
for(int i = 0; i < count; i++)
{
cout << "Hello C++" << endl;
}
return 0;
}

C++函数新亮点

函数参数默认值
1
void fun( int i,int j=5,int k=10 );//有默认参数值的参数必须在参数表的最右端
函数重载

在相同作用域内
用同一个函数名定义的多个函数
参数个数和参数类型不同

内联函数

编译时将函数体代码和实参代替函数调用语句
内联函数关键字:inline

关于C++函数形参默认值的说法

1、当函数有多个形参时,可以都有默认值。
2、当函数有多个形参时,可以都没有默认值。
3、当函数有多个形参且都有默认值时,实参个数可以少于形参个数。

代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
using namespace std;
/**
*函数功能:返回a和b的最大值
*a和b是两个整数
*/
int getMax(int a, int b)
{
return a > b ? a : b;
}

/**
* 函数功能:返回数组中的最大值
* arr:整型数组
* count:数组长度
* 该函数是对上面函数的重载
*/
int getMax(int *arr,int count)
{
//定义一个变量并获取数组的第一个元素
int maxNum = arr[0];
for(int i = 1; i < count; i++)
{
//比较变量与下一个元素的大小
if(maxNum < arr[i])
{
//如果数组中的元素比maxNum大,则获取数组中的值
maxNum = arr[i];
}
}
return maxNum;
}

int main(void)
{
//定义int数组并初始化
int numArr[3] = {3, 8, 6};

//自动调用int getMax(int a, int b)
cout << getMax(numArr, 3) << endl;

//自动调用返回数组中最大值的函数返回数组中的最大值
cout << getMax(numArr[0], numArr[2]) << endl;
return 0;
}

C++内存管理

什么是内存管理?

内存的本质是资源
操作系统掌管内存资源
对于我们开发者,我们能手动申请与归还
申请/归还内存资源就是内存管理

如图:

img

1A160E69-BD72-4B65-983B-AE17F12E7A9B.png

img

C8FEF922-5C3C-4AF6-9CD6-67F01BED98A5.png

内容总结
使用new申请内存,使用delete释放内存
申请内存需要判断是否成功,释放内存需要设空指针
new与delete配套使用

代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <string.h>
#include <iostream>
using namespace std;
int main(void)
{
//在堆中申请100个char类型的内存
char *str = new char[100];
//拷贝Hello C++字符串到分配的堆中的内存中
strcpy(str, "Hello imooc");
//打印字符串
cout << str << endl;
//释放内存
delete []str;
str = NULL;
return 0;
}