C/C++
郭建堂
也得竭力一生追
展开
-
vs2015 dll初步学习
动态链接库生成 .dll .lib 拷给使用动态库程序 .h .dll .lib .lib文件 编译的时候使用的 他确定了动态库的哪些函数是外部函数,哪些不是。外部函数才可以调用 .dll文件 运行的时候才链接,调用动态库 动态可以然后再返回结果给程序 程序继续执行 .h文件 是声明文件,告诉用户我有哪些接口转载 2017-08-08 15:22:20 · 243 阅读 · 0 评论 -
C和Cpp两大重点
C:指针 重点是间接赋值成立的三个条件 1.有实参 和 形参 2.形参和实参关联,即实参给形参赋值 3.在子函数里 *p=values;Cpp : 函数指针 重点是多台成立的三个条件 1.有继承 2.有虚函数重写 3.父类指针或者引用指向子类对象C语言里,间接赋值效率很高,原创 2017-08-09 10:58:30 · 369 阅读 · 0 评论 -
NULL
*- #define NULL ((void )0) - void * 类型在linux的编译器下,步长是1。 - vs里,默认没有步长。**原创 2017-08-07 11:03:59 · 204 阅读 · 0 评论 -
宏函数
普通函数调用的时候要进行压栈,就是形参传递的时候宏定义函数形参传递是直接对应替换宏定义函数的效率高fgetc() 普通函数 f是function的意思getc() 宏定义函数宏函数也就是用空间换时间有时候宏函数需要考虑很多问题 比如 #define ADD(a,b) a+b ADD(10,20)没问题 ADD(10,20)*10 得到的结果是210 定义成 #define原创 2017-08-07 11:07:37 · 229 阅读 · 0 评论 -
vs下的字节对齐的一些疑问
double p= 0;double a = (int)(&p);int *aa = (int *)&p;double b = (int)(aa);printf("%d %lf %lf\n", aa,b,b/8);这里输出 b/8 有时候会输出非整数(.5) 这里理解为地址都是逻辑地址 如果逻辑地址起始地实际地址也是个 b/8非整数(.5) 那就对了,double要放在起始地址,这原创 2017-08-07 11:14:27 · 942 阅读 · 0 评论 -
VS下scanf&gets的本质区别
VS2015里scanf()每次读取的时候 先判断缓冲区是否为’\n\r’或者是一个或多个空格 如果是就跳过从下一个开始取 并且碰到空格或者是’\n\r’作为一个的结束标志 读取结束将一个缓冲区的 ‘\n\r’和空格 留在缓冲区gets()每次读取不会把’\n\r’或者空格留在缓冲区 并且只以’\n\r’作为结束标志char *a=(char *)malloc(sizeof(char)*10)原创 2017-08-07 11:24:53 · 596 阅读 · 2 评论 -
函数指针的优化
vs2015里void func(){ printf("hello world\n");}// 1typedef void(*FUNC_TYPE)();FUNC_TYPE p = &func; (*p)();//2typedef void(*FUNC_TYPE)();FUNC_TYPE p = func;(*p)();// 3typedef void(*FUNC_TYPE)原创 2017-08-07 11:40:21 · 391 阅读 · 0 评论 -
struct一些学习经验
C中我觉得结构体的本质就是一个数据的打包,从而更好的组织和操作数据。C语言中再定义一个结构体的时候需要明确结构体的大小。struct Person{ struct Person *person;};这种是可以定义的,因为指针占的字节大小确定struct Person{ struct Person person;};这种是不可以定义的struct Person{};这原创 2017-08-07 11:45:34 · 282 阅读 · 0 评论 -
函数形参实参个数不统一
验证 函数指针参数和函数定义的参数个数不符合的情况下传递哪一个#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>void logic(int(*rule)(int, int)){ int a = 100; int b = 200; int c = 3原创 2017-08-07 11:47:35 · 848 阅读 · 0 评论 -
return 和 exit 的区别
return 是封装了exit如果使用exit直接是结束程序但是在函数中使用return 是返回到调用这个函数的地方去转载 2017-08-07 11:51:50 · 247 阅读 · 0 评论 -
const
const 修饰的全局变量放在只读区 这里理解为真常量 只读区位于全局变量区还是常量区有待思考#define _CRT_SECURE_NO_WARNINGS#include<iostream>using namespace std;#include<string>//1. const修饰的全局变量const int a = 10;//const全局变量一般情况下是不分配内存的。如果不原创 2017-08-09 10:57:35 · 222 阅读 · 0 评论 -
改进的快速排序
/*在北京工作的时候,接触到改进快速排序的需求.在网上四处搜寻没有找到太合适的代码,可能是自己搜索的能力有待提升T_T偶然间在新浪博客看到一篇改进快速排序的思路,苦于没有源码,所以自己按照作者的思路实现了一遍.由于时间过去太久,找不到作者的博客链接了,T_T*///源码如下,仅供参考.#include <stdio.h>#include <string.h>#include <stdl原创 2017-08-09 10:47:13 · 281 阅读 · 0 评论 -
文件输出时,string和字符数组的区别.以及二进制模式和文本模式
1. 文件输出时,string和字符数组的区别 string写入文件的是指针,真正的数据在堆空间。 如果读取的时候,该堆空间已经被释放,则数据会丢失。2.二进制模式和文本模式 就是转换的问题 Linux下区别不大,明文不明文的问题。Windows下,换行是’\n\r’ 文本模式:如果数据里有’\n’写到文件里要换成’\n\r’,如果文件里有’\n\r’要转换为’\n’去读。 二进制模原创 2017-08-09 10:41:31 · 410 阅读 · 0 评论 -
引用
C++int a=10;int &b=a; //int * const b=&a;b=20;//遇到b发现是引用类型的 自动 *b=20;特别是当函数调用引用的时候void test(int &c);test(b); //这里传递的是 int const *c=&b; //传递的是b的地址 所以可以修改b的值struct Person{ double a=10; do原创 2017-08-08 15:24:21 · 207 阅读 · 0 评论 -
一些疑问和思考
1。析构函数 执行顺序为什么和 构造函数的调用顺序相反 : 因为栈的顺序后进先出2。类内为什么一般不返回类的引用 : 如果返回类的引用就是返回本身,用户可能会修改。我们应该返回类,相当于复制一份。3。如果函数声明和函数定义分开写,函数声明和函数定义不能同时设置默认参数 :重定义默认参数 如果声明和定义都可以设置,那么设置值就可能不同。4。const修饰的类成员函数在份文件编写的时候,声原创 2017-08-08 15:26:47 · 235 阅读 · 0 评论 -
全局变量重复定义
#include<stdio.h>int a;int a = 1;int main(){ printf("%d\n",a); return 0;}C里可以编译过 C++不能通过编译C语言可以重复定义多个全局变量,但是这些相同的全局变量都被链接到同一个全局区的地址上原创 2017-08-08 15:27:36 · 661 阅读 · 0 评论 -
类模板为什么不分文件
C++里的编译方式是独立编译,也就是一个CPP文件为一个独立的进行编译。类模板需要二次编译,定义的时候编译一次,实例化的时候编译一次。类模板分为 .h .cpp文件的时候,在.cpp的文件里并没有实例化。而在测试cpp里实例化的时候编译器找不到具体的函数实现。要么引入实现的.cpp文件,要么把类的声明和定义放到一个文件里,后缀是.hpp .hpp 只是一个习惯的后缀原创 2017-08-08 15:27:59 · 436 阅读 · 0 评论 -
类模板为什么不能自动推导数据类型
函数模板可以根据实参的类型推导。逻辑上无参的函数应该不需要模板类。类模板类型的自动推导,是因函数模板要编译两次,每次都会利用函数的重载生成新的函数。这些不同的函数就是根据函数的形参类型,形参个数,形参顺序确定的。所以根据实参可以推导出形参的类型,从来自动推导出函数模板的类型。类模板是抽象数据类型,类没有参数之说(构造函数的参数不是用于确定类的特性的参数),因此类是没有任何信息可以推导出应该定义什么类原创 2017-08-08 15:28:26 · 1325 阅读 · 1 评论 -
dynamic_cast的一些疑问
#define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; class CAnimal { public: virtual void Func() {} }; class CCat :public CAnimal { public: vi原创 2017-08-08 15:30:11 · 348 阅读 · 0 评论 -
类中声明的函数和类的成员函数
#define _CRT_SECURE_NO_WARNINGS#include<iostream>using namespace std;class A{public: void f(); void f1();private: int m_nA;};void A::f1(){ cout << 1 << endl;}void f(){ cout原创 2017-08-08 15:33:06 · 606 阅读 · 0 评论 -
cout输出顺序
class CPerson { public: int setA(int pA) { this->m_nA = pA; } int setB(int pB) { this->m_nB = pB; } int getA_B() { return this->m_nA原创 2017-08-08 15:34:38 · 295 阅读 · 0 评论 -
class内的函数
class 里的函数并没有分配内存到class对象内部 (有的是inline)class 里的数据和函数分开,是为了创建多个对象的时候,函数只用一份就行。类似于动态dll!!!!!!!!!!sizeof的时候 只算每个类独有的空间 里面的函数还是全局函数,只是其他地方没有接口去调用而已每次调用的时候,可能是编译器做的优化, 比如class A{private; int num;pu原创 2017-08-08 15:36:11 · 1033 阅读 · 0 评论 -
i++ ++i
i++ 要保存副本返回 ++i 不需要保存副本某些编译器对i++做了优化,这样效率一样 基本类型的数据一样 迭代器等++i的效率高总体 ++i和i++都行的时候尽量用++i原创 2017-08-07 11:52:29 · 219 阅读 · 0 评论