指针函数和函数指针

指针函数本质是一个函数,返回值是一个指针; 函数指针是指向函数的一个指针变量; #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

const 修饰符

1、const 修饰指针和引用 常对象:const Class A 只能调用 const 成员函数 常量指针:const int * 所指的地址内容为 常量只读,但是可指向其它对象的地址(可以重指向) 指针常量:int * const 指针所指的地址不能变(不可以重指向),但地址的内容可以被修改,与引用变量效果类似 常量引用:const int & 相当于是对象的一个别名,对象内容为 只读,并且不能指向其它对象 const int &a = 40 与 constexpr int a = 40 效果类似,但后者只能在全局区声明 const int &a = 40 等同于 const int * const a = new int(40)(指针的指向和存放的内容都不可更改) ClassA myA(10), myB(-10); const ClassA a; // 常对象(只能调用常成员函数) const ClassA * b = &myA; // 常量指针 ClassA * const b = &myA; // 指针常量 const ClassA &bb = myB; // 常量引用 b = &myB; // 合法(可以指向其它对象) b->setA(10); // 错误(只读) bb....

December 10, 2021 · 1 min · Rick Cui