我不怕丑,先帖我的回答: 一、 布尔:if(flag)/if(!flag) 浮点 :if(0.0f == x) / if(0.0f != x) char*:if(NULL == p)/if(NULL != p) 二、 sizeof(str) = 6 sizeof(p) = 4 sizeof(n) = 4 sizeof(str) = 4 //指针参数 sizeof(p) = 4 //malloc 三、 1、避免头文件重复包含 2、<>表示先从系统安装目录查找,""表示先从当前目录查找,找不到再到系统安装目录查找 3、(1)、const char * p表示p指针指向的内存地址内容,不能通过p的引用来修改,但可以通过其他方式修改 (2)、char* const p表示p指针本身的地址内容不能被修改,但可以修改p指针指向的内存内容 4、C编译器不会对程序员定义的函数名进行专门编码,而C++则会,孙老师在讲DLL时说过“名字改编”的问题,其中一点原因是C++支持函数重载,编译后的函数名不一定就是程序员所定义的函数名。当C++企图连接一个由C编译器编译好的函数时,它将无法识别函数名。故要加extern "C" 5、第一个:执行N次循环+N次判断,如果判断条件很简单则选用它。 第二个:执行N次循环+1次判断,如果判断条件很复杂则选用它。 四、 1、GetMemory用p复制字符串指针并申请堆内存(此时str并未申请到内存),函数返回后p被销毁但内存仍然未被释放,该内存属于被泄露的匿名内存。结果:内存报错。 2、GetMemory函数内部申请了栈内存保存了字符串"Hello world.",返回后字符串资源被回收,str指向了无效内存。结果:应该是乱码。 3、是调用函数申请内存正确的方法,用指针的指针申请内存保证了调用者能得到内存资源,结果:"hello"正常显示,但显示后未free掉堆内存,Test函数返回后str指针被销毁,造成泄露。 4、头3行代码等于什么也没干,相当于仅仅声明了char *str; 后面的代码孙老师在“指向常量的指针”课程中有讲过。if语句内部相当于 str = "world"; 将常量字符串赋给了str。结果:显示“world”。(C++的书中没提到字符串池的概念,我这里把"world"理解为JAVA中的字符串池,因为给任何一个字符串指针赋值为"world",其指针地址是一样的)。 五、 1、 char k = strSrc[0]; while('0' != k) { strDest[k] = strSrc[k]; k++; } 2、不知道 六、 1、构造函数: String::String(const char* str = NULL) { if(NULL != str) { m_data = new char[strlen(str)+1]; strcpy(m_data, str); } else { m_data = new char[6]; strcpy(m_data, "Hello"); m_data[5] = '\0'; } } 2、拷贝构造函数: String::String(const String& other) { int len = strlen(other.m_data); this->m_data = new char[len+1]; strcpy(m_data, other.m_data); } 3、析构函数: String::~String() { delete []m_data; } 4、重载运算符 String& String::operator = (const String& other) { delete []m_data; int len = strlen(other.m_data); this->m_data = new char[len+1]; strcpy(m_data, other.m_data); return *this; }
[此贴子已经被作者于2005-3-23 14:05:07编辑过] |