C++
文章平均质量分 65
sky_clara
这个作者很懒,什么都没留下…
展开
-
多重继承
在现实生活中,一些新事物往往会拥有两个或者两个以上事物的属性,为了解决这个问题,C++引入了多重继承的概念,C++允许为一个派生类指定多个基类,这样的继承结构被称做多重继承。 举个例子,交通工具类可以派生出汽车和船连个子类,但拥有汽车和船共同特性水陆两用汽车就必须继承来自汽车类与船类的共同属性。 由此我们不难想出如下的图例与代码:当一个派生类要使用多重继承的时候,转载 2012-07-24 10:21:03 · 566 阅读 · 0 评论 -
sizeof用法
(1)计算一个结构体的sizeof时,要注意内存对齐原则: 1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储。转载 2012-07-24 09:49:05 · 512 阅读 · 0 评论 -
构造函数与虚析构函数
1. 构造函数 因为在派生类中构造函数是不能继承的,也没有重定义的必要。在构造函数中调用虚函数将破坏动态绑定逻辑。下面的例子说明了这样动态绑定逻辑。例: #include class base { protected: int x; public: base (int m)转载 2012-07-25 17:09:56 · 611 阅读 · 0 评论 -
拷贝构造函数 赋值构造函数
copy构造函数被用来"以同型对象初始化自我对象", copyassignment 操作符被用来"从另一个同型对象中拷贝其值到自我对象" :class Widget {public:Widget(); //default构造函数Widget(const转载 2012-08-14 15:12:08 · 399 阅读 · 0 评论 -
若不想使用编译器自动生成的函数,就该明确拒绝
通常如果你不希望class 支持某一特定机能,只要不声明对应函数就是了。但这个策略对copy 构造函数和copy assignment 操作符却不起作用,如果你不声明它们,而某些人尝试调用它们,编译器会为你声明它们。 这把你逼到了一个困境。如果你不声明copy 构造函数或copy assignment 操作符,编译器可能为你产出一份,于是你的class 支持copying 。翻译 2012-08-16 17:35:52 · 633 阅读 · 0 评论 -
以对象管理资源------auto_ptr shared_ptr
例:假设我们使用一个用来塑模投资行为(例如股票、债券等等)的程序库,其中各式各样的投资类型继承自一个root class Investment::class Investment { ... }; //"投资类型"继承体系中的root class进一步假设,这个程序库系通过一个工厂函数(factory function ) 供应我们某翻译 2012-08-17 10:39:06 · 955 阅读 · 0 评论 -
const
关键字const 多才多艺。你可以用它在classes 外部修饰global 或namespace作用域中的常量,或修饰文件、函数、或区块作用域(block scope) 中被声明为static 的对象。你也可以用它修饰classes 内部的static 和non-static 成员变量。面对指针,你也可以指出指针自身、指针所指物,或两者都(或都不〉是const:char greeting翻译 2012-08-16 10:28:44 · 824 阅读 · 0 评论 -
c字符串、string对象、字符串字面值的区别
一、字符串字面值字符串字面值是一串常量字符,字符串字面值常量用双引号括起来的零个或多个字符表示,为兼容C语言,C++中所有的字符串字面值都由编译器自动在末尾添加一个空字符。字符串没有变量名字,自身表示自身"Hello World!" //simple string literal"" //empty string literal"\nCC\toptions\tfile.[c转载 2012-08-21 10:30:06 · 5083 阅读 · 3 评论 -
静态成员 内联成员函数 const对象和const成员函数
1 静态成员 static数据成员 (1) static数据成员属于类,而不属于对象; (2)static数据成员也是具有访问限制的; 在类外只能访问公有的static数据成员,且访问方式为: 类名::static公有数据成员 在类内可以访问所有的static数据成员,采用直接访问的转载 2012-07-26 10:09:49 · 1499 阅读 · 0 评论 -
运算符重载
可以被重载的操作符:+-*/%^&|~!,=>>=++-->>==!=&&||转载 2012-09-05 10:24:48 · 528 阅读 · 0 评论 -
对象使用之前初始化
读取未初始化的值会导致不明确的行为。在某些平台上,仅仅只是读取未初始化的值,就可能让你的程序终止运行。更可能的情况是读入一些"半随机"bits ,污染了正在进行读取动作的那个对象,最终导致不可测知的程序行为,以及许多令人不愉快的调试过程。 永远在使用对前先将它初始化。一、对于无任何成员的内置类型,你必须手工完成此事。例如:int x = 0;翻译 2012-08-16 15:26:04 · 839 阅读 · 0 评论 -
多重继承构造函数执行顺序
class 派生类名:继承方式1 基类名1,继承方式2 基类名2,....{ //派生类成员定义};对每个基类可以用不同的继承方式,默认继承方式为private。 在多重继承中,派生类的构造函数与单继承下派生类构造函数相似,它必须负责该派生类所有基类构造函数以及对象成员(如果有的话)构造函数的调用。同时,派生类的参数必须包含完成所有基类、对象成员以及派生类中新增数转载 2012-07-25 15:52:28 · 10472 阅读 · 0 评论 -
initialization of 'strTemp' is skipped by 'case' label解决办法
解决办法:把strTemp的定义放到Switch语句外面注:不能在select的case语句中定义变量!只有最后一个case才不会出现这种情况,且要把相关语句放在{}中。原创 2012-07-24 15:40:41 · 732 阅读 · 0 评论 -
如何将4个字节的int转为1个字节的BYTE?
int i=0x00000001;要取得最后一个字节的0x01?BYTE ret;BYTE *ptr;ptr=(BYTE*)(&i);ret=*ptr; //小端内存#####################################以下内容为转载x的高字节存放到x_high,把低字节x_lowint x=12345;原创 2012-07-25 09:12:42 · 5643 阅读 · 0 评论 -
Malloc/new和delete/free的区别
http://blog.csdn.net/hackbuteer1/article/details/6789164http://blog.csdn.net/gukesdo/article/details/7576453转载 2012-07-26 10:48:57 · 602 阅读 · 0 评论 -
什么是虚继承?虚基类?
虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。类D继承自B类和C类,而B类和C类都继承自类A,因此出现下图所示情况:A A\ / B C \ / D而类D中会出现两次A。为节省内存空间,可以将B、C对A的继承定义为虚拟继承,而A就成了虚拟基类。最后形成如下图所示情况:转载 2012-07-24 10:08:57 · 3689 阅读 · 0 评论 -
对象数组和指向对象的指针 指向类成员的指针
1 对象数组 对象数组是指数组元素为对象的数组。这种对象数组与其它数据类型的数组定义方式相同。如: X a[10]; 它创建了一个对象数组a,有10个数组元素,每个数组元素a [i]都是一个对象,所以,需要10次调用构造函数。 C++语言不允许初始化对象数组,所以要创建一个类的对象数组,这个类必须具备以下三个条件转载 2012-07-26 10:30:32 · 9430 阅读 · 0 评论 -
堆 栈 区别
堆和栈的区别一、预备知识—程序的内存分配一个由c/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态转载 2012-07-27 10:53:15 · 368 阅读 · 0 评论 -
纯虚函数及抽象类
一、 纯虚函数 纯虚函数是一个在基类中声明的虚函数,它在该基类中没有定义,要求任何派生类都必须定义自己的版本。 一般格式如下: class 类名> { virtual 类型>函数名>(参数表>)=0; … };注意: 1、 纯虚函数没有函数体; 2、 最后面的“=0”转载 2012-07-25 16:42:46 · 694 阅读 · 0 评论 -
重载与覆盖的区别,覆盖与隐藏的区别
重载与覆盖的区别1、方法的覆盖是子类和父类之间的关系,是垂直关系;方法的重载是同一个类中方法之间的关系,是水平关系。2、覆盖只能由一个方法,或只能由一对方法产生关系;方法的重载是多个方法之间的关系。3、覆盖要求参数列表相同;重载要求参数列表不同。4、覆盖关系中,调用那个方法体,是根据对象的类型(对象对应存储空间类型)来决定;重载关系,是根据调用时的实参表与形参表来选择方法体的。转载 2012-07-23 16:49:55 · 558 阅读 · 0 评论 -
explicit
class B (public:explicit B(int x = 0, bool b = true);};class C {public:explicit C (int x);};上述的classes B 和C 的构造函数都被声明为explic址,这可阻止它们被用来执行隐式类型转换(implicit type conversions) ,但它们仍可被用来进行显式转载 2012-08-14 15:25:03 · 354 阅读 · 0 评论 -
函数重载与重复声明
一个函数在一个特定的域中被多次声明时,编译器解析第二个及后面函数依照下面步骤:1.参数个数或类型不同,则认为是重载 // 重载函数 void print( const string & ); void print( vector & );2.函数返回类型和参数表完全相同,则认为第二个函数是第一个函数的重复声明 参数表的比较过程与参数名无关3.如果两个函数的参数表相同转载 2012-09-17 19:49:33 · 3476 阅读 · 0 评论