二叉树不是树 因为它是有序的 二叉树如果只有一个孩子,它要确定是左孩子或右孩子,而度数为二的有序树虽然很象二叉树,但是当结点只有一个孩子时,就无须区分它是左还是右的次序。因此二者是不同的。<textarea cols="50" rows="15" name="code" class="cpp">以下三条输出语句分别输出什么?[C易] char str1[] = "abc"; char str2[] = "abc"; const char str3[] = "abc"; const char str4[] = "abc"; const char* str5 = "abc"; const char* str6 = "abc"; cout << boolalpha << ( str1==str2 ) << endl; // 输出什么? cout << boolalpha << ( str3==str4 ) << endl; // 输出什么? cout << boolalpha << ( str5==str6 ) << endl; // 输出什么? 答:分别输出false,false,true。str1和str2都是字符数组,每个都有其自己的存储区,它们的值则是各存储区首地址,不等;str3和str4同上,只是按const语义,它们所指向的数据区不能修改。str5和str6并非数组而是字符指针,并不分配存储区,其后的“abc”以常量形式存于静态数据区,而它们自己仅是指向该区首地址的指针,相等。 47. 以下代码有什么问题?[C++易] cout << (true?1:"1") << endl; 答:三元表达式“?:”问号后面的两个操作数必须为同一类型。 48. 以下代码中的输出语句输出0吗,为什么?[C++易] struct CLS { int m_i; CLS( int i ) : m_i(i) {} CLS() { CLS(0); } }; CLS obj; cout << obj.m_i << endl; 答:不能。在默认构造函数内部再调用带参的构造函数属用户行为而非编译器行为,亦即仅执行函数调用,而不会执行其后的初始化表达式。只有在生成对象时,初始化表达式才会随相应的构造函数一起调用。 49. C++中的空类,默认产生哪些类成员函数?[C++易] 答: class Empty { public: Empty(); // 缺省构造函数 Empty( const Empty& ); // 拷贝构造函数 ~Empty(); // 析构函数 Empty& operator=( const Empty& ); // 赋值运算符 Empty* operator&(); // 取址运算符 const Empty* operator&() const; // 取址运算符 const }; 1. 不要对浮点数使用该运算符,那将是无效的。 2. 如果第一个操作数为负数,那么得到的模也为负数;如果第一个操作数为正数,那么得到的模也为正数。 3. 取模公式:a % b == a - (a/b) * b 写一个函数,完成内存之间的拷贝 先来看看微软的实现: void * __cdecl memcpy ( void * dst, const void * src, size_t count ) { void * ret = dst; #if defined (_M_IA64) { extern void RtlMoveMemory( void *, const void *, size_t count ); RtlMoveMemory( dst, src, count ); } #else /* defined (_M_IA64) */ /* * copy from lower addresses to higher addresses */ while (count--) { *(char *)dst = *(char *)src; dst = (char *)dst + 1; src = (char *)src + 1; } #endif /* defined (_M_IA64) */ return(ret); } 再来看看coreutils中的实现: void * memcpy (void *destaddr, void const *srcaddr, size_t len) { char *dest = destaddr; char const *src = srcaddr; while (len-- > 0) *dest++ = *src++; return destaddr; } 再来看Linux中实现: void *memcpy(void *dest, const void *src, size_t count) { char *tmp = dest; const char *s = src; while (count--) *tmp++ = *s++; return dest; } 子类的拷贝构造函数要调用父类的拷贝构造函数 子类的重载赋值运算符要调用父类的重载赋值运算符#include <iostream> #include <string> using namespace std; /* 子类的拷贝构造函数要调用父类的拷贝构造函数 子类的重载赋值运算符要调用父类的重载赋值运算符 */ class Parent { public: Parent(){} Parent(int a):m_a(a) { p = new int[m_a]; } //拷贝构造函数 Parent(const Parent &oth) { m_a = oth.m_a; p = new int[m_a]; memcpy(p, oth.p, sizeof(p)); } //重载赋值运算符 Parent &operator = (const Parent& oth) { if (this == &oth) { return *this; } m_a = oth.m_a; delete []p; p = new int[m_a]; memcpy(p, oth.p, sizeof(p)); } virtual ~Parent() { delete []p; } private: int m_a; int *p; }; class Child : public Parent { public: Child(){} Child(int a, string str):Parent(a),m_str(str){} //拷贝构造函数 Child(const Child &oth):Parent(oth),m_str(oth.m_str)//调用父类的拷贝构造函数 {} //重载赋值运算符 Child &operator = (const Child &oth) { Parent::operator =(oth);//调用父类的重载赋值运算符 m_str = oth.m_str; } ~Child(){} private: string m_str; }; int main() { Parent parent(10); Child child(2,"wangyang"); }