C++new的工作方式
如果申请的是普通的内置类型的空间1、如果是申请的是0byte,强制转换为1byte2、使用名为operator new 的标准库函数,如果是数组则调用名为operator new[]的标准库函数,申请相对应的空间,如果没有足够的空间或其他问题且没有定义_new_hanlder,那么会抛出bad_alloc的异常并结束程序3、如果定义了_new_hanlder回调函数...
C++引用比指针的好处
一般来说,这样做是为了防止在函数中乱用参数因为如里你用int &a,这样在函数中就只能用a,也知道a是个整型变量而如果你用int *a,那么在函数中只知道a是个整型指针,至于它指的是个数还是一个向量,这个不清楚,如果不小心用了a[1]这些的话,明显就越界了因此,在写程序中,如果可能的话,推荐在函数里...
C++指针转换
点击(此处)折叠或打开int main(){ S s; int *p=&s.i; p[0]=1; p[1]=5; cout<<p[0]...
C++指针问题
int main(){ char *str[]={"Welcome", "to", "Fortemedia", "Nanjing"}; char **p=str+1; str[0]=(*p++)+2; str[1]=*(p+1); str[2]=str[1]+3; str[3]=p[0]+(str[2]-str[1]); *p指向str[2] cout<<str[3]<<endl;...
C++strcpy内存覆盖问题
点击(此处)折叠或打开char str[]=\"123456789\";char dst[]=\"aaa\";strcpy(dst, str);cout
指针常量和常量指针
指针常量是指针所指向的位置不能改变,即指针本身是一个常量。但是指针常量可以通过间接引用修改内存中的数据。常量指针是指指针指向的值是常量不能修改,但是指针本身能修改
类的前缀自增/自减和后缀自增/自减
前缀操作符返回对象的引用后缀操作符返回对象值 所以前缀操作符效率高些点击(此处)折叠或打开CheckedPtr& CheckedPtr::operator++() { if (curr == end) throw out_of_range (\"incremen...
深入探索C++对象模型第五章学习心得
1.抽象类中可以定义静态函数,这个静态函数可以像其他类中的静态函数的使用方法使用。2.在抽象类中,如果析构函数是纯虚函数,必须定义,因为派生类的析构函数要调用抽象类中的析构函数。3.尽量把抽象类中的数据成员抽离出来,使抽象类中只有接口函数。4.如果类的构造函数列表有默认值,可以直接定义对象,不用显示地调...
c++内存中字节对齐问题详解
一、什么是字节对齐,为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对...
类成员函数的重写,重载和隐藏的区别
重写和重载的区别范围的区别:被重写的和重写的函数在两个类中,而重载和被重载的函数在同一个类中参数的区别:被重写函数和重写函数的参数列表一定相同,而被重载函数和重载函数的参数列表一定不相同virtual的区别:重写的基类中被重写的函数必须有virtual修饰,而重载函数和被重载函数可以有也可以没有隐藏和重写,...
C++ primer智能指针(HasPtr)实现
智能指针显然是C++吸引人的地方之一,必须掌握。看了《C++primer》,里面着重讲了智能指针的实现方式。书中说到: “HasPtr(注:就是自定义的智能指针)在其它方面的行为与普通指针一致。具体而言,复制对象时,副本和原对象将指向同一基础对象。如果通过一个副本改变基础对象,则通过另一个对...
C++ 智能指针详解
C++ 智能指针详解 一、简介由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete。程序员忘记 delete,流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见。用智能指针便可以有...
C++中的虚继承的构造
多继承中被当做基类来虚继承的类是虚基类。虚基类:使用关键字virtual继承的基类。即使同一类在层次中作为虚基类出现多次,派生类对象中虚基类部分也只出现一次。在非虚基类中,构造函数只能初始化自己的直接基类,当对一个类进行虚继承的时候,由最底层的派生类初始化那个类,因此最底层的派生类应包含用于其他所有...
C++虚函数bug
点击(此处)折叠或打开class Base{private: virtual void f() { cout<<\"Base::f\"<<endl; } virtual void g() { cout<<\"Base::g\"<<endl; }};class DeriveC...