模板函数

template <typename T> inline const T& Max (const T& a, const T& b) { return a < b ? b:a; }; int main() { int i = 39; int j = 20; cout << "Max(i, j): " << Max(i, j) << endl; double f1 = 13.5; double f2 = 20.7; cout << "Max(f1, f2): " << Max(f1, f2) << endl; string s1 = "Hello"; string s2 = "World"; cout << "Max(s1, s2): " << Max(s1, s2) << endl; return 0; } 输出:...

December 22, 2021 · 1 min · Rick Cui

函数指针

#include <iostream>#include <cstdlib>using namespace std; // 声明函数指针变量 int (*fn)(int) = NULL; // 定义函数指针类型 typedef int (*Fn)(int); int cal(int v){ return v; }; int max(int a, int b){ return a > b ? a : b; } // 函数指针做为参数 void proc(int v, Fn f){ cout << f(v) << endl; }; // 函数指针作为函数返回值 int (* retFP(string fName))(int, int){ // lambda 表达式作为函数指针返回 int (*fp)(int,int) = [](int x, int y){ return x > y ?...

December 16, 2021 · 2 min · Rick Cui

指针函数和函数指针

指针函数本质是一个函数,返回值是一个指针; 函数指针是指向函数的一个指针变量; #include <iostream>#include <cstdlib> using namespace std; // 指针函数fun char * fun(const char * p) { cout << "fun: " << p << endl; return nullptr; }; // 函数指针pf char * (*pf)(const char * p); int main() { pf = fun; // 函数指针pf指向函数fun pf("Hello"); return 0; }

December 16, 2021 · 1 min · Rick Cui

explicit(显式)关键字

修饰构造函数,防止隐式转换,赋值初始化,赋值列表初始化 修饰转换函数,可以防止隐式转换,但按语境转换除外 explicit 可加在带多个参数的构造方法上(converting to ‘XXX’ from initializer list) struct B { explicit B(int) {} explicit operator bool() const { return true; } }; int main() { B b1(1); // OK:直接初始化 B b2 = 1; // 错误:被 explicit 修饰构造函数的对象不可以赋值初始化 B b3{ 1 }; // OK:直接列表初始化 B b4 = { 1 }; // 错误:被 explicit 修饰构造函数的对象不可以赋值列表初始化 B b5 = (B)1; // OK:允许 static_cast 的显式转换 if (b1); // OK:被 explicit 修饰转换函数 B::operator bool() 的对象可以从 B 到 bool 的按语境转换 bool b6(b1); // OK:被 explicit 修饰转换函数 B::operator bool() 的对象可以从 B 到 bool 的按语境转换 bool b7 = b1; // 错误:被 explicit 修饰转换函数 B::operator bool() 的对象不可以隐式转换 bool b8 = static_cast<bool>(b1); // OK:static_cast 进行直接初始化 return 0; } 从初始化列表隐式转换:...

December 15, 2021 · 1 min · Rick Cui

C++ 字符串常量存储

局部变量、静态局部变量、全局变量、全局静态变量、字符串常量以及动态申请的内存区 局部变量存储在栈中 全局变量、静态变量(全局和局部静态变量)存储在静态存储区 new申请的内存是在堆中 字符串常量也是存储在静态存储区 栈中的变量内存会随着定义所在区间的结束自动释放;而对于堆,需要手动free,否则它就一直存在,直到程序结束; 对于静态存储区,其中的变量常量在程序运行期间会一直存在,不会释放,且变量常量在其中只有一份拷贝,不会出现相同的变量和常量的不同拷贝。 #include <iostream>#include <cstdlib> using namespace std; //返回的是局部变量的地址,该地址位于动态数据区,栈里 char *s1() { char* p1 = "qqq";//为了测试‘char p[]="Hello world!"’中的字符串在静态存储区是否也有一份拷贝 char p[]="Hello world!"; char* p2 = "w";//为了测试‘char p[]="Hello world!"’中的字符串在静态存储区是否也有一份拷贝 printf("in s1 p=%p\n", p); printf("in s1 p1=%p\n", p1); printf("in s1: string's address: %p\n", &("Hello world!")); printf("in s1 p2=%p\n", p2); return p1; // 这里不能返回局部变量 p } //返回的是字符串常量的地址,该地址位于静态数据区 char *s2() { char *q="Hello world!"; printf("in s2 q=%p\n", q); printf("in s2: string's address: %p\n", &("Hello world!...

December 13, 2021 · 2 min · Rick Cui