C到C++笔记记录
- 输入(cin) and 输出(cout)
- bool
- 内联(inline)
- 重载
- 缺省函数
- 哑元
- 引用(&)
- C++动态内存分配
- 笔记扩充:
输入(cin) and 输出(cout)
#include<iostream>using namespace std;void main()
{int i;//输入 cincin >> i;//输出 coutcout << i << endl;system("pause");//暂停窗口
}
bool
bool b = true (表示真)
bool b = false (表示假)3
内联(inline)
(PS:调用函数复杂度的高的不推荐使用内联操作)
1.避免重复调用函数(PS:类似递归操作)
2.牺牲空间 换取高效率
3.写了inline关键字不代表一定会按照内联的运行方式去运行(简单说鸡肋)
(PS:内联的运行方式:简单说 无需重新申请 调用函数,可以直接调用函数)
重载
- (1)重载解释:
1.同一个作用域 函数名相同 参数不同的函数
(PS:两个函数名字一样,但是里面所带的参数类型不一样)
2.重载和返回类型无关
(PS:重载与函数类型没有关系,不论是函数类型相同不相同。只要函数名相同 参数相同 则不能重载)
3.重载遵守临近隐藏原则
(PS:相同函数名或变量名,优先调用距离最近一次声明的函数和变量)
- (2)可以重载的要求:
2.参数 个数 不一样 可以重载
3.参数 顺序 不一样 可以重载
4.参数 类型 不一样 可以重载
缺省函数
- 缺省函数解释:
写函数参数时定义 形参的默认值,当 实参 传入时 没有变量 ,则使用 形参默认值 代替实参
(PS:为函数指定 默认值,调用时若未提供实参,则对应位置的形参用默认值代替)- 使用要求:
1.缺省参数必须从 右边第一个参数 开始定义
2.禁止声明和定义时同时指定缺省参数(PS:最好在声明时指定缺省参数 )
3.缺省参数禁止在重载时使用(会造成重载歧义)
源码
#include<iostream>
#include<stdlib.h>
using namespace std;void fun(char a = 'w',char b = 's' ){cout << "Worl"<< a << b << endl;
}
void main()
{fun();//无参时输出'Worlws'fun('d','s');//传参时输出'Worlds'system("pause");
}
运行结果:
Worlws
Worlds
请按任意键继续. . .
哑元
- 哑元解释:
将 形参变量名 删除,只有函数类型称为 哑元 。当形参变量被删除时函数内变量会停止使用(详细看源码)- 哑元用处:
1.可以用来占形参位置
2.兼容老版本
3.形成函数重载
源码
#include<iostream>
#include<stdlib.h>
using namespace std;
//将 a 进行注释后,a 不会被传参传入
void fun(char /*a = 'w'*/,char b = 's' ){cout << "Worl"<< a << b << endl;
}
void main()
{fun();//无参时输出'Worls'fun('d','w');//传参时输出'Worls'system("pause");
}
运行结果:
Worls
Worls
请按任意键继续. . .
引用(&)
引用解释:
引用相当于给变量取别名,对引用的操作相当于直接影响变量(PS:与C语言中指针用法差不多,但是引用就相当于一个别名。)引用注意事项:
1.引用是一对一的,地址不变,值能变(但是能改变值);
2.引用必须初始化 and 不能为空
3.引用做参数 形参就相当于实参
4.引用不额外占用内存
#include<iostream>
#include<string>using namespace std;
//取最大值
int Max(int& a, int b)
{a = 2;//改变引用形参的值(此时改变会影响实参)b = 5;//改变形参的值(此时改变并不影响实参)return a > b ? a: b;
}
int& Add(int &a)
{return ++a;
}
void main()
{//1. 引用是一对一的,地址不变,值能变(但是能改变值);int a = 18;int &function = a;cout << "改变前的地址" << &function << endl;function = Add(a);cout << "改变后的地址" << &function << endl;cout << "Add:" << function << endl;int test = 30;//2. 引用必须初始化 and 不能为空//初始化int &t = test;t = 40;//改变所引用的值cout << "&t=" << t << endl;//打印 &t 变量值cout << "test=" << test << endl;//打印 test 变量值cout << "&t 地址:" << &t << endl;//打印 &t 地址cout << "test 地址:" << &test << endl;//打印 test 地址//3. 引用做参数 形参就相当于实参int s = 30;//获取最大值cout << "Max:" << Max(s, t) << endl;//当引用作为参数 其实参也会随之改变cout << "改变后的值:" << s << "未改变的值:" << t << endl;system("pause");
}
C++动态内存分配
C++动态内存分配解释:
1.C++动态内存分配关键词:new and delete
2.动态内存分配解释参考C语言:C_顺序表(动态数组插入)C++动态内存分配操作:
1.使用new / delete操作符
2.内存分配的同时初始化
3.动态内存分配数组
4.内存分配失败,抛出bad_alloc异常
#include<iostream>
#include<string>using namespace std;
//取最大值
void main()
{//1.使用new / delete操作符//(PS:初始化后如果不进行赋值将变成野指针)int* p1 = new int;*p1 = 123;cout << *p1 << endl;delete p1;p1 = NULL;//2.内存分配的同时初始化int* p2 = new int(20);cout << *p2 << endl;delete p2;p2 = NULL;//3.动态内存分配数组int* arr = new int[4];for (int i = 0; i < 4; ++i){arr[i] = i;cout << arr[i]<<" ";}cout << endl;delete[] arr;//删除时需要带[]arr = NULL;//动态内存分配数组的同时初始化int* brr = new int[4]{1,3,5,9};for (int i = 0; i < 4; ++i){cout << brr[i] << " ";}cout << endl;delete[] brr;//删除时需要带[]brr = NULL;system("pause");
}
笔记扩充:
- Windows PowerShell 中指令
关键词 | 注释 |
---|---|
g++ | 编译源代码 |
g++ -c | 以二进制形式编译c++文件 |
nm | 以二进制形式读取文件 |
效果图:
2.在C++里使用C语言形式方法:
(参考文章:C++关键字extern的使用)
extern 外部声明
- 例子:extern “C” void func(int a);
这句话就是告诉编译器,在编译 func 函数名时,按着 C 的规则去翻译相应的函数名,而不是 按C++ 的方式。这个功能十分有用处,因为在C++出现以前,很多代码都是C语言写的,而且很底层的库也是C语言写的,为了更好的支持原来的C代码和已经写好的C语言库,需要在C++中尽可能的支持C,而extern "C"就是其中的一个策略。- 这个功能主要用在下面的情况:
1.C++代码调用C语言代码
2.在多个人协同开发时,可能有的人比较擅长C语言,而有的人擅长C++,这样的情况下也会有用到
源码
#include<iostream>
#include<stdlib.h>
using namespace std;//C语言 形式打印
extern "C"
{void fun(){printf("Hello\n");}
}
//C++ 形式打印
void fun(char a ){cout << "Worl"<< a << endl;
}
void main()
{fun();fun('d');system("pause");
}