雕刻时光

just do it……nothing impossible
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

随笔分类 -  c++基础知识

摘要:valgrind主要检测内存的使用情况,检测有否内存泄露等。比如:test_va2.cpp#includeusing namespace std;int main(){ int i[5]; char *p; char *p2 = new char[123];... 阅读全文

posted @ 2014-09-05 17:54 huhuuu 阅读(397) 评论(0) 推荐(0) 编辑

摘要:单例模式,故名思意是只有单个实例对象的类。所以要控制构造函数,赋值函数的使用。注意对类静态对象赋予初值的方法。#includeusing namespace std;class CSingleton{ //其他成员public: static CSingleton* GetInstance() { if ( m_pInstance == NULL ) //判断是否第一次调用 m_pInstance = new CSingleton(); return m_pInstance; } ~CSingleton(){ ... 阅读全文

posted @ 2014-04-08 19:12 huhuuu 阅读(262) 评论(0) 推荐(0) 编辑

摘要:对于vector的全体排序,我们知道sort(vv.begin(),vv.end())来进行的。 但是对于如果是局部排序的话,比如,vector有100个元素,但我只想对10-80之间的数进行排序,如何处理? 这里考虑使用迭代器,一个迭代器指向10的位置,一个迭代器指向80的位置即可: #include#include#include#include#includeusing namespace std;int main(){ int i,j; vectorvv; for(i=0;i::iterator left,right; left = right = v... 阅读全文

posted @ 2014-03-28 21:52 huhuuu 阅读(2600) 评论(0) 推荐(0) 编辑

摘要:memcpy的实现看起来貌似比较简单,但是也是有注意的地方!void *memcpy(void *dst, const void *src, size_t size){ //check argument assert(null != dst && null != src); if (dst 0) { *pDst++ = *pSrc++; } } else if (dst > src) { byte *pDst = (byte*)dst+size-1; const byte... 阅读全文

posted @ 2014-03-19 19:09 huhuuu 阅读(288) 评论(0) 推荐(0) 编辑

摘要:对于普通的程序,在异常发生的时候,程序就会退出,如在做除法的时候,除了个0,就会runtime_error,程序退出,但是,有时就算发生了异常,我们也不希望程序退出,那么就要使用异常处理了。 一般用try{}catch(){}的格式的格式来处理异常: #include#includeusing namespace std;void fun(){ int n = 0; if(0 == n){ throw runtime_error("error"); }}int main(){ try{ fun(); }catch(runtim... 阅读全文

posted @ 2014-03-14 15:08 huhuuu 阅读(178) 评论(0) 推荐(0) 编辑

摘要:#include#include#includeusing namespace std;template class smartpointer //智能指针的实现{private: T *_ptr;public: smartpointer(T *p) : _ptr(p) //构造函数 { } T& operator *() //重载*操作符 { return *_ptr; } T* operator ->() //重载->操作符 { return _ptr; } ~sma... 阅读全文

posted @ 2014-03-09 20:37 huhuuu 阅读(263) 评论(0) 推荐(1) 编辑

摘要:C++没有java的内存垃圾回收机制,在程序短的时候可能比较容易发现问题,在程序长的时候是否有什么检测的方法呢? 假设有一个函数可以某点检测程序的内存使用情况,那是否可以在程序开始的时候设置一个点,在程序结束的时候再设置一个点,比较这两个值是否一样就可以知道内存泄露的情况了。 windows下的内存检测方法:#define _CRTDBG_MAP_ALLOC //一定要加上这一句#include #include #include using namespace std;_CrtMemState s1, s2, s3;void GetMemory(char *p, int num){ ... 阅读全文

posted @ 2014-03-02 13:20 huhuuu 阅读(490) 评论(0) 推荐(0) 编辑

摘要:这里的问题其实问的是对堆与栈的数据访问有什么不同。 观察如下代码:#include#includeusing namespace std;int main(){ int a; int *pb=(int*)malloc(sizeof(int)); a=1234; *pb=123456; return 0;} 在观察汇编的情况: 明显观察到,对栈数据赋值,直接将数据放到目标地址。而堆中的数据,先把pb的值放到寄存器中,再把值放到寄存器所指向的地址。 总结:对与堆内存的访问比栈内存的访问多一个步骤。 阅读全文

posted @ 2014-02-16 17:11 huhuuu 阅读(600) 评论(0) 推荐(0) 编辑

摘要:有错误欢迎批评指正!谢谢!1.当一个类继承另一个类的时候,子类构造函数与析构函数在自己的类中不需要显示调用父类的构造函数与析构函数2.当一个类继承另一个类的时候,子类的拷贝构造函数需要显示的调用父类的拷贝构造函数,且必须按初始化的方式调用!3.当一个类继承另一个类的时候,子类的赋值函数也需要显示的调用父类的赋值函数#includeusing namespace std;int i=1;class base{public: base(){ valueBase=i; i++; valueBase2=i; i++; prin... 阅读全文

posted @ 2014-01-03 10:37 huhuuu 阅读(1494) 评论(0) 推荐(0) 编辑

摘要:转自:http://www.cnblogs.com/dwdxdy/archive/2012/07/17/2594993.html在C++中,调用拷贝构造函数有三种情况:1.一个对象作为函数参数,以值传递的方式传入函数体.2.一个对象作为函数返回值,以值传递的方式从函数返回.3.一个对象用于给另外一个对象进行初始化(复制初始化).拷贝构造函数必须以引用的形式传递(参数为引用值).其原因如下:当一个对象以传递值的方式传一个函数的时候,拷贝构造函数自动的调用来生成函数中的对象.这样会导致无限循环地调用拷贝构造函数,直至栈溢出.以前,一直有个误解,以为以同类型的对象调用"="时,就 阅读全文

posted @ 2014-01-02 21:44 huhuuu 阅读(243) 评论(0) 推荐(0) 编辑

摘要:虚函数是否可以内联? 一般来说,inline是编译时的行为,虚函数是在程序执行时的行为,因此编译器一般会拒绝对虚函数进行内联! 阅读全文

posted @ 2013-12-30 15:58 huhuuu 阅读(371) 评论(0) 推荐(0) 编辑

摘要:1.何为菱形继承?两个子类继承同一个父类,而又有子类又分别继承这两个子类,就如上图说示。#include#include#includeusing namespace std;class A {public: A(){printf("A create.\n");} int a; virtual void fun(){}};class B: public A{public: B(){printf("B create.\n");} int b; virtual void fun1(){}};class C: public A{public : int c;. 阅读全文

posted @ 2013-12-29 14:04 huhuuu 阅读(12041) 评论(0) 推荐(2) 编辑

摘要:之前没注意static这个关键词,被人问到的时候竟然不知道= =!果断补补 1.全局变量与静态全局变量,全局变量可以在声明的情况下,在项目的各个文件通用,静态全局变量就只能在当前定义的文件下使用。 1)全局变量是不显式用static修饰的全局变量,但全局变量默认是动态的,作用域是整个工程,在一个文件内定义的全局变量,在另一个文件中,通过extern 全局变量名的声明,就可以使用全局变量。 2)全局静态变量是显式用static修饰的全局变量,作用域是声明此变量所在的文件,其他的文件即使用extern声明也不能使用。//Example 2//File1 第一个代码文件的代码#includ... 阅读全文

posted @ 2013-12-28 16:51 huhuuu 阅读(296) 评论(0) 推荐(0) 编辑

摘要:拷贝构造函数大家都比较熟悉,通俗讲就是传入一个对象,拷贝一份副本。 不过看似简单的东西,实际不注意的话就会产生问题!#includeusing namespace std;class CExample {public: int a,b,c; char *str;public: //构造函数 CExample(int tb) { a = tb; b = tb+1; c = tb+2; str=(char *)malloc(sizeof(char)*10); strcpy(str,"1234... 阅读全文

posted @ 2013-12-25 16:28 huhuuu 阅读(3483) 评论(3) 推荐(2) 编辑

摘要:在用到delete的时候,我们往往会针对类对象与类对象数组做不同删除,在这背后编译器是如何做的?#includeusing namespace std;class A{ int a;public: ~A(){ printf("delete A\n"); }};int main(){ A *pa = new A ; A *pas = new A[10] ; //delete []pas; //详细流程 //delete []pa; //会发生什么 //delete pas;... 阅读全文

posted @ 2013-12-25 13:43 huhuuu 阅读(6545) 评论(0) 推荐(0) 编辑

摘要:引入:这段时间一直在思考虚函数表的问题,同时也想知道虚函数表是在什么时候产生的本人是在VS2010的环境下,如有错误欢迎指出,谢谢。观察代码#include#includeclass A{public:A(); virtual~A(); void fun1(){ printf("123"); }};A::A(){ printf("new A\n");}A::~A(){ printf("Delete class A\n");}class B : public A{public:B(); ~B(); vo... 阅读全文

posted @ 2013-12-21 15:04 huhuuu 阅读(7206) 评论(0) 推荐(2) 编辑

摘要:对于类中的成员变量的初始化要注意:考虑:#includeusing namespace std;class A{private: int n1; int n2; public: A():n2(0),n1(n2+2){} void Print(){ cout using namespace std;class A{private: int n1; int n2; public: //A():n2(0),n1(n2+2){} //n1:-858993458, n2: 0 //A():n1(n2+2),n2(0){}... 阅读全文

posted @ 2013-12-21 10:46 huhuuu 阅读(2168) 评论(0) 推荐(0) 编辑

摘要:以前虽然考虑过这个问题,但是试了下以后就以为虚函数表在内存的代码区里,后来还被问到虚函数表在内存中的哪里,回答不同编译器对虚函数的处理是不一样的,今天仔细的测了测。 当然以下的测试是在win7的VS2010下。有错误欢迎批评指出,谢谢。 测试代码#include using namespace std;class Base1 {public: virtual void f() { cout << "Base1::f" << endl; } virtual void g() { cout << "Base1::g" &l 阅读全文

posted @ 2013-12-19 21:07 huhuuu 阅读(5427) 评论(0) 推荐(0) 编辑

摘要:《c++ primer》中这样写的:引用在内部存放的是一个对象的地址,它是该对象的别名。对于不可寻址的值,如文字常量,以及不同类型的对象,编译器为了实现引用,必须生成一个临时对象,引用实际上是指向该对象,但用户不能访问它。#include#pragma pack(1)class data{public: double data_a; double &data_ra; data():data_ra(data_a){ //引用不能在构造函数体内初始化,要在构造函数名称右边初始化 data_a=1.0; }};int main(){ double... 阅读全文

posted @ 2013-12-18 22:53 huhuuu 阅读(267) 评论(0) 推荐(0) 编辑

摘要:问题的引出:一个类D继承自两个类B1,B2,而B1,B2都继承与基类B#includeusing namespace std; class B{ public: int ib; char cb; public: B():ib(0),cb('B') { printf("B found\n"); } virtual void f() { cout ib=111;由于二义性 这样会有问题 //printf("%d\n",d->ib); d->B1::ib=222; //pri... 阅读全文

posted @ 2013-12-15 20:49 huhuuu 阅读(817) 评论(0) 推荐(0) 编辑