Day1
函数指针数组
简写函数指针 typedef
typedef int (*FunPtr)(int, int);
FunPtr FunArr[1] = {Add};
内联函数
#pragma region 内联函数
// 避免函数跳转对于程序的额外开销
// 有两种写法 1).h中写实现文件(在.h中同时写声明和实现)
// 2)inline 关键字
// 如果声明和实现拆开,都需要加inline
// 声明和实现写道一起,然后加inline(推荐)
// 注意点 到底是不是内联函数取决于编译器自己决定
// 即使按照上面的写法,编译器也可以不认为这是一个内联函数
// 即使不按照上面的写法,编译器可以认定这是一个内联函数
// 内联函数中不允许出现循环和switch,代码不能超过十行,递归函数不能是内联函数
// 存取函数 推荐写成内联函数 GetXX SetXXX
// 本质 在调用内联函数时编译器会对内联函数进行展开替换
// 虚幻中可以强制指定某个函数必须是内联
//cout << TestAdd(1, 2);
//cout << TestAdd(1 ,2) << endl;
#pragma endregion
// 声明和实现拆开
inline int TestSubtract(int Num1, int Num2);
// 声明和实现写在一起
inline int Multiply(int Num1, int Num2) { return Num1 * Num2; }
宏
#pragma region 宏
// #define 定义的叫做宏 Macro
// 宏的本质是单纯的替换,不检查类型
// 宏的替换出现在预编译阶段(预处理指令)
// 宏一般都是全大写字母,有的时候需要加上_区分 _FILENAME_ FILE_NAME __FILENAME__(系统保留宏)
//Divide(10, 5);
cout << __FILE__ << endl; // 表示当前文件的完整路径
cout << __LINE__ << endl; // 表示代码所在的行数
cout << __LINE__ << endl;
//常量宏 参考 Util.h
//宏中带参数
cout << ADD(10, 20) << endl;
cout << ADD(10, 20);
int Result = 10 % MULTIPLY(50, 2);
Result = 10 % 50 * 2;
cout << Result << endl; // 10
int Max = MAX(10, 50); // (((10) > (50)) ? (10) : (50))
cout << Max << endl;
//声明
// 如果宏带参数的 参数和计算结果用()括起来
#define MULTIPLY(Num1, Num2) ((Num1) * (Num2))
// 用inline函数代替带参数的宏
// inline int Multiply(int Num1, int Num2) { return Num1 * Num2; }
#define MAX(Num1, Num2) (((Num1) > (Num2)) ? (Num1) : (Num2))
#define _COUT_(Begin, End) for(int i = Begin; i < End; ++i) \ //宏定义函数
{\
cout << i << endl;\
} // 最后一行不需要加 (\)
#define _APPEND_(Name) "Hello, "##Name //字符串拼接
#pragma endregion
常量
#pragma region 常量
//// 常量 一旦初始化完成就不能改变 const
const int Num = 100; // 常量在声明的时候必须初始化,否则报错
Num = 150; // 不允许改变值
int Num1 = 100;
const int Num2 = Num1; // 可以用变量取初始化常量,变量的值改变不会影响常量
Num1 = 1000;
cout << Num2 << endl;
int Num3 = 5000;
//const跟指针变量连用 三种情况
int* pNum = &Num1; // 1000
const int* pNum1 = &Num1;
pNum1 = &Num2; // 可以指向别的变量
*pNum1 = 3000; // 不能通过解引用修改值
//int* const pNum2 = &Num3;
//// pNum2 = &Num1; // 不可以指向别的变量
//*pNum2 = 8000; // 可以通过解引用修改值
const int* const pNum3 = &Num2;
pNum3 = &Num1; // 不能指向另外一个变量
*pNum3 = 500; // 不能通过解引用修改值
#pragma endregion
引用
&引用内存地址 :
引用地址和内存的关系
引用注意点
引用符号&和指针符号*的区别
#pragma region 引用
//int Num = 50;
//int& Num1 = Num;
//Num1 = 123;
////cout << &Num << " " << &Num1 << endl; //引用的地址
////cout << Num << " " << Num1; // 地址里面的值
//int Temp = 5000;
//Num1 = Temp;
//cout << Num << " " << Num1 << endl; //因为Num的地址和Num1的内存的地址是一样的 , 101行会影响到 Num的值
//Num1 = 500; // Num也同步被更改了
//cout << Num << " " << Temp << endl;
//cout << &Num1 << " " << &Num << " " << &Temp << endl;// Num1 Num地址一样 Temp不一样;
//----------
int Num1 = 50;
int Num2 = 500;
//调用的时候不传递地址 , 函数接受用 & 取地址
//Swap(Num1, Num2);
//cout << &Num1 << " " << &Num2 << endl; //地址和函数内一样
//调用的时候不传递地址
//Swap1(Num1, Num2);
//cout << &Num1 << " " << &Num2 << endl; //地址和函数内一样
//调用的时候传地址
//cout << &Num1 << " " << &Num2 << endl << endl; //
//Swap(&Num1, &Num2);
//cout << Num1 << " " << Num2 << endl;
//--------字符串引用
cout << TestStr("hello"); //这种引用函数里面需要加 const
string Str = "hello";
cout << TestStr(Str);
#pragma endregion
左值右值
#pragma region 左值右值
// 左值 可以放到 = 左边的
// 右值 不可以放到 = 左边的(字面量 常量和指针连用)
// 右值引用 int&&
int Num = 10;
Num = 100;
// int&& rNum = Num; // 不能把变量赋值给右值引用
int&& rNum = 10; // 右值引用只能赋值字面量(右值)
#pragma endregion
标签:函数,右值,int,C++,Num,面向对象编程,内联,cout From: https://www.cnblogs.com/Aquakinn/p/18065453