
C/C++
leatinfy
Write programs that do one thing and do it well
展开
-
关于C++的多重继承
今天看设计模式时,书中谈到类继承的用法,就想到在C++中出现这样一种情况,如果两个基类有同一个名字的方法,当一个类同时继承这个两类时该如何调用呢?,举书上的例子来说: class Task{ // ... virtual debug_info * get_debug (); }; class Displayed{ // ... virtual debug_info * get_原创 2007-07-16 15:20:00 · 619 阅读 · 0 评论 -
数组循环移位算法
问题:把一个含有N个元素的数组循环右移K位。例:数组为123456,循环右移3位后为:456123。分析:问题为数组循环移位,在实现时如果按数组元素一个一个的移动,时间复杂度O(n*k)。将移位前后的数组对比可以看出,数组循环右移K位相当于将数组最后K个元素与前n-k个元素整体对调位置。在例子中,就相当于456与123对调位置。因此我们的算法思想为:将数组分为前n-k个元素和后k个元素组成原创 2008-11-28 22:17:00 · 2729 阅读 · 1 评论 -
字符串匹配问题
问题:给定字符串“This is a string”,删除字符串中的“is”。代码:/*return the remainder string*/char * matchstr(const char * src,const char *substr){ const char * p = substr; int i = 0; int src_len = strlen(src);原创 2008-10-03 20:56:00 · 660 阅读 · 0 评论 -
空类或空结构
在C中定义空结构体,或在C++中定义空结构体/空类时,其sizeof值是多少?我们在GCC和VC6下作测试。测试步骤如下:1、测试代码1/*代码1*/struct A{};class B{};其测试结果为:CC++sizeof(struct A)sizeof(B)sizeof(struct A)原创 2008-09-19 17:50:00 · 948 阅读 · 2 评论 -
关于结构体内存的对齐方式
在C语言中,我们经常使用结构体(struct) 。对于结构体的描述,很多C语言的书中会提到结构体所占用的内存与其内的成员在结构体中的声明顺序有关,但是很少有书讲述了结构体占用的内存与结构体的成员声明顺序如何相关的(即结构体在内存中的对齐方式是怎么样的)。 首先我们来看以下代码的输出结果:#includestdio.h>#pragma pack(2)struct原创 2007-09-01 21:41:00 · 1086 阅读 · 1 评论 -
C++中的多态与数组
在C++中你可以通过基类指针或引用来操作派生类(注:这里说的是基类指针)。在More Effective C++中举了这样一个例子: class BST { ... }; class BalancedBST: public BST { ... }; void printBSTArray(ostream& s,const BST array原创 2007-08-12 19:37:00 · 1345 阅读 · 0 评论 -
C++ 关键字
C++关键字 and and_eq asm auto bitand bitor bool break case原创 2007-07-18 22:23:00 · 959 阅读 · 0 评论 -
c++类型转换
在传统的C类型转换时是以(type)expression型式进行转换,这种转换缺少对转换的两种类型之间的信息检测。因此在c++中引入了static_cast,const_cast, dynamic_cast, 和reinterpret_cast四种类型转换操作符。 static_cast在功能上基本上与C风格的类型转换一样强大,是静态类型转换,但没有运行时类型检查来保证原创 2007-07-18 23:03:00 · 1049 阅读 · 0 评论 -
决不要重新定义继承而来的缺省参数值
虚函数是动态绑定而缺省参数值是静态绑定的,因此决不要重新定义继承而来的缺省参数值。 代码 #include using namespace std;原创 2007-07-16 16:27:00 · 631 阅读 · 0 评论 -
C语言中的指针与数组
在C语言中可以有这样的定义:char (*p)[13],该语句定义的是一个变量p,而不是一个数组。 如下的代码 ================ char (*p)[13]; char m[13]; char mm[2][13]; p = mm; //OK p= &m; //OK p = m; //error ================= 从上面的代码中可以看出,p是一个原创 2007-07-16 16:13:00 · 730 阅读 · 0 评论 -
C++类成员的初始化顺序
注意:类成员初始化的顺序跟成员在类内声明的顺序一致。如果使用多继承,基类被初始化的顺序和它们被派生类继承的顺序一致。类成员初化在构造函数成员初始化列表中的顺序会被忽略。 我们用一个例子来说明。如下: #include using namespace std; class A{ public: A() { cout } }; class B{原创 2007-07-16 16:04:00 · 1496 阅读 · 0 评论 -
实现=操作符时判断自己给自己赋值
// 忽略了给自己赋值的情况 // 的赋值运算符 string& string::operator=(const string& rhs) { delete [] data; // delete old memory // 分配新内存,将rhs的值拷贝给它 data = new char[strlen(rhs.data) + 1]; strcpy(data,原创 2007-07-16 15:48:00 · 964 阅读 · 0 评论 -
重载"="号时请注意要把基类的成员也拷贝
因为x是base的私有成员。所以必须在derived的赋值运算符里显式地对derived的base部分赋值。 也就是这么做: // 正确的赋值运算符 derived& derived::operator=(const derived& rhs) { if (this == &rhs) return *this; base::operator=(rhs); //原创 2007-07-16 15:38:00 · 674 阅读 · 0 评论 -
C++拷贝构造函数
只要类里有指针时,就要写自己版本的拷贝构造函数和赋值操作符函数。在这些函数里,你可以拷贝那些被指向的数据结构,从而使每个对象都有自 己的拷贝;或者你可以采用某种引用计数机制去跟踪当前有多少个对象指向某个数据结构。 这样做的目的是为了防止=运算符 和传值调用函数时调用系统默认的拷贝构造函数,使得两个指针指向同一个单元,两次释放出错。 注意:拷贝构造函数的参数必须是引用,否则会出现拷原创 2007-07-16 15:32:00 · 598 阅读 · 0 评论 -
C++中new操作new操作的解释
我们常用new操作的形式如:string *ps = new string("Memory Management"); 它生成的代码类似于下面的代码: void *memory = operator new(sizeof(string)); // 得到未经处理的内存 call string::string("Memory Management") //初始化 on *原创 2007-07-16 15:28:00 · 962 阅读 · 0 评论 -
C++构造函数调用构造函数问题
昨天写JAVA程序时用到了在一个构造函数里调用另一个构造函数的方法。在JAVA里的使用方法是:this(参数...)。当时脑子里冒出一个问题:在C++里构造函数如何调用另构造函数?因此本人写了如下一段程序来看测试:#includeiostream>using namespace std;class A...{ public: int a; publ原创 2008-03-17 17:00:00 · 10422 阅读 · 6 评论