
C/C++
ShellDawn
Gu-Ah
展开
-
C++: printf不输出内容
printf将输出内容先放入缓冲区,然后缓冲区满足一定条件后,再输出到屏幕。缓冲区需要满足的条件: 1. 使用fflush(stdout)强制刷新。 2. 缓冲区已满。 3. scanf()要在缓冲区里取数据时会先将缓冲区刷新。 4. \n,\r进入缓冲区时。 5. 线程结束的时候,如果该线程里也有printf(….); 6. 程序结束时。原创 2017-09-14 20:14:55 · 4194 阅读 · 0 评论 -
C++:char数组初始化
char s[10] = "Hello"; // 剩余全用0填充char s[10] = {'H','e','l','l','o','\0'}; //和上面效果一样char s[10] = {'H','e','l','l','o'}; // 和前面效果一样char s[10] = {0} // 全部初始化为0char s[10] = "Hello, world.\n"; // 超出部分丢...原创 2019-04-04 11:14:00 · 27409 阅读 · 0 评论 -
C++: 重定向freopen打开与关闭
printf("输出到终端");// 重定向到文件freopen("in.txt", "r", stdin);// 清空缓冲区,避免把之前写到终端的字符读进来fflush(stdin);// 读入文件字符while(~scanf("%s", &ch)){ // dosomething}// 重定向回终端freopen("/dev/tty", "w", stdout);//如果是windows用//freopen("CON", "w", stdout);printf原创 2021-03-02 15:51:34 · 3176 阅读 · 0 评论 -
C/C++:HelloWorld输出全过程
1{\green{1}}1用户通过键盘输入,告诉系统执行helloworld程序2{\green{2}}2找到helloworld程序相关信息,检查是否为可执行文件。通过程序首部信息,确定代码和数据再磁盘块位置。3{\green{3}}3操作系统创建一个新进程,将Helloworld可执行文件映射到该进程结构。4{\green{4}}4操作系统为Helloworld程序设置C...原创 2019-07-06 09:18:15 · 3379 阅读 · 1 评论 -
C/C++:四种cast
reinterpret_cast{\red{reinterpret\_cast}}reinterpret_cast对二进制数据进行重新解释char *a = new char;*a = 'a';cout<<*a<<endl;printf("%0x\n",a);int *b = reinterpret_cast<int*>(a);cout<&l...原创 2019-07-01 08:18:04 · 1660 阅读 · 0 评论 -
C/C++:C和C++
C是C++的一个子集C面向过程,C++具有面向对象的特性,java是面向对象语言。C的函数句柄只用函数名区分,C++函数句柄用函数名+参数区分所以c不支持重栽C里struct和C++里struct不用...原创 2019-07-01 01:42:51 · 267 阅读 · 0 评论 -
C/C++:复制构造函数
C++中,三种调用复制构造函数的情况:一个对象以值传递的方式传入函数体{\red{一个对象以值传递的方式传入函数体}}一个对象以值传递的方式传入函数体一个对象以值传递方式从函数返回{\orange{一个对象以值传递方式从函数返回}}一个对象以值传递方式从函数返回一个对象需要通过另一个对象初始化{\green{一个对象需要通过另一个对象初始化}}一个对象需要通过另一个对象初始化自定义复制构...原创 2019-06-30 22:03:04 · 814 阅读 · 0 评论 -
C/C++:explicit关键字
explicit 常用来防止隐式调用构造函数。原创 2019-06-30 21:53:27 · 1891 阅读 · 0 评论 -
C/C++:编译链接过程
源代码−>预编译−>编译−>优化−>汇编−>链接−>可执行文件{\red{源代码->预编译->编译->优化->汇编->链接->可执行文件}}源代码−>预编译−>编译−>优化−>汇编−>链接−>可执...原创 2019-07-04 17:10:47 · 270 阅读 · 0 评论 -
C/C++:extern关键字
当一个模块需要引用另一个模块的变量或函数时,可以用extern关键字声明引用。extern “C”声明调用的C库函数,因为C命名规则不同,所以extern “C”声明函数不能重载。...原创 2019-07-03 22:55:06 · 140 阅读 · 0 评论 -
C/C++:空类
空类默认产生:默认构造函数{\orange{默认构造函数}}默认构造函数复制构造函数{\orange{复制构造函数}}复制构造函数析构函数{\orange{析构函数}}析构函数赋值函数{\orange{赋值函数}}赋值函数取地址函数{\orange{取地址函数}}取地址函数空类默认1个字节大小{\red{空类默认1个字节大小}}空类默认1个字节大小含有虚函数的空类默认8个字节大小(6...原创 2019-06-28 12:08:06 · 478 阅读 · 0 评论 -
C/C++:类函数执行顺序
class A{ public: A(){cout<<"A+"<<endl;} public: ~A(){cout<<"A-"<<endl;}};class B :public A{ public: B(){cout<<"B+"<<endl;} public: ~B(){cout<&...原创 2019-06-28 12:01:33 · 1755 阅读 · 0 评论 -
C/C++:static关键字
static的意义:实现类内全局变量,类内全局函数{\red{实现类内全局变量,类内全局函数}}实现类内全局变量,类内全局函数实现模块内全局变量,模块内全局函数{\orange{实现模块内全局变量,模块内全局函数}}实现模块内全局变量,模块内全局函数...原创 2019-07-01 09:12:50 · 122 阅读 · 0 评论 -
C/C++:模块化
.c文件提供模块接口声明(外部函数和外部变量),全部冠以extern关键字{\red{.c文件提供模块接口声明(外部函数和外部变量),全部冠以extern关键字}}.c文件提供模块接口声明(外部函数和外部变量),全部冠以extern关键字模块内函数和全局量在.c文件冠以static关键字{\orange{模块内函数和全局量在.c文件冠以static关键字}}模块内函数和全局量在.c文件冠以sta...原创 2019-07-01 09:32:16 · 849 阅读 · 0 评论 -
C++:i++与++i的区别
i++:先引用后自增。++i:先自增后引用。所以,i=1;i=i++;// 此时i为1// 执行流程为,i=1,i把值放在等号右边(需要一个临时变量,所以这也是i++比++i慢的原因),i++完成自增为2,最后执行等号,i=temp,(temp是刚才临时变量),所以i为1.i=1;i=++i;// 此时i为2// 执行流程,i=1,++i在i本身上完成自增(不需要临时变量)为...原创 2019-08-28 15:49:52 · 374 阅读 · 0 评论 -
C++:优先队列
priority_queue使用堆维护。大顶堆:priority_queue<int> q;小顶堆:priority_queue<int, vector<int>, greater<int> > q;原创 2019-03-24 16:34:41 · 355 阅读 · 0 评论 -
C++:清空stl的stack容器
很遗憾,没有现成函数 可以采用while(!stack.empty()) empty().pop();原创 2018-04-20 10:13:20 · 28793 阅读 · 7 评论 -
C/C++:关于delete this
−1−{\green{-1-}}−1−在类对象的内存空间中,只有数据成员和虚表指针,并不包含代码内容。−2−{\green{-2-}}−2−类的成员函数单独放在代码段中−3−{\green{-3-}}−3−在成员函数内部执行delete this之后,只要之后执行内容和this指向的内存块无关,则毫不影响。但涉及this指针,则会出现不可预期后果。−4−{\green{-4-}}−4...原创 2019-07-07 15:06:13 · 1143 阅读 · 0 评论 -
C/C++:隐式转换
继承链中,子类转换为父类基本数据类型,短类型转换为长类型防止隐式转换,类构造函数加上explicit关键字注:explicit只对一个实参的构造函数有效,多个实参的构造函数一定不会用于隐式转换。...原创 2019-07-06 11:58:47 · 286 阅读 · 0 评论 -
C/C++:RAII和智能指针
RAII是解决程序员忘记释放资源的问题RAII是一种思想,可以通过类实现,在生命周期构造和析构,成对儿出现,不会内存泄漏。RAII最有名应该是智能指针:unique_ptr{\red{unique\_ptr}}unique_ptr:指针对象一一对应,若想改变指针指向的内容,只能使用std::move方法,其原理也是析构原unique_str指针和资源,新建指针赋予新资源,返回指针。shar...原创 2019-07-06 10:09:23 · 355 阅读 · 0 评论 -
C/C++:cout和printf
cout<<“hello world”<<endl;等同于cout<<“hello world\n”;cout<<flush;endl相当于输出回车后,再强迫缓冲输出。flush强迫缓冲输出printf是无缓冲输出,有输出立即输出...原创 2019-07-06 09:34:54 · 600 阅读 · 0 评论 -
C/C++:堆和栈
堆和栈是C/C++的两种内存分配方式:堆和栈的不同:{\orange{堆和栈的不同:}}堆和栈的不同:1−管理方式:{\green{1-管理方式:}}1−管理方式:栈由编译器自动管理,堆由程序员控制2−空间大小:{\green{2-空间大小:}}2−空间大小:一般堆空间很大,栈空间很小3−碎片问题:{\green{3-碎片问题:}}3−碎片问题:堆会有频繁堆new/delete造成...原创 2019-07-05 23:25:13 · 154 阅读 · 0 评论 -
C/C++:静态static
静态成员不能在类内初始化。{\red{静态成员不能在类内初始化。}}静态成员不能在类内初始化。静态成员函数不含this指针。{\orange{静态成员函数不含this指针。}}静态成员函数不含this指针。...原创 2019-06-28 11:48:41 · 128 阅读 · 0 评论 -
C/C++:类初始化
初始化列表:列表初始化顺序与变量声明顺序一致,与列表顺序无关。必须用初始化列表的情况:1−const和reference类型成员变量{\red{1-const 和 reference 类型成员变量}}1−const和reference类型成员变量2−基类构造函数{\red{2-基类构造函数}}2−基类构造函数...原创 2019-06-28 11:39:14 · 1339 阅读 · 0 评论 -
C/C++:野指针
没有初始化{\red{没有初始化}}没有初始化free或delete后没有置为NULL{\orange{free或delete后没有置为NULL}}free或delete后没有置为NULL赋值无意义地址{\green{赋值无意义地址}}赋值无意义地址...原创 2019-07-02 16:45:36 · 120 阅读 · 0 评论 -
C/C++:指针
为什么指针要有类型?{\red{为什么指针要有类型?}}为什么指针要有类型?因为指针有自增自减运算,只有指针有类型时,指针加1就是向后移动一个类型对象的空间。...原创 2019-07-02 16:42:14 · 125 阅读 · 0 评论 -
C/C++:sizeof和strlen
strlen是函数,计算字符串长度sizeof是运算符,计算内存字节大小关于运算符和函数的区别:运算符只能重载,不能自定义。原创 2019-07-07 22:23:57 · 157 阅读 · 0 评论 -
C/C++:volatile关键字
volatile关键字禁止优化,提供稳定的访问。用途:−1−{\green{-1-}}−1−中断服务程序中,修改的共享变量,供其他程序检测−2−{\green{-2-}}−2−多任务环境下,不同任务间共享标志−3−{\green{-3-}}−3−每次读取有不同意义的变量...原创 2019-07-07 21:12:37 · 132 阅读 · 0 评论 -
C/C++:复杂指针的申明
一个整型数:int a;一个指向整型数的指针:in t* a;一个指向整型指针的指针: int** a;一个有10个整型数的数组:int a[10];一个有10个整型指针的数组:int (*a)[10];一个函数指针,函数有一个整型参数和一个整型返回值:int (*a)(int);一个有10个函数指针的数组,函数有一个整型参数和一个整型返回值:int (*a[10])(int);一...原创 2019-07-01 18:19:51 · 237 阅读 · 0 评论 -
C/C++:指针or引用
引用必须初始化{\red{引用必须初始化}}引用必须初始化指针不必初始化,虽然危险{\orange{指针不必初始化,虽然危险}}指针不必初始化,虽然危险不存在空引用{\red{不存在空引用}}不存在空引用经常有空指针{\orange{经常有空指针}}经常有空指针引用初始化后不可修改{\red{引用初始化后不可修改}}引用初始化后不可修改指针可反复修改{\orange{指针可反复修改}}指...原创 2019-07-01 18:03:48 · 244 阅读 · 0 评论 -
C/C++:assert关键字
assert断言,判断表达式真假,若为假,打印错误信息,调用abort结束程序assert只是debug的检查,release后不会执行assert语句。原创 2019-07-01 17:34:08 · 525 阅读 · 1 评论 -
C/C++:malloc/free和new/delete
malloc/free是标准库函数new/delete是运算符new/delete的意义在于,new/delete作为运算符可以自动执行类的构造函数和析构函数。而标准库函数做不到。原创 2019-07-02 17:07:51 · 123 阅读 · 0 评论 -
C/C++:内联函数inline
要说内联函数,则免不了与宏定义对比:最初,宏定义完成简单的代码替换。但C++出现后,宏定义不能享受C++编译器类型检查的好处。同时,宏定义不能使用this指针。所以,出现了内联函数,内联函数检查参数类型,但也采用像宏一样的展开,没有了函数栈调用开销,效率高。内联和宏区别:{\orange{内联和宏区别:}}内联和宏区别:内联在编译时展开,宏在预编译时展开内联检查类型检测,语句...原创 2019-07-02 20:00:24 · 231 阅读 · 0 评论 -
C/C++:#pragma pack(1)
CPU默认按原创 2019-07-03 00:01:48 · 2046 阅读 · 0 评论 -
C/C++:class与struct
C中的struct只能定义数据成员,不能定义成员函数。C++中的struct可以定义函数,这样完全是为了兼容C程序。struct默认public成员。class默认private成员。原创 2019-06-28 10:10:39 · 164 阅读 · 0 评论 -
C/C++:纯虚函数
含有纯虚函数的类不可实例化,相当于java中的接口类。提供一个统一的函数名字,在派生类中必须实现每一个纯虚函数,来提供不同的实现方案。接口类的逻辑在于,某些类实例是没有意义的,例如动物,派生老虎是有意义的,但单纯实例化动物是没有意义的。...原创 2019-06-28 01:26:28 · 1947 阅读 · 0 评论 -
C/C++:虚继承
虚继承和虚函数就如java和javascript的关系。虚继承的类内存结构和正常继承的类内存结构有很大不同。虚继承解决菱形继承中多个相同基类二义性问题。例如,B继承A,C继承A,D继承B和C,则在D中有两份A,分别来自B和C。当执行基类A函数时,就会出现二义性。一种解决方法为,使用类命名空间,例如B::a()和C::a()区分。另一中解决方法为,使用B虚继承A,C虚继承A,则D中只有一...原创 2019-06-28 01:20:58 · 224 阅读 · 0 评论 -
C/C++:虚函数
构造函数与虚函数顺序:{\red{构造函数与虚函数顺序:}}构造函数与虚函数顺序:class A{ public: A(){a();} virtual void a(){ cout<<"A"<<endl; }};class B : public A{ public: virtual void a(){...原创 2019-06-28 01:10:22 · 1377 阅读 · 0 评论 -
C/C++:三种继承方式
public继承:不改变基类成员属性。protected继承:将基类成员public变为protected,即继承链上可访问,类外不可访问。private继承:基类所有成员变为private,只能在当前类访问。private继承相当于单一组合,尽量能用组合用组合。{\red{private继承相当于单一组合,尽量能用组合用组合。}}private继承相当于单一组合,尽量能用组合用组合。...原创 2019-06-27 21:34:49 · 1125 阅读 · 0 评论 -
C/C++:模版
分为函数模版,类模版。使用模版的意义在于复用代码,但可能会出现代码膨胀,即目标二进制代码臃肿,影响运行效率,例如:template<class T,int num>class A{};int main(){ A<int,1> a1; A<int,2> a2; return 0;}模版第二个参数应该分离出去,变为类内参数。特化:{\red...原创 2019-06-27 21:01:04 · 228 阅读 · 0 评论