1.回顾C语言语法
重难点:
1.函数的一些改变
2.命名空间
1.1回顾C语言
- 基本数据类型,运算符,表达式,语句
- 函数,数组,自定义数据类型
- 指针,预处理
了解C++
1.2新类型:bool
-
what:用来描述真假
-
why
-
how
-
sizeof(bool)
-
取值范围:true(真),false(假)
- 简单来说就是bool类型只有true和false两个取值,如果不取这两个随便取个数字就会溢出。在这里,对溢出采取的是非零为真。
int main() {
bool a = true;
a = false;
a = 123; //这个是真的,会溢出
a = 3.14; //这个是真的,会溢出
a = 0; //这个是假的
printf("%d\n", sizeof(bool));
return 0;
}
1.3内联函数
通过“内存膨胀”的方式,以空间换取时间的函数。
目的:提高程序运行的速度
代价:有得必有失
内存膨胀:代码区代码变多占用更多空间,使用内联函数后就不去栈区了,少了个入栈出栈的时间。
inline void func(int num);//函数声明,多了个inline就是内联函数声明了
inline void func(int num) {
printf("void func(int num); numm = %d\n", num);
}
int main() {
func(6);
return 0;
}
/*
inline 返回值类型 函数名(参数表){
函数体;
}
*/
-
还是一个函数,该调用就调用。
-
是通过内存膨胀实现函数跳转的。
-
函数体不能太长,函数体里不建议写循环。
-
如果是简单的赋值或者返回的语句使用频率很高建议写成内联函数。
1.4函数重载
在同一个项目中定义的函数名字可以重复。
函数名必须一致。
函数的参数列表不同。(参数个数不同)(参数个数相同但对应位置上类型不同)
//错误示范
int func() {
}
float func() {
}
int main() {
func();
return 0;
}
----------------------------------------
//正确示范
int func(int n) {
}
float func() {
}
int main() {
func();
return 0;
}
为什么会这样呢?
因为调用func这个函数的时候,函数要传参。main函数里func();
是一个不需要参数的函数,自然就调用float func()
了
如果main函数里func(5);
是一个需要参数的函数,自然就调用int func(int n)
了
根据你的参数来选择重名的重载函数。
但是重载函数也有缺陷
int func(int n) {
}
float func(float v) {
}
int main() {
func(3.14);//二义性
return 0;
}
这里面入参是3.14,是double类型的。这里面没有double类型的。double类型是双精度,降一级就到单精度了。丢掉小数部分到整数,这个时候编译器就不知道去那个了。就会报错了。
这个时候要么加一个double的函数,要么把3.14后面写个f,或者(int)3.14。
也就是要么解决问题,要么解决提出问题的人。
1.5函数参数缺省
参数:形参,实参
缺省缺的是实参。
函数参数缺省:声明函数某个参数的时候指定一个默认值,调用该函数的时候如果采用默认值,无需指定该参数。给形参一个默认值,这样之后传实参就少传一个。
默认这样:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void function(int num, float val) { //形参
printf("num=%d,val=%f\n", num, val);
}
int main() {
function(6, 3.14f); //实参
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void function(int num, float val = 0.0f) {
printf("num=%d,val=%f\n", num, val);
}
int main() {
function(6, 3.14f);
function(8);//调用的时候形参少传一个值
return 0;
}
要注意:
![]() | ![]() |
---|
![]() | ![]() |
---|---|
可以全部缺省,但是上面的参数要给 | 全部缺省,但是上面的参数没给全,所以错了 |
函数已经有声明的情况下,只要声明的时候给值,定义的时候不要给。
这里定义了俩个function()函数,main()函数里的function();就不知道调用哪一个了。这种情况就会报错。
解决办法:
- 要么删掉其中一个function();函数
- 要么给function();里面传参
1.6引用
对一个变量或者对象取的别名。
定义应用的时候必须要初始化。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
int num = 0;
int& dd = num; //int& 表示创建了引用
printf("num=%d\n", num);
dd = 10;
printf("num=%d\n", num);
return 0;
}
这里的dd和num对应的都是同一段内存。
通过引用来方便书写
int main() {
int gameControlNum = 9;
int& gcn = gameControlNum; //通过引用来方便书写
return 0;
}
1.7命名空间
命名空间是用来组织和重用代码的编译单元。
通过命名空间来避免冲突,解决重名现象。
作用域符号**::**
怎么让namespace里面的func_2()调用外面的funcc_2()呢?除了指针,还可以用命名空间。
可以读作NAME_1里面的func_2()。
局部命名一个命名空间。
两个命名空间名字一样,说明这两个是同一个命名空间,也可以叫命名污染。
可以利用这个命名污染在不同的地方补充同一个空间。
命名空间取别名。方便记忆,增加代码可读性。
注意事项:
-
名字必须是合法标识符。
-
命名空间可以全局命名一个,也可以局部命名一个。
-
两个命名空间名字一样,说明这两个是同一个命名空间,也可以叫命名污染。
-
命名空间取别名。方便记忆,增加代码可读性。
1.8cin和cout
cin的作用类似scanf。
cout的作用类似于printf。他们在具体使用的时候有些区别。
使用cin和cout的时候要用#include <iostream>
这个头文件。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <iostream>
int main() {
int num;
//cin和cout是存放在std这个命名空间里面的。
std::cin >> num;//进入num空间,输入的数字会赋值给num
std::cout << num;//输出num
return 0;
}
不想重复写命名空间
using namespace std;//不想重复写命名空间就写这个
int main() {
int num;
cin >> num;//进入num空间,输入的数字会赋值给num
cout << num;//输出num
return 0;
}
//如果不想写using namespace std;就这么写。因为std实际上蛮大的,这么写会没那么大。
using std::cin;
using std::cout;
using std::endl;
int main() {
int num;
cin >> num;//进入num空间,输入的数字会赋值给num
cout << "num=" << num << endl;//输出num
return 0;
}
1.9new和delete
new的作用类似于malloc,用来申请内存。
delete的作用类似free,用来释放内存。
上面两个只能释放单个内存空间。
最后一行可以释放连续的内存空间。从p3所存储的首地址,一直释放到你申请的时候做标记的地方。
比如上面申请的时候申请了10个空间,申请的首地址存在p3里面,然后10个int也就是40个字节结束的时候,会做一个你不知道的标记,这个标记你释放的时候就会释放到 这个做了标记的地方。
注意:
- 初始化用(),批量申请用[ ]。
- 释放连续的内存空间,delete后面要加[ ]
- delete释放的时候,从前往后释放,所以要从首地址释放,不然会有部分没释放。