c++
Persist-in-walking
这个作者很懒,什么都没留下…
展开
-
浅谈c++继承、多态及继承与多态的区别
继承:类与类之间可以共用代码,实现代码重用。基类:被继承的类,即父亲类。派生类:继承的类,拿来主义类,即儿子类。继承方式:private:私有继承基类private成员 不能继承基类public、protected成员,可以继承,在派生类中相当于是private访问public:公有继承:基类private成员 不能继承基类public成员,可以继承,在派生原创 2017-07-13 10:20:26 · 1477 阅读 · 0 评论 -
c++将构造与非成员函数虚化的方法
虚函数拥有因类型而异的行为。而构造函数则是已经明确了对象,才调用的,所以,构造函数不能为虚函数,但是,我们可以通过一些方法使得构造函数可以有虚函数的功能。所谓的虚构造函数,是一种函数,视其获得的输入,可产生不同类型的对象。用途:如在从磁盘(或网络或磁带等)读取信息时。class A{ //抽象基类,内含虚函数public:..};class B原创 2017-08-07 23:16:38 · 358 阅读 · 0 评论 -
c++强制类型转换补充
c++要添加几种新式类型转换的原因:1.旧式的类型转换几乎允许将任何其他类型转换成你需要的类型,这是非常拙劣的。2.旧式的类型转换不容易辨识。c++的四种新的类型转换:static_cast:与旧式的类型转换功能一样,不可以在赋值类型不兼容的类型之间转换。如:将一个struct转换为int,或者将一个int 转换成指针pointer。const_cast:改变表达式中的常量原创 2017-07-24 22:07:17 · 269 阅读 · 0 评论 -
不要以多态的方式处理数组
基类,派生类的sizeof不同。如果以多态的方式处理数组的话,就类似与int类型数组,却每次要移动sizeof(double)一样。基类与派生类大小不同,一般派生类比较大,当你传递一个派生类对象数组给一个参数是基类对象数组的函数时,Array[i],移动的距离就不在是i*sizeof(基类)了,就是i*sizeof(派生类)了。如:void printarray(ostream &原创 2017-07-24 22:20:43 · 564 阅读 · 0 评论 -
c++限制某个class所能产生对象数量的方法
1.产生零个或一个对象:将构造函数与拷贝构造函数声明为私有成员,并声明一个友元函数,在友元函数中声明一个静态成员,调用构造函数,并返回一个静态成员的引用。另一种方法就是设置一个计数器,初始化为0.在构造函数中+1,在析构函数中-1,每次保证只有一个对象。2.不同对象的构造状态:上述第二种方法在继承关系与嵌入大对象中时就会出现漏洞。假设有一个打印机的基类,它的派生类是一个彩色打印机,原创 2017-08-09 23:28:19 · 486 阅读 · 0 评论 -
c++对象的三种存在形态
1.它作为类的对象本身,如:A a;a即是A的对象2.嵌入大的对象之中3.作为派生类的基类部分。原创 2017-08-09 23:31:08 · 276 阅读 · 0 评论 -
浅谈c++无参构造
无参构造即在没有任何外来信息的情况下对对象进行初始化。对于有些类来讲,有许多对象,没有外来信息,就没办法执行一个完全的初始化。如:设备仪器编号,若没有适当的编码,则对象就是无效的。没有无参构造带来的问题:1.没有办法为数组中的对象提供所需参数。如:A是一个没有无参构造的类A* aa=new A[10];//错误,没有声明无参构造。A a[10];//错误2.不适用于某些原创 2017-07-25 16:45:19 · 2154 阅读 · 0 评论 -
c++可以重载与不可以重载的操作符
可以重载的有:() [] , operator new operator delete operator new[] operator delete[] + - * / += -= == > = % ->* ~ != ++ -- && || ^= &= |= >= > /= *= %=不能重载的操作符:?: :: . .*原创 2017-07-26 19:54:10 · 252 阅读 · 0 评论 -
c++临时对象的来源即成本
程序员往往把临时需要的变量称为 “临时变量”。如:templatevoid swap(T& object1,T& object2){T temp=object1;object1=object2;object2=temp;}temp 即临时对象,但是,在c++眼中,temp并不是临时对象,是一个局部对象。c++临时对象是不可见的,一般临时对象会在下面两种情况下产生原创 2017-08-04 10:29:01 · 190 阅读 · 0 评论 -
c++operator new/new operator、operator delete/delete operator的区别与联系
c++可以重载运算符,其中operator new/operator delete是可以重载的。但是,new operator与delete operator都是内建操作符,不能重载string* p= new s("aaaaaaa");上述语句调用的就是new operator,它执行了两步:1.调用operator new 为对象分配空间。2.调用构造函数进行初始化。区原创 2017-07-27 18:22:51 · 342 阅读 · 0 评论 -
浅谈c++placement new
placement new 存在于头文件,或者中。有些时候,你会想在指定的内存上面构造对象。这时就会用到placement new。它是一个特殊版本的operator new。例如:class Widget{Widget(int Widgetsize);...};Widget* constructWidgetInBuffer(void* buffer,int Wid原创 2017-07-27 19:33:22 · 463 阅读 · 0 评论 -
c++设计中可以利用重载避免隐式类型转换
首先,先看一个例子:class UPInt {public:UPInt();UPInt(int value);...}const UPInt operator +(const UPInt& object1,const UPInt& object2);UPInt object1,object2;UPInt object3=object1+object2;//调用o原创 2017-08-05 00:16:11 · 365 阅读 · 0 评论 -
c++设计中可以利用析构函数避免泄露资源
假设有这样一个函数B::virtual void fun(int i){while(i--){A* ptr=readdata(i);//其中A为抽象基类ptr->fun1();//假设fun1是A中的纯虚函数delete ptr;}}对于上面的代码,当ptr->fun1();出了异常,则程序永远不会delete ptr,造成资源的泄漏。要避免这一点,原创 2017-07-28 23:51:49 · 314 阅读 · 0 评论 -
使用op=(复合形式)替代op(独身形式)的优点
考虑下面的类:class Rational{public:....Rational& operator +=(const Rational& rhs);Rational& operator -=(const Rational&lhs);};Rational& operator +=(const Rational& rhs,const Rational&lhs)原创 2017-08-06 23:01:02 · 405 阅读 · 0 评论 -
c++中static成员函数、成员变量作用
当函数的行为对所有的派生类都一致时,可以将其声明为静态成员函数。好处:1.可以实现某些特殊的设计模式。如:Singleton2.可以把某些系统的回调函数以静态函数的形式封装到类的内部。因为系统API的回调函数通常都是独立的,没有this指针。3.可以封装某些算法。4.静态函数不需要实例化就可以被调用,所以,一切不需要实例化就可以有确定行为方式的函数都应该封装成静态成员函数。转载 2017-07-23 16:23:12 · 400 阅读 · 0 评论 -
确保非局部静态对象使用前被初始化
这种情况主要在于:一个对象的初始化要靠另一个对象的初始化。非局部静态对象:定义在全局或者名字空间范围内的对象在一个类中被声明为static的对象在一个文件范围内被定义为static。做法:可以返回局部静态对象的引用来达到初始化的目的。如:class A{public:A& a_static(){static A a;return a;}转载 2017-07-19 17:01:09 · 292 阅读 · 0 评论 -
浅谈c++volatile关键字
volatile:是一种类型修饰符,它修饰的类型变量可以被某些编译器或者未知因素更改。如:操作系统、硬件、其他线程等。volatile可以与const同时使用。如 const volatile int i=0;const与volatile写在一起的意义是没有问题的。假如:只读的状态寄存器,它是volatile,因为它可能被意外改变;它是const,因为,程序不应该试图修改它。volat原创 2017-07-22 17:02:09 · 170 阅读 · 0 评论 -
c++重载与重写
重载:一个类中,函数名相同,参数列表不同(与返回值类型无关),这样的方法称为重载。重写:在有继承关系得类中,派生类函数名参数列表及返回值类型必须与被重写的方法一致。且被重写的位虚函数。区别:1.重载是在同一个类中,重写是在有继承关系的两个类中。2.重载参数列表不同,重写则要求完全相同。3.重载与返回值类型无关,重写必须与被重写的函数返回值类型相同。4.被重写的方法不能为pr原创 2017-07-13 10:38:05 · 275 阅读 · 0 评论 -
c++重写、重载(覆盖)、隐藏
昨天写的不太全面,今天补上了一些转载 2017-07-14 16:28:17 · 205 阅读 · 0 评论 -
浅谈协议类与句柄类
句柄类:一个类仅仅用一个指针指向某个不确定的实现,即实现与接口分离,这样的类称为句柄类。协议类:特殊的抽象基类。协议类没有实现,它存在的目的是为派生类确定接口。所以,一般协议类没有数据成员,没有构造函数,有一个虚析构函数,还有一套纯虚函数,用于提供接口。协议类与句柄类常用来实现接口与实现分离,从而使得文件间的编译依赖性降低。优缺点:优点:降低文件编译依赖性缺点:1.占用内存,运原创 2017-07-16 08:43:07 · 447 阅读 · 0 评论 -
effective c++条款总结
条款1:尽量用const 和inline 而不用 #define条款2:尽量用 而不用 条款3:尽量用new/delete 而不用malloc/free条款4:尽量使用c++风格注释条款5:对应的new和delete 都要采用相同的形式条款6:析构函数里对指针成员调用delete条款条款7:预先准备好内存不够的情况条款8:写operator new与operator d原创 2017-07-15 23:05:07 · 340 阅读 · 0 评论 -
虚函数、纯虚函数与非虚函数在继承方面的区别
虚函数;子类继承父类的接口与缺省实现,即子类可以自己定义实现,也可以直接用父类的缺省实现。纯虚函数:子类只继承父类的接口。纯虚函数必须在子类中声明,但是它可以在父类中有自己的实现。子类可以通过作用域调用父类的纯虚函数的实现代码。非虚函数:子类继承父类接口与强制实现。尽量不要在子类中重新实现非虚函数,因为既然继承过来,证明这些是必要的,如果在子类中重新实现,那继承就多此一举。原创 2017-07-16 09:05:31 · 866 阅读 · 0 评论 -
c++设计中什么时候用模板什么时候用继承
当对象的类型不影响类中函数的行为时,使用模板。如:常见的堆、栈、队列;对象的类型不影响类中函数的行为:堆、栈这些无论对象是什么,都少补了入栈,出栈等操作。并不改变函数的行为。当对象的类型影响类中函数的行为时,就要使用继承。如:猫、人等;对象的类型影响类中函数的行为:对于猫、人这些类来讲,每只猫品种不同,都有自己特定的行为习惯,总会跟其他种类的有所不同,这也就导致模板不能满足原创 2017-07-17 11:37:56 · 2524 阅读 · 0 评论 -
在构造函数中避免资源泄漏
c++析构函数不会析构没有构造好的对象,意思就是如果程序在构造对象时抛出异常,则析构函数不会析构此对象,导致资源泄漏。针对这种情况,就需要考虑在构造函数中将异常情况考虑。具体例子在more effective c++条款10.原创 2017-07-29 21:18:53 · 289 阅读 · 0 评论 -
引用作为函数与指针及值传递的差别
传引用与传指针的联系与区别:联系:传引用给函数与传指针效果是一样的,引用只是变量的一个别名。指针相当于保存了变量地址,间接操作对象。区别:1.使用引用不需要给形参分配空间,指针则需要给形参分配空间。2.在调用处,还是需要实参地址,并且在函数中国多处使用指针,也容易使人混淆,导致程序阅读性差。而引用则更容易理解。与值传递的区别:1.值传递需要为形参分配空间,引用不需要原创 2017-07-21 09:45:43 · 355 阅读 · 1 评论 -
为什么最好以引用方式捕捉异常
捕捉异常的方式有三种:值传递、引用、指针引用与值传递相比:1.值传递会复制两次,传给catch时,抛出时都会复制。引用只复制一次,效率大大提高。2.值传递会带来切割问题。当传递派生类对象给参数是基类对象的catch时,会导致切割,即派生类的派生类成员被切割,只留基类的部分。引用与指针相比:1.抛出指针时,不需要复制对象,只需复制指针,效率增加,但是,不能抛出指向局部对象的指原创 2017-07-30 12:26:12 · 518 阅读 · 0 评论 -
c++中将引用作为函数返回值需要注意的一些地方
1.不能返回局部变量的引用。局部变量是在栈里面创建的,函数调用完,就会被释放。引用所引用的地址就没有了。2.不能返回内部用new分配的内存的引用。因为new了之后,没有delete,所以,会导致内存泄漏。3.返回静态对象的引用要视情况而定。静态对象只初始化一次,如果有比较的出现,如if((a+b)==(b+c)),会导致条件一直成立。显然这并不是我们要的结果。返回引用的好处:可以实原创 2017-07-21 09:49:53 · 862 阅读 · 0 评论 -
c++中new/delete与malloc/free的区别与联系
联系:1.返回的都是指向某一空间的指针。2.都是在堆上分配空间。区别:1.new会构造对象并调用构造函数初始化对象,而malloc只是分配一段空间。2.delete会调用析构函数释放对象,而free仅仅只是释放一段空间。总结:new/delete、malloc/free不要混用。且调用new和new[] 也要相应的调用 delete与delete[]。delete默原创 2017-07-21 20:28:30 · 265 阅读 · 0 评论 -
c++幕后写的函数及运行时调用的函数
c++编译器会自动生成的函数:无参的构造,析构,拷贝构造,赋值运算符,取地址符。具体调用如下:假设有一个空类AA a;//调用无参构造A a1(a);//调用拷贝构造a1=a;//赋值运算符A *p=&a1;//取址运算符拷贝构造函数与赋值运算符的赋值规则:1.缺省拷贝构造函数或者赋值运算符对类的非静态数据成员进行“以成员为单位的”逐一拷贝(赋值)2.默认情况下原创 2017-07-18 21:59:45 · 193 阅读 · 0 评论 -
c++四种强制类型转换
类型转换格式:类型装换(数据)如:static_cast(ch);1.static_cast:最安全的转换方式。主要用于基本类型之间与具有继承关系之间的转换。2.const_cast 用于const/volatile 与非const/volatile 之间的转换。可以用来去除指针变量的常量属性,也可以将一个非指针变量的指针变为指针变量。但是,无法将一个非指针的常量转换为一个变量。3原创 2017-07-22 16:40:17 · 220 阅读 · 0 评论 -
缓式评估、写时复制及引用计数的关系
缓式评估:将工作推迟到必须做时才去做。写时复制:写入的时候才将数据复制一份,即几个对象共享同一份数据,只有当其中一个对象有写入的动作时,才给该对象重新复制一份。(读是不改变数据的)写时复制采用的方法即为引用计数。写时复制是缓式评估的方法之一,而引用计数不但是写时复制的方法,也是缓式评估的方法之一。总结一下缓式评估的方法:1.引用计数。2.写时复制。3.缓式输出。4.原创 2017-08-23 11:29:23 · 221 阅读 · 0 评论