C语言
镇上村树
这个作者很懒,什么都没留下…
展开
-
线程学习简笔
为什么对于多数合作性任务,多线程比多个独立的进程更优越呢?这是因为,线程共享相同的内存空间。不同的线程可以存取内存中的同一个变量。所以,程序中的所有线程都可以读或写声明过的全局变量。如果曾用fork()编写过重要代码,就会认识到这个工具的重要性。为什么呢?虽然fork()允许创建多个进程,但它还会带来以下通信问题,如何让多个进程相互通信,这里每个进程都有自己独立的内存空间。对这个问题没有一原创 2017-09-13 15:39:44 · 319 阅读 · 0 评论 -
C++将多态基类的析构函数声明为virtual的作用
如果没有将多态基类的析构函数声明为virtual当通过基类指针构造子类对象的时候,此时使用基类来引用/表示子类:BaseClass *b = new ChildClass;如果析构函数不是virtual的,那么调用析构函数时:delete b;这时,调用BaseClass的析构函数,进行析构;==问题出现:使用基类的析构函数进行析构操作,但是实际对象却是这个基类的子类。所以,这样析构只能释放基类的部原创 2017-10-17 13:05:16 · 1209 阅读 · 0 评论 -
C++不要在构造函数和析构函数中调用virtual函数的原因
==child class在构造时,需要首先构造基类。在基类的构造期间,virtual函数的virtual性质是不能体现的,不能发生动态绑定,在构造函数中调用的virtual函数,难以确定是基类的还是子类的virtual函数。==子类在其基类部分的构造期间,它的type就是基类而不是自身==derived class在构造期间,首先构造基类部分,然后构造自身部分;当处于基类构造部分的时候,它就是子类原创 2017-10-17 18:40:56 · 531 阅读 · 0 评论 -
typedef和#define的用法与区别
一、typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像: typedef int INT; typedef int ARRAY[10]; typedef (int*) pINT; typedef可以增强程序的可读性,以及标识符的灵活性,但它也有“非原创 2017-11-23 18:03:24 · 272 阅读 · 0 评论 -
C++中const的作用/用法
分析const是修饰pointer本身还是修饰pointer指向的data const的位置存在一点随意性,但是分析它是修饰data还是修饰pointer是很简单的: 1. 只要const出现在’‘的左边,那么它就是修饰pointer指向的data为只读;只要const出现在’ ‘的右边,那么它就是修饰pointer本身是只读的; 2. 当const出现在’‘的左边的时候,不论它是原创 2017-10-16 18:25:29 · 606 阅读 · 0 评论 -
使用const,enum,inline template<>替代#define
#define 等预处理器命令并不被视为语言的一部分。#define定义的常亮或许从来都没有进入到编译器,或许编译器没有使用#define的名称而只使用了其值。因此,当该define出现错误时,编译器给出的提示中如果写的是定义的值而不是名称,则难以被追踪(当这个宏不是你定义的时候,看到这个错误中的值甚至不知道这是宏定义还是变量的值还是返回值)。使用’指向常量的常量指针’来替代宏定义的字符串#def原创 2017-10-16 18:23:12 · 340 阅读 · 0 评论 -
C++拷贝构造函数和拷贝/赋值操作符
拷贝构造函数和拷贝赋值操作符拷贝构造函数 使用同类型对象来初始化自我对象(this)格式Foo(const Foo& f);//只带一个参数,参数是同类型的const &何时调用拷贝构造函数当使用拷贝构造时调用:Foo f1(f2);使用等号的时候不一定是调用拷贝/赋值运算符,也有可能调用拷贝构造函数:Foo f1 = f2; //虽然使用了等号,但是由于定义了新的对象,因此原创 2017-10-16 18:20:49 · 1187 阅读 · 0 评论 -
C语言和C++头文件的区别、作用
导入C++头文件和C头文件的区别C++头文件没有.h后缀,从中导入的名称位于作用域std中,当中包含的名称使用std::来访问。 C头文件带有.h后缀,从中导入的名称位于全局作用域global中,当中包含的名称可以直接使用。原创 2017-10-16 18:18:18 · 2179 阅读 · 0 评论 -
C语言、C++中声明和定义的区别
‘声明’的定义 声明:即向编译器指示某个东西(类型+名称)的存在,但是略去其细节实现(细节、实现,如:int类型变量的值,class的成员信息,函数的函数体,template<>模板的内容等等都是细节实现)。==声明并不让编译器为该对象分配内存并构造。==样例extern int x; //声明;如果不加extern,就变成定义了std::size_t numsDigits(in原创 2017-10-16 18:15:23 · 578 阅读 · 0 评论 -
C++构造函数的执行顺序及析构函数的执行顺序-多种情况:普通继承、虚拟继承、类构造函数调用其它类的构造函数
派生类的构造函数/析构函数执行顺序创造一个子类对象时(new一个子类对象或在栈中构造),先执行父类的构造函数,再执行自身的构造函数。如果子类继承多个父类,则按照继承的顺序从左到右调用父类构造函数(类继承列表中的越靠前的父类,其构造函数越先执行,第一个父类的构造函数首先执行),析构的顺序与构造的顺序相反。class A : public B ,public C{public: A();原创 2017-10-15 20:52:10 · 2599 阅读 · 0 评论 -
C++常用的智能指针auto_ptr、shared_ptr
利用’对象的析构函数一定会被调用’这一特性,在对象析构的时候delete资源。对于的机制是智能指针。目的是帮助自动释放资源。常用的智能指针:STL的std::auto_ptr<>、TR1的std::tr1::shared_ptr<>std::auto_ptr<>auto_ptr<>在被销毁的时候(离开其scope时),将会==对其所指向对象调用delete==。 1. 不要令多个auto_ptr原创 2017-10-17 18:44:45 · 313 阅读 · 0 评论 -
在scanf()中使用空格来适应更多形式的输入
scanf(%c,%c,%c); //必须使用都好分隔scanf(%c%c%c); //只允许连续输入,不允许使用空格scanf(%c %c %c); //允许连续输入,也允许使用空格分隔scanf( %c %c %c); //注意第一个%c前面的一个空格,允许用户在输入的时候首先使用一个换行(也可以不换行);是最好的、最能适应的格式,因为允许用户各种姿势的输入利用原创 2017-09-19 09:53:45 · 839 阅读 · 0 评论 -
右结合运算符、结合性
什么是右结合运算符右结合运算符即该运算符首先会计算其右侧运算对象的值结合性对于CC什么是右结合运算符在C/C++和Java中,存在一些operator是右结合的,如+=a+=b+=c; //等同a+=(b+=c);右结合运算符即该运算符首先会计算其右侧运算对象的值结合性结合性即运算符首先运算其哪一侧的运算对象对于C、C++请注意除了少数几个运算符如逗号运算符,、&&等会有标准规定运算顺序原创 2017-09-25 10:47:03 · 6518 阅读 · 0 评论 -
广度优先搜索BFS-C实现、思路、解析和总结
广度优先搜索BFS基本简介实现思路实现效果C代码实现广度优先搜索BFS基本简介对于每一个点,找到这个点能够直接连通的点,只做广度上的搜索而不做深度的搜索,在这个点的所有广度都搜索完成后,再扩展、深入到下一个深度进行广度搜索,最终完成所有搜索。实现思路在一个带有障碍物的迷宫(二维数组)中模拟使用广度优先搜索来走迷宫。使用一个结构体数组来模拟一个队列,该队列记录每一个点的广度,在某一个层次的所有原创 2017-09-16 16:29:31 · 6255 阅读 · 0 评论 -
深度优先搜索DFS-C语言实现、思路/解析-简笔
简介基本模型-通用套路走迷宫-应用深度优先搜索思路实现执行结果简介深度优先搜索Depth First Search是对图论问题的分析解决,其核心思想就是就是解决1、当下应该如何做;2、下一步如何做与现在这一步如何做是一样的;3、边界条件的判断;基本模型-通用套路void dfs(step){ /*1.判断边界,判断本阶段的DFS是否已经结束了*/ if(foo == ba原创 2017-09-16 11:35:41 · 14396 阅读 · 1 评论 -
Windows下配置VSCode编译/调试C/C++:launch.json配置
VSCode在windows下配置调试C/C++代码需要的软件工具gcc、gdb工具;推荐下载minGW编译器,安装后在minGW安装目录下的bin目录下就有gcc和gdb;VSCode-windows在VSCode中搜索安装cpptools插件安装(有些情况是不用装的,当你后面的步骤完成后仍然不能开始调试,请安装)步骤启动VSCode,打开你想要调试的工程或文件,然后在菜单栏中单击“调试原创 2017-09-16 10:43:44 · 43142 阅读 · 5 评论 -
C快速排序-思想、原理与实现-简笔
快速排序快速排序是很常用的排序方法,它的时间复杂度较理想,平均时间复杂度为O(NlogN)(注:最坏情况下时间复杂度与冒泡排序相同,都是O(N²))。快速排序的本质是二分思想:将一系列数按照某个基准,分为大于它的数和小于它的数,将这两组数分出来后,再用递归的思想使用相同的一段代码再次分数,直到最后完成排序。具体思路选择一个基准数;基准就是判断标准,它决定了大于它和小于它的数会在每一次递归快速排序中原创 2017-09-15 13:05:16 · 516 阅读 · 0 评论 -
简易贪食蛇-C语言实现
有空再添加注释,并且重构优化;时间足够的情况下会使用其他语言,并增加GUI。#include #include #include #include #include #include #define N 21int apple[3];char score[3];char tail[3]; void gotoxy(int x, int y) //输出坐标 {原创 2017-09-06 23:11:38 · 680 阅读 · 0 评论 -
C++ static成员/类专属成员的定义/静态成员
类的专属成员,即只属于类的成员,同时该成员不属于类的任何一个实例。 符合以上条件的,即为static成员:类的static成员属于类:可以ClassName::StaticName来访问;不属于类的实例:不能使用ClassInstanceName.StaticName来访问。类的专属成员的一个特点:不论这个类实例化了多少个实例,static成员(就是专属成员)都有且只有一份。总结:类的专属成原创 2017-10-16 18:24:32 · 337 阅读 · 0 评论