C/C++
lovemysea
种一棵树最好的时间是十年前,其次是现在。
展开
-
"undefined reference to" 问题汇总及解决方法
转载地址: https://segmentfault.com/a/1190000006049907?utm_source=tuicool&utm_medium=referral在实际编译代码的过程中,我们经常会遇到"undefined reference to"的问题,简单的可以轻易地解决,但有些却隐藏得很深,需要花费大量的时间去排查。工作中遇到了各色各样类似的问题,按照...转载 2018-03-11 21:31:24 · 88305 阅读 · 0 评论 -
C++ 模板详解
C++模板 模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。 模板是一种对类型进行参数化的工具; 通常有两种形式:函数模板和类模板; 函数模板针对仅参数类型不同的函数; 类模板针对仅数据成员和成员函数类型不同的类。 使用模板的目的就是能够让转载 2017-12-21 10:55:20 · 718 阅读 · 0 评论 -
linux下使用C++ Json库
linux下使用C++ Json库安装Json库1、下载JsonCpphttp://sourceforge.net/projects/jsoncpp/files/2、下载sconshttp://sourceforge.net/projects/scons/files/scons/2.1.0/scons-2.1.0.tar.gz/download3、解转载 2017-10-12 00:22:36 · 2641 阅读 · 0 评论 -
预编译头文件PCH
一、预编译头文件使用经验:如果预编译头文件被正确使用时,它确实大大提高我们编程的效率(你工作中,有多少时间是在等编译完成?很多吧,这个时候一般都很无聊,无奈,浪费时间)。但是他太容易用错了. 下面是几种常见的错误用法.1) 在预编译头文件里include自己的头文件(当然, 如果你的头文件不经常变化, 也可以)原因:自己的头文件一般会经常变, 便利后导致预编译的东东重新编译, 降低了编转载 2017-07-09 12:17:53 · 3043 阅读 · 0 评论 -
详解c++中类的六个默认的成员函数
类的6个默认的成员函数包括:构造函数、析构函数、拷贝构造函数、赋值运算符重载函数、取地址操作符重载、const修饰的取地址操作符重载。这篇文章重点解释前四个。(一)构造函数构造函数,顾名思义,为对象分配空间,进行初始化。它是一种特殊的成员函数,具有以下特点:1.函数名与类名相同。2.无返回值。3.构造对象的时候系统会自动调用构转载 2017-06-23 18:24:33 · 756 阅读 · 2 评论 -
C++ 指针悬挂和赋值操作符的重载,拷贝构造函数实现
指针悬挂:问题:使用new申请的内存内存空间无法访问,也无法释放。原因:直接对指向new申请的存储空间的指针变量进行赋值修改后果:失去了原来的地址,原来的空间无法访问也无法释放,造成内存泄漏 还可能造成同一个内存释放两次容易引起指针悬挂的方式:对象的初始化和对象间赋值容易引起指针悬挂的条件:类中含有指针类型的成员时,使用默认的拷转载 2017-06-23 18:22:43 · 801 阅读 · 0 评论 -
gcc编译C++程序
gcc编译C++程序单个源文件生成可执行程序下面是一个保存在文件 helloworld.cpp 中一个简单的 C++ 程序的代码: /* helloworld.cpp */#include int main(int argc,char *argv[]){ std::cout return(0);}程序使用定义在头文件 iostream 中的转载 2017-06-21 20:41:41 · 774 阅读 · 0 评论 -
LIB和DLL的区别与使用
共有两种库:一种是LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library。一种是LIB包含函数代码本身,在编译时直接将代码加入程序当中,称为静态链接库static link library。共有两种链接方式:动态链接使用动态链接库,允许可执行模块(.dll文件或.exe文件)仅转载 2017-05-07 17:57:31 · 395 阅读 · 0 评论 -
关于rand和srand函数使用的一点心得
在C语言里面,两个函数包含在头文件里面,c++里面,标准库(被包含于中). srand函数是随机数发生器的初始化函数。 原型:void srand(unsigned seed); rand函数用来产生随机数,当然是伪随机数。 原型:int rand(void) seed的作用:srand函数的作用是根转载 2017-04-13 20:39:42 · 1512 阅读 · 0 评论 -
踏入C++中的雷区——C++内存管理详解
伟大的Bill Gates 曾经失言: 640K ought to be enough for everybody — Bill Gates 1981 程序员们经常编写内存管理程序,往往提心吊胆。如果不想触雷,唯一的解决办法就是发现所有潜伏的地雷并且排除它们,躲是躲不了的。本文的内容比一般教科书的要深入得多,读者需细心阅读,做到真正地通晓内存管理。 1、内存分配方式转载 2017-04-05 00:35:19 · 341 阅读 · 0 评论 -
C++异常处理:try,catch,throw,finally的用法
写在前面所谓异常处理,即让一个程序运行时遇到自己无法处理的错误时抛出一个异常,希望调用者可以发现处理问题.异常处理的基本思想是简化程序的错误代码,为程序键壮性提供一个标准检测机制.也许我们已经使用过异常,但是你习惯使用异常了吗?现在很多软件都是n*365*24小时运行,软件的健壮性至关重要. 内容导读本文包括2个大的异常实现概念:C++的标准异常和SEH异常.C++转载 2018-01-12 16:33:49 · 6929 阅读 · 0 评论 -
C++关于构造函数 和 析构函数 能否抛出异常的讨论
构造函数和析构函数分别管理对象的建立和释放,负责对象的诞生和死亡的过程。当一个对象诞生时,构造函数负责创建并初始化对象的内部环境,包括分配内存、创建内部对象和打开相关的外部资源,等等。而当对象死亡时,析构函数负责关闭资源、释放内部的对象和已分配的内存。在对象生死攸关的地方,如果程序代码出现问题,常常会发生内存泄漏,从而产生可能危害系统运行的孤魂野鬼。大量的事实表明,业务逻辑代码写得非常严谨的程转载 2018-01-23 22:39:12 · 307 阅读 · 0 评论 -
C++函数返回局部变量
函数不能返回指向栈内存的指针 原因:返回值是拷贝值,局部变量的作用域为函数内部,函数执行结束,栈上的局部变量会销毁,内存释放。可返回的局部变量: 1. 返回局部变量本身 int sum(int a, int b){ int s=a+b; return s;} 2.常量:char* returnValue() { char* str="HelloJac...转载 2018-02-20 01:39:55 · 3629 阅读 · 0 评论 -
深入理解C语言内存管理
之前在学Java的时候对于Java虚拟机中的内存分布有一定的了解,但是最近在看一些C,发现居然自己对于C语言的内存分配了解的太少。问题不能拖,我这就来学习一下吧,争取一次搞定。 在任何程序设计环境及语言中,内存管理都十分重要。内存管理的基本概念分析C语言内存的分布先从Linux下可执行的C程序入手。现在有一个简单的C源程序hello.c1 #include <stdio.h>2 #i...转载 2018-02-20 00:45:12 · 5696 阅读 · 1 评论 -
C++中static_cast和dynamic_cast强制类型转换
前言说起C++中的继承、多态、虚函数等概念,可能很多同学都有所了解,但是要说真正熟知的同学可能就不是很多了。最近在编程过程中了解到C++类型的层次转换(这就涉及到了多态和继承的相关概率),通常C语言中可以对内置类型进行强制转换,但是这样做不是很安全,在C++标准中,提供了关于类型层次转换中的两个关键字static_cast和dynamic_cast。一、static_cast关键字(编译时类型检查...转载 2018-03-14 20:25:40 · 2645 阅读 · 1 评论 -
C++ 全局变量、静态全局变量、局部变量、静态局部变量使用归类
C++ 全局变量、静态全局变量、局部变量、静态局部变量的使用,整理表格如下:分类 全局变量 静态全局变量(static) 局部变量(auto) 静态局部变量(static) 作用域 全局作用域(extern) 文件作用域(当前文件) 局部作用域(定义的位置到函数结束) 局部作用域(定义的位置到函数结束) 内存分配 全局静态存储区 全局静态存储区 栈 全局静态存储区 生存周期...原创 2018-02-14 11:42:54 · 1257 阅读 · 0 评论 -
C/C++的内存泄漏检测工具Valgrind memcheck的使用经历
Linux下的Valgrind真是利器啊(不知道Valgrind的请自觉查看参考文献(1)(2)),帮我找出了不少C++中的内存管理错误,前一阵子还在纠结为什么VS 2013下运行良好的程序到了Linux下用g++编译运行却崩溃了,给出一堆汇编代码也看不懂。久久不得解过后,想想肯定是内存方面的错误,VS在这方面一般都不检查的,就算你的程序千疮百孔,各种内存泄露、内存管理错误,只要不影响运行,没有读转载 2018-01-20 01:34:45 · 486 阅读 · 0 评论 -
浅谈 C++ 中的 new/delete 和 new[]/delete[]
目录(?)[+]在 C++ 中,你也许经常使用 new 和 delete 来动态申请和释放内存,但你可曾想过以下问题呢?new 和 delete 是函数吗?new [] 和 delete [] 又是什么?什么时候用它们?你知道 operator new 和 operator delete 吗?为什么 new [] 出来的数组有时可以用 delete 释放有时又不行?转载 2018-01-20 01:25:59 · 378 阅读 · 0 评论 -
C++ explicit关键字详解
首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式).那么显示声明的构造函数和隐式声明的有什么区别呢? 我们来看下面的例子:class CxString // 没有使用explicit关键字的转载 2018-02-01 23:24:40 · 393 阅读 · 0 评论 -
C++中的动态类型与动态绑定、虚函数、运行时多态的实现
动态类型与静态类型静态类型 是指不需要考虑表达式的执行期语义,仅分析程序文本而决定的表达式类型。静态类型仅依赖于包含表达式的程序文本的形式,而在程序运行时不会改变。通俗的讲,就是上下文无关,在编译时就可以确定其类型。动态类型 是指由一个左值表达式表示的左值所引用的最终派生对象的类型。例:如果一个静态类型为“类 B ”的指针p 指向一个继承于转载 2018-01-23 23:12:49 · 367 阅读 · 0 评论 -
C++中基类的析构函数为什么要用virtual虚析构函数
知识背景 要弄明白这个问题,首先要了解下C++中的动态绑定。 关于动态绑定的讲解,请参阅: C++中的动态类型与动态绑定、虚函数、多态实现正题 直接的讲,C++中基类采用virtual虚析构函数是为了防止内存泄漏。具体地说,如果派生类中申请了内存空间,并在其析构函数中对这些内存空间进行释放。假设基类中采用的是非虚析构函数,当删转载 2018-01-23 23:12:02 · 430 阅读 · 0 评论 -
指针和数组
一、指针和数组的对比1、数组的创建方式:静态存储区或者栈。 数组名 对应 着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的 内容 可以改变。2、指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存。char *p = "littlesea"; //指针指向常量字符串 值是不能改变的eg.char *p = “wo原创 2010-04-14 15:45:00 · 600 阅读 · 0 评论 -
C++的动态绑定和静态绑定
定义:1、对象的静态类型:对象在声明时采用的类型。是在编译期确定的。2、对象的动态类型:目前所指对象的类型。是在运行期决定的。对象的动态类型可以更改,但是静态类型无法更改。eg.class B{}class C : public B{}原创 2011-10-15 23:41:48 · 630 阅读 · 0 评论 -
指针和内存判断
问题一:void GetMemory(char *p){ p=(char*)malloc(100);}void Test(void){ char *str = NULL; //char *str = (char*)malloc(100); //上面一句话改成这句就对了 GetMemory(str); strcpy(str,"helloworld"); printf(str); free(str原创 2010-04-13 23:15:00 · 705 阅读 · 0 评论 -
一个宏定义的问题
#define Add(a,b) (a+b) //定义个宏 int main(){ int d = 3; printf("%d",d * Add(1,2)); return 0;} 如果定义成#define Add(a,b) (a+b); //定义个宏 编译时出现: error C2143: syntax error : missing ) before ; error C2原创 2010-02-02 00:59:00 · 983 阅读 · 0 评论 -
WIN32框架下的循环(Gameloop)与绘制(Render)
通常进入WinMain函数之后,系统循环条件【if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))】之后写一个else,在else里面处理自己的循环和绘制;如下代码所示: while (TRUE) { if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { if (msg.message == WM_QUIT原创 2010-02-01 00:35:00 · 1753 阅读 · 0 评论 -
类的继承与派生
类的继承与派生派生类的生成过程,实际上是经历了三个步骤:1、吸收基类成员;2、改造基类成员;3、添加基类成员;1、吸收基类成员就是派生类继承从基类过来的所有成员,但是基类的构造函数和析构函数除外;2、改造基类成员包含两个方面:(1)基类成员的访问控制(2)对基类数据或函数成员的覆盖就是说如果派生类中声明了一个和基类同名的新成员,(如果声明的是成员函数,则参数列表也要一样,因为参数不同的情况属于重载原创 2010-01-31 02:51:00 · 1101 阅读 · 0 评论 -
memcpy的用法总结
1、memcpy 函数用于 把资源内存(src所指向的内存区域) 拷贝到目标内存(dest所指向的内存区域);拷贝多少个?有一个size变量控制拷贝的字节数;函数原型:void *memcpy(void *dest, void *src, unsigned int count);用法:(1)可以拷贝任何类型的对象,因为函数的参数类型是void*(未定义类型指针),也就是说传进去的实参可以是int*原创 2010-02-01 00:34:00 · 188858 阅读 · 7 评论 -
memset 函数用法
memset原型:extern void *memset(void *buffer, int c, int count);用法:#include 功能:把buffer所指内存区域的前count个字节设置成字符c。说明:返回指向buffer的指针。用来对一段内存空间全部设置为某个字符。举例:char a[100];memset(a, /0, sizeof(a));memset可以方便的清原创 2010-02-01 00:31:00 · 1209 阅读 · 0 评论 -
strrchr()函数
strrchr()函数:strrchr()函数的作用是: 查找一个字符串在另一个字符串中 末次 出现的位置,并返回从字符串中的这个位置起,一直到字符串结束的所有字符; 如果未能找到指定字符,那么函数将返回False。char *strrchr( char *str, int c );strrchr() 函数的分析 函数原型:extern char * strrchr (co原创 2010-02-01 17:09:00 · 51549 阅读 · 5 评论 -
派生类的构造函数和析构函数
声明了派生类,就可以进一步声明派生类的对象用于解决问题;但是对象在使用之前必须要初始化,而对派生类的初始化就是对该类的数据成员赋值;派生类的数据成员包括三类:基类数据成员,新增数据成员,成员对象数据成员(也叫子对象,或者内嵌对象);由于基类的构造函数并没有被继承下来,所以要完成初始化的工作,就要在派生类中添加新的构造函数。派生类的构造函数需要以合适的初值作为参数,(1)隐含调用基类和新增的内嵌对象原创 2010-01-31 17:31:00 · 1099 阅读 · 0 评论 -
派生类成员对基类的访问
作用域分辨符:就是::用来限定要访问的成员所在的类的名称;表达式是:基类名::成员名; //数据成员基类名::成员名(参数表)//成员函数加入作用域分辨符可以防止同名覆盖,也可以保证访问不出现二义性;(避免二义性,内存中只有一份拷贝,用到虚基类)例子:class B1{public: int nV; void fun() { cout }};class B2{publi原创 2010-01-31 17:29:00 · 1093 阅读 · 0 评论 -
内存管理
sizeof()问题;char *p = new char[5];memset(p, 0, sizeof(p));1、这时候sizeof(p) 是4;即使是new出来的内存也不行,只能说申请了5个字节的空间,但是p还是指向首地址的(还是指针);2、如果改成数组,就不一样了;char p[5] = "";这时候sizeof(p) 就是5 ,数组名是符号地址常量,所以带有长度信息的;3、如果这样:原创 2010-02-03 17:24:00 · 535 阅读 · 0 评论 -
this 指针理解和应用
this指针只能在一个类的成员函数中调用,它表示 当前对象 的地址。(使用它可以调用对象的成员)下面是一个例子: void Date::setMonth( int mn ) { month = mn; //这三句是等价的(month是类成员变量) this->month = mn; (*this).month = mn; } 1. this只能原创 2010-02-05 11:05:00 · 852 阅读 · 0 评论 -
结构体类型问题
问题1:#include "stdio.h" typedef struct stu{ char name[32]; int age; }*p; //p s; //memset(s->name,0,strlen(s->name)); //strcpy(s->name,"12345"); // int a = 0; //a = -1; //char *a = p->name; /原创 2010-04-13 21:12:00 · 573 阅读 · 0 评论 -
获得文件路径
1、获得绝对路径:eg.C://yuanzhenhai//littlesea.txt2、当前相对路径:eg..//littlesea.txt3、获得目录上一层的相对路径:假如已经知道当前路径是.//littlesea.txt得到它的上一层路径yuanzhenhai中的xiaohai.txt路径的方法是eg..//..//xiaohai.txt注意:"." --代表目前所在的目原创 2010-04-13 21:09:00 · 566 阅读 · 0 评论 -
main函数参数和atoi和BYTE
#include #include main(int argc,char*argv[]){ int a=0,n; n = atoi(*(argv+1)); //命令行输入n的值,保存在argv数组里面,然后转换成n的值;字符长转换成int类型 while(n--) printf("%d ",a++*2);} 说明:argc是参数个数;argv是参数内容;第一个参数是.exe本身,就是a原创 2010-04-13 23:14:00 · 815 阅读 · 0 评论 -
命令行参数和atoi和BYTE
#include #include main(int argc,char*argv[]){ int a=0,n; n = atoi(*(argv+1)); //命令行输入n的值,保存在argv数组里面,然后转换成n的值;字符长转换成int类型 while(n--) printf("%d ",a++*2);} 说明:argc是参数个数;argv是参数内容;第一个参数是.exe本身,就是a原创 2010-04-13 21:26:00 · 979 阅读 · 0 评论 -
C++虚基类构造函数
C++虚基类构造函数下面文章详细介绍C++虚基,所谓C++虚基类:是由最派生类的构造函数通过调用虚基类的构造函数进行初始化的,但前提是要深入理解到底什么是C++虚基类,及他是怎么运行的。 前面讲过,为了初始化基类的子对象,派生类的构造函数要调用基类的构造函数。对于虚基类来讲,由于派生类的对象中只有一个虚基类子对象。为保证虚基类子对象只被初始化一次,这个虚基类构造函数必须只被调用一次。由于继原创 2010-02-08 15:22:00 · 11380 阅读 · 2 评论 -
虚基类、虚函数和纯虚基类
首先看一个例子:class Base{public: virtual void print() //声明虚函数,基类声明了虚函数,子类就不用在virtual了,基类可以传递给子类的同样的函数 //基类如果不声明成虚函数,声明成:void print(),则下面的p->print();调用则会调用基类的pr原创 2010-02-08 14:17:00 · 12561 阅读 · 2 评论